Пакетный файл удаляет один символ% при повторном отображении в текстовый файл

#batch-file

#пакетный файл

Вопрос:

Я пытаюсь заставить пакетный файл записать команду

 for /L %%f in (10,-1,0) do MD Items%%f 
 

в другой пакетный файл, но в этом новом пакетном файле команда изменяется на

    for /L %f in (10,-1,0) do MD Items%f 
 

и вам нужны два символа% при использовании For команды в пакетном файле

вот что такое скрипт

 echo %userprofile%desktop > "Folder Generator1.bat"

echo for /L %%f in (10,-1,0) do MD Items%%f >> "Folder Generator1.bat"
 

как мне сделать так, чтобы команда echo не изменяла какой-либо код

Комментарии:

1. Вы пробовали добавлять больше % , чтобы вместо этого они использовались cmd и сохраняли те, которые вы намеревались? :)

2. %userprofiledesktop% с пробелом или без него недопустимая команда для Folder Generator1.bat запуска!

3. да, я пытался использовать 3-5 символов%, но он был изменен на 1

4. большое спасибо, что использование more сработало

Ответ №1:

Чтобы написать литерал % , вы должны экранировать его другим % . Это касается не только for метапеременных, но и «обычных» переменных. Чтобы буквально записать %% , вам нужно экранировать каждый из них другим % (и в итоге %%%% ):

 echo cd /d "%%userprofile%%desktop" > "Folder Generator1.bat"
echo for /L %%%%f in (10,-1,0) do MD Items%%%%f >> "Folder Generator1.bat"
 

Имейте в виду, есть и другие «ядовитые символы» ( <>|amp; ), которые должны быть экранированы с помощью курсора ^ ( % это единственное исключение):

 echo echo Hello ^| find "ll" >> second.bat
echo echo hello ^amp; echo world >> second.bat
echo echo hello ^>^> file.txt >> second.bat
 

В зависимости от контекста приходится экранировать еще больше символов, ),";=^ а иногда даже пробелы.

(и чтобы сделать это не слишком простым, findstr вводит свои собственные символы escape и poison)

Предложение: вы пишете дополнительный пробел в конце каждой строки. Чтобы избежать этого_

  >file.txt echo no trailing space here.
 

(вы также можете написать `echo something>file.txt , но это когда-нибудь вас укусит — всякий раз, когда строка для перенаправления заканчивается одной цифрой, так что не делайте это привычкой)

Предложение: если вы хотите записать несколько строк в один и тот же файл, используйте `

 (
  echo @echo off
  echo echo username=%%username%%
  echo echo (attention with parentheses^)
) > second.bat
 

Внимание: ) необходимо экранировать, иначе он закроет блок кода слишком рано (я упоминал, что экранирование зависит от контекста).

Комментарии:

1. @everybody: не стесняйтесь расширять списки, если я забыл некоторые символы poison (совершенно уверен, что я это сделал)

2. Вам нужно было бы избежать самих кареток Stephan, но правила для этого могут быть недостаточно простыми, чтобы просто добавить их в свой ответ. Кроме того, как вы можете видеть в моем ответе, использование вложенных круглых скобок означает, что внутренние тоже требуют экранирования. (извините, вы добавили это в качестве более поздней правки)

3. @Compo: да, курсор … конечно. Я думаю, он подходит как «контекстно-зависимый»

Ответ №2:

Учитывая мой комментарий под самим вашим вопросом, я бы предположил, что вы искали что-то более похожее на это:

 @(  Echo @Echo %%UserProfile%%Desktop
    Echo @For /L %%%%G In (10 -1 0^) Do @MD Items%%%%G
) 1> "Folder Generator1.bat"
 

Или:

 @(  Echo @CD /D "%%UserProfile%%Desktop" 2^> NUL ^|^| Exit /B
    Echo @For /L %%%%G In (10 -1 0^) Do @MD Items%%%%G
) 1> "Folder Generator1.bat"
 

Или, возможно, даже:

 @(Echo @For /L %%%%G In (10 -1 0^) Do @MD "%%UserProfile%%DesktopItems%%%%G") 1> "Folder Generator1.bat"
 

Как вы можете видеть в приведенных выше примерах, поскольку он вложен в блок, заключенный в круглые скобки, вам также необходимо экранировать внутренние закрывающие круглые скобки каретками (которые находятся где-то за пределами списка Стефана).