我有一个批处理文件,(简化后)看起来像这样:
@Echo Off
SetLocal EnableDelayedExpansion
MD "MyProgram^!"
MD "MyProgram version 2"
MD "MyProgram (next version)"
MD "MyProgram O&O"
Del Folders.txt
Call :AddFoldersRecursive .
EndLocal
Goto :EOF
:AddFoldersRecursive FolderPath
Echo %~1>>Folders.txt
For /D %%f In ("%~1\*") Do Call :AddFoldersRecursive "%%~f"
Goto :EOF
在不同情况下面对不同类型的文件名时会出现各种错误:
MyProgram version 2
无法回显,因为2>>
被错误解释。MyProgram (next version)
无法回显,因为括号必须^
转义。MyProgram O&O
符号,&
无法回显
由于MyProgram!
符号!
无法回显
是否有适用于所有此类情况(包括组合和嵌套等)的解决方案?
(ASCII很好 - 我现在不需要需要 Unicode支持。)
答案 0 :(得分:4)
编辑:2 ...
For /D %%f In (*) Do (
Set "Text=%%~dpnxf"
SetLocal EnableDelayedExpansion
Echo.!Text!>>files.txt
EndLocal
)
答案 1 :(得分:0)
启用延迟扩展会触发感叹号,因此我在输出阶段禁用了它。我在这里做的是将其复制到另一个变量,以便我可以替换,然后用&
替换^&
。这可能不适用于所有有效的文件名,但适用于您的示例:
:AddFoldersRecursive FolderPath
SetLocal DisableDelayedExpansion
set "x=%~1"
Set "x=%x:&=^&%"
>>Folders.txt Echo %x%
For /D %%f In ("%~1\*") Do Call :AddFoldersRecursive "%%~f"
EndLocal
Goto :EOF