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