Проверьте переменную окружения COMSPEC
на машине, где она не работает, т.е. выполните echo %COMSPEC%
и посмотрите, что в ней содержится (она должна быть %windir%\system32\cmd.exe
или сопоставимой).
Long Story:
Ваш подробный вопрос исключил все другие потенциальные возможности (например, необходимость использовать %%X
вместо %X
внутри командных файлов по сравнению с командной строкой),как возиться с setlocal enableextensions
(или аналогичными переключателями, записями реестра и т. д.).И, между прочим, сообщение об ошибке не подходит.
Если вы получаете сообщение об ошибке «... не распознается как внутренняя или внешняя команда», значит, CMD.EXE не может найти команду, которую выПытаешься казнить.Поскольку «dir» - это внутренняя команда, «этого никогда не должно происходить», конечно.
Я смог воспроизвести вашу ошибку, выполнив следующее:
- Старт
CMD.EXE
- Введите следующий
SET ComSpec=DoesNotExist
- Введите следующий
CMD.EXE
, т.е. начните другой, вложенный, CMD.EXE
сеанс.Этот шаг необходим, в текущем сеансе CMD.EXE
изменение на ComSpec
кажется незамеченным. - В новом сеансе
CMD.EXE
введите свою команду (например, for /F %x in ('dir /b') do @echo%x
), вы должны получитьошибка, которую вы видите.Обратите внимание, что если вы просто введете dir
, он все равно будет работать, поэтому вы должны выполнить это «косвенное» выполнение, например, через цикл for
.Забавно.
Обратите внимание, что все это было сделано, чтобы воспроизвести то, что вы видите, причины, по которым условия среды или настройки, которые приводят к такому поведению в вашей системе, могут быть другими, однако тот факт, что ComSpec
переменная окружения ссылается на что-то отличное от CMD.EXE
должно быть таким же.