Я использую SET в cmd для установки новой переменной среды и сразу же использую ее для сравнения. Пользователю предлагается ввести строку, а затем он должен проверить, соответствует ли ввод другой строке (в основном паролю).
set /P pwd=pwd: & if %pwd%==pwd (echo yes) else (echo no)
У меня проблема в том, что кажется, что переменная не установлена, потому что независимо от того, ввожу ли я пароль или нет, он всегда возвращает мне No.
Я также пытался разделить обе команды в файле .bat, но это тоже не сработало.
Для использования в CMD: cmd /v:on /c set /p pwd=pwd: ^&^& if !pwd!==pwd (echo yes) else (echo no)
. 1 строка использует cmd /v:on
для выполнения cmd
с включенным отложенным расширением, а после /c
идет командная строка для выполнения cmd
. &
экранируются с помощью ^
, поэтому они не используются текущим процессом, а новым экземпляром cmd
.
Ваш код не работает, потому что он в одной строке. См. set /?
, setlocal /?
, for /?
и cmd /?
, чтобы увидеть обсуждение отложенного расширения.
CMD обрабатывает пакетные файлы построчно и заполняет все %var%
, когда читает строку. Именно так работали MSDos, и CMD должна быть совместима. Отложенное расширение: переменные раскрываются, когда они используются, а не при чтении. Так как !var!
является допустимым именем MSDos (как в %!var!%
), вы должен соглашаетесь на новое поведение (во всяком случае, новое в 1993 году).
@Hamperfait Вы читали cmd /?
, там это объясняется. Delayed expansion the variables are expanded when they are used not when read
Почему на одной линии должен быть важен в пакетном файле? Вы можете нажать Enter вместо &
(ps используйте &&
в будущем).
Чтобы использовать переменную в той же (логической) строке, вам нужно замедленное расширение
@noodles Дело в том, что я пытаюсь уменьшить количество материала, который мне приходится записывать на диск, и предпочел бы не использовать пакетные файлы, хотя они работают. Поэтому было бы лучше запускать команду одной строкой, а если не работает, то это пакет.
Вы больше не записываете на диск. cmd /v:on /c "set /P pwd=pwd:&if !pwd!==pwd (echo yes) else (echo no)"
. Похоже, вы программируете вуду.
Почему бы вам не использовать несколько строк, тогда это работает. Кстати. Вы должны заключить свою переменную в
IF
IF "%pwd%"= = "pwd"
, чтобы избежать синтаксических ошибок, когда%pwd%
пусто