2

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

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

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

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

Echo cd c:\Users\myname\Documents

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

1 ответ1

2

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

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

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

У связанной с этим проблемы 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]
=============================

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .