1

Моя установка Windows DOS, кажется, повреждена способами, которые я не понимаю:

Переменная среды CD работает только при запуске cmd с параметром /C или /K , в то время как если я использую пакет (что является моей целью) или стандартную страницу cmd, это не работает.

В дополнение к этому, у меня также есть проблема с командой start : даже если мой путь правильный и файл есть, всякий раз, когда я использую параметр /max или /wait результат - program.exe не найден, а если Я не использую никаких аргументов, которые он запускает нормально. Например, start "" /d "C:\Program_1.0\" /max /wait "Program1.0.exe" приводит к тому, что программа не найдена.

Что может вызвать эти проблемы? Я схожу с ума здесь.

@ramhound, ты говоришь о переменной PATH , я говорю о !CD! переменная MS DOS.

Как пример:

@echo off
REM : ------------------------------------------------------------------
REM : main
chcp 1252
setlocal enabledelayedexpansion

@echo CURRENTDIR=!CD!

REM : parent directory of script
pushd "%~dp0" >NUL && set "WORKINGDIR="!CD!"" && popd >NUL

@echo WORKINGDIR=!WORKINGDIR!
pause

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

@DavidPostill:

Спасибо, вы правы: при выполнении сценария из проводника Windows - или если вы запускаете командный файл в консоли, переходя к его родительской папке - сценарий DOS не меняет рабочий каталог. Но система ДОЛЖНА делать это при вызове скрипта из другого места (например, при использовании его полного пути из консоли по умолчанию в% USERPROFILE%). И это именно моя первая проблема: для меня это не так. Попробуйте сами, и вы получите CURRENTDIR =% USERPROFILE%, WORKINGDIR = parent_folder пакетного файла. И при вызове из% USERPROFILE% с помощью cmd /C вместо непосредственно командного файла это работает. Похоже, что отложенное расширение не работает, но я не понимаю, почему.

1 ответ1

1

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

Ваш скрипт на самом деле не меняет каталог. Таким образом, 2 значения одинаковы, что неудивительно.

Вы %~dp0 который является текущим каталогом скрипта ...

Следующий пакетный файл демонстрирует, что произойдет, если вы на самом деле смените каталог на родительский сценарий.

@echo off
setlocal enabledelayedexpansion
echo CURRENTDIR=!CD!
echo ~dp0=%~dp0%
rem save current directory, change to the parent directory, store the name of the parent directory
pushd "%~dp0" >NUL && cd .. && set "WORKINGDIR="!CD!"" && popd >NUL
echo WORKINGDIR=!WORKINGDIR!
echo CURRENTDIR=!CD!
pause
endlocal

Заметки:

  • Смена каталога действительна только между командами push и pop .
  • %WORKINGDIR% теперь отличается из-за предыдущего cd .. который изменяет текущий каталог.
  • CURRENTDIR не изменяется, потому что он используется вне соединения push/pop pairing and the current directory is restored by popd`

Выход:

> test
CURRENTDIR=F:\test
~dp0=F:\test\
WORKINGDIR="F:\"
CURRENTDIR=F:\test
Press any key to continue . . .

Дальнейшее чтение

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