Командная строка FOR / F Fails - PullRequest
2 голосов
/ 12 марта 2012

У меня есть сценарий сборки DOS, который работает на одном Windows Server 2008 R2, но не на другом. Чтобы увидеть признаки неисправной машины, введите одно из следующих значений в командной строке:

for /f %X in ('dir /b *.txt') do @echo %X
for /f "usebackq" %X in (`dir /b *.txt`) do @echo %X

дает: «'dir / b * .txt' не распознается как внутренняя или внешняя команда». в то время как, например,

for %X in (*.txt) do @echo %X

работает нормально, поэтому / f не соблюдается должным образом. Я не верю, что это сами командные расширения (запуск cmd / x показывает то же самое поведение; запуск их внутри cmd / y на проблемном сервере дает нормальный «/ f был неожидан в это время»). Я также проверил ключи реестра расширений команд и попробовал "setlocal enableextensions" в командных файлах.

Я не думаю, что это актуально, но различия между серверами в том, что отказавший является физическим; его процессор не имеет расширений VT; действительно ли установлен McAfee. Насколько я знаю, они были установлены одинаково, но в разное время.

У кого-нибудь есть предложения? Я застрял!

Ответы [ 2 ]

2 голосов
/ 12 марта 2012

Проверьте переменную окружения COMSPEC на машине, где она не работает, т.е. выполните echo %COMSPEC% и посмотрите, что в ней содержится (она должна быть %windir%\system32\cmd.exe или сопоставимой).

Long Story:

Ваш подробный вопрос исключил все другие потенциальные возможности (например, необходимость использовать %%X вместо %X внутри командных файлов по сравнению с командной строкой),как возиться с setlocal enableextensions (или аналогичными переключателями, записями реестра и т. д.).И, между прочим, сообщение об ошибке не подходит.

Если вы получаете сообщение об ошибке «... не распознается как внутренняя или внешняя команда», значит, CMD.EXE не может найти команду, которую выПытаешься казнить.Поскольку «dir» - это внутренняя команда, «этого никогда не должно происходить», конечно.

Я смог воспроизвести вашу ошибку, выполнив следующее:

  1. Старт CMD.EXE
  2. Введите следующий SET ComSpec=DoesNotExist
  3. Введите следующий CMD.EXE, т.е. начните другой, вложенный, CMD.EXE сеанс.Этот шаг необходим, в текущем сеансе CMD.EXE изменение на ComSpec кажется незамеченным.
  4. В новом сеансе CMD.EXE введите свою команду (например, for /F %x in ('dir /b') do @echo%x), вы должны получитьошибка, которую вы видите.Обратите внимание, что если вы просто введете dir, он все равно будет работать, поэтому вы должны выполнить это «косвенное» выполнение, например, через цикл for.Забавно.

Обратите внимание, что все это было сделано, чтобы воспроизвести то, что вы видите, причины, по которым условия среды или настройки, которые приводят к такому поведению в вашей системе, могут быть другими, однако тот факт, что ComSpec переменная окружения ссылается на что-то отличное от CMD.EXE должно быть таким же.

1 голос
/ 12 марта 2012

В пакетном файле вы должны использовать двойной процент, т.е. %% X.В командной строке один процент в порядке.

Что касается того, почему он работает на одной машине, не уверен, возможно, его каким-то образом запускают через 16-битную DOS на машине, которая работает?Или это был другой тест, который, похоже, работал без подмены переменных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...