如何将ARBITRARYstring回显到batch file?

我有一个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 

它在不同的情况下面对不同types的文件名时会引发各种错误:

  • MyProgram version 2不能被回显,因为2>>被解释不正确。
  • MyProgram (next version)不能被回显,因为括号必须被转义。
  • 由于&符号, MyProgram O&O无法被回显
  • MyProgram! 无法回应,因为! 符号

是否有解决scheme适用于所有这些情况(包括组合和嵌套等)?

(ASCII是好的 – 我现在不需要 Unicode支持。)

编辑:采取2 …

 For /D %%f In (*) Do ( Set "Text=%%~dpnxf" SetLocal EnableDelayedExpansion Echo.!Text!>>files.txt EndLocal ) 

启用延迟扩展吃惊叹号,所以我禁用它的输出阶段。 我在这里做的是复制到另一个变量,所以我可以做替换,然后用&替换^& 。 这可能不适用于所有有效的文件名,但对你的例子有效:

 :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