Как использовать пакетный файл для создания другого пакетного файла, который содержит% username%

385
Ali Demir

Я пытался создать командный файл, используя другой командный файл.
Файл, который я хочу создать, должен содержать %username%его для работы на других компьютерах.
Всякий раз, когда я пытаюсь сделать это, он вводит мое действительное имя пользователя в файл, что делает невозможным запуск на других компьютерах. Может кто-нибудь помочь мне с моей проблемой?

Вот что я написал в командном файле:

Echo cd c:\Users\%username%\Documents > x.bat 

Но когда я открываю x.bat, он говорит:

Echo cd c:\Users\myname\Documents 

Я действительно знаю, что вызывает эту проблему, но я не мог найти способ обойти это.

2
Чтобы избежать мгновенного расширения, удвойте вмещающие знаки процента в генерирующем пакете, `%% USERNAME %%` LotPings 6 лет назад 1
То же самое относится к% random%? Ali Demir 6 лет назад 0
Да, приложить аналогично `%% random %%` LotPings 6 лет назад 0
`%` является escape-символом в командном файле. Используйте `%%` вместо одного `%`. [Подробнее] (http://www.robvanderwoude.com/escapechars.php). Sandeep 6 лет назад 0
@LotPings, почему бы не расширить свой комментарий немного как * ответ *, так как это успешно решает проблему. DrMoishe Pippik 6 лет назад 1

1 ответ на вопрос

2
LotPings

Некоторые умные люди изучили внутреннюю работу cmd.exe при обработке командных файлов в этом разделе вопросов и ответов на stackoverflow.com .

Чтобы избежать этого, %он должен быть удвоен
(вышеупомянутая ссылка объясняет, что этот пакет рано отменяется парсером)

Если вы неоднократно устанавливаете и выводите переменную, содержащую a, %вам придется делать удвоение для каждого шага, чтобы задержать расширение %-> %%-> %%%%.

У связанной проблемы delayedexpansionесть два решения.

  1. Setlocal EnableDelayedExpansion и использование !вместо %.
    Это требуется, когда вы устанавливаете и используете переменную в (блок кода)
  2. Использование псевдо-вызова с командами set или echo для принудительного 2-го прохода оценки.
    (например, для косвенной ссылки на переменную)

Примеры:

:: Q:\bar\2018\06\22\SU_1333415.cmd @Echo off ( Echo cd c:\Users\%username%\Documents Echo random number %random% ) >x.bat  Echo============x.bat============= type x.bat Echo= ( Echo cd c:\Users\%%username%%\Documents Echo random number %%random%% ) >y.bat  Echo============y.bat============= type y.bat Echo= Echo ========call echo============ Set bar=6 Set foo=bar Call Echo foo = %foo%, %%foo%% = %%%foo%%% Echo= Echo =====delayed expansion !=== Setlocal EnableDelayedExpansion Set bar=6 Set foo=bar Echo foo = %foo%, !foo! = !%foo%! Echo= Echo =======(code block)========== Set "Answer=n/a" ( Set /P "Answer=Enter a number: " Echo 1. the Answer is [%Answer%] Call Echo 2. the Answer is [%%Answer%%] Echo 3. the Answer is [!Answer!] ) Echo============================== 

Образец вывода:

20:07:57 Q:\Test\2018\06\22 > SU_1333415.cmd ===========x.bat============= cd c:\Users\LotPings\Documents random number 5680  ===========y.bat============= cd c:\Users\%username%\Documents random number %random%  ========call echo============ foo = bar, bar = 6  =====delayed expansion !=== foo = bar, bar = 6  =======(code block)========== Enter a number: 11 1. the Answer is [n/a] 2. the Answer is [11] 3. the Answer is [11] =============================