Как отобразить строку ARBITRARY в командный файл? - PullRequest
2 голосов
/ 29 августа 2011

У меня был командный файл, который (при упрощении) выглядел так:

@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! не может быть отражено из-за символа !

IsЕсть ли решение, которое работает для всех таких ситуаций (включая комбинации и вложения и т. д.)?

(ASCII в порядке - мне не нужна поддержка Unicodeпрямо сейчас.)

Ответы [ 2 ]

4 голосов
/ 29 августа 2011

Редактировать: Взять 2 ...

For /D %%f In (*) Do (
    Set "Text=%%~dpnxf"
    SetLocal EnableDelayedExpansion
    Echo.!Text!>>files.txt
    EndLocal
)
0 голосов
/ 29 августа 2011

Включение отложенного расширения съедает восклицательные знаки, поэтому я отключил его для выходного каскада.Я скопировал его в другую переменную, чтобы можно было заменить, а затем заменить & на ^&.Это, вероятно, не работает для всех допустимых имен файлов, но работает для ваших примеров:

: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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...