批处理文件:从输入参数中提取文件名的通配符部分

时间:2015-08-20 13:16:50

标签: batch-file parameters

我有一个传递通配文件名的批处理文件:

mybat.bat foo\bar\*.stuff

我怎样才能获得

*.stuff

变成一个变量?

我知道怎么做

set the_path=%~p1
set the_file=%~n1

但这导致the_file是匹配的文件之一,而不是字符串通配符规范。

3 个答案:

答案 0 :(得分:3)

echo %1
set x=%~1
set x=%x:**=*%
echo %x%

字符串替换:将*<string>替换为<string>,(在您的情况下为<string> = *

答案 1 :(得分:2)

只要文件模式以*开头,this answer中提到的字符串替换就可以正常工作。

但是,以下代码从独立于*的路径中提取文件名;相反,它会在循环中将字符串左侧的所有内容从\剥离,直到不再遇到\为止。
当在驱动器的当前目录中指定文件时,有第二个循环处理特殊情况,例如D:test_???.log

set "file=%~1"
:LOOP1
if not "%file%"=="%file:*\=%" set "file=%file:*\=%" & goto :LOOP1
:LOOP2
if not "%file%"=="%file:*:=%" set "file=%file:*:=%" & goto :LOOP2
echo "%file%"

答案 2 :(得分:0)

为工作使用正确的工具。这是正则表达式的工作!

FOR /F "tokens=*" %%F IN ('POWERSHELL -command "'%~1' -Replace '([A-Z]:)?(.*\\)*', ''"') DO ECHO The path is %~dp1 and the filename is %%F

此命令中使用的正则表达式匹配可选的驱动器号和冒号,后跟零个或多个以“”结尾的字符串。最后一个“”之后的所有内容都是我们想要保留的部分。 PowerShell“-Replace”参数用空字符串替换匹配的字符串(驱动器和路径),只留下文件名.扩展名。如果 filename.extension 包含通配符,它​​们将保持不变。