如何将ARBITRARY字符串回显到批处理文件?

时间:2011-08-29 03:14:14

标签: windows batch-file

我有一个批处理文件,(简化后)看起来像这样:

@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支持。)

2 个答案:

答案 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