我有一个传递通配文件名的批处理文件:
mybat.bat foo\bar\*.stuff
我怎样才能获得
“*.stuff
”
变成一个变量?
我知道怎么做
set the_path=%~p1
set the_file=%~n1
但这导致the_file是匹配的文件之一,而不是字符串通配符规范。
答案 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 包含通配符,它们将保持不变。