Windows cmd: escape-команды для запуска cmd из пакетного файла, выполнение команд, которые добавляются в PATH

Windows cmd: escape-команды для запуска cmd из пакетного файла, выполнение команд, которые добавляются в PATH

Мне бы хотелось, чтобы командная строка cmd сопоставляла сетевой каталог с локальным путем, а затем добавляла этот локальный путь к (локальной) переменной PATH.

Я подготовил такой .bat-скрипт, который работает так, как и ожидалось:

pushd \\NetworkPath\Users\myname\Downloads
chdir
SET CurrentDir="%~dp0"
SET var=%cd% & SET CDIR=`chdir`
for /f "usebackq" %%x in (`chdir`) do set bvar=%%x
SET PATH=%PATH%;%bvar%
@echo IT IS: %CurrentDir%, %var%, %CDIR%, %bvar% ;;; %PATH% ---  %CD%

По сути, это скрипт, который я хотел бы запустить в начале нового cmd.exeпри запуске .batфайла. Проблема в том, что когда сетевой путь "монтируется" (например, когда pushdвызывается), он всегда получает новую и другую букву локального диска (X:, Y:, Z: ...), поэтому мне нужно определить, что является эквивалентом этого пути локального диска (например, через chdir), прежде чем я смогу добавить его в PATH для этого сеанса; и также я озадачен, почему SET PATH=%PATH%;%bvar%всегда удваивает точку с запятой ;перед присоединенной частью, когда конечная конкатенация PATHed echo.

Я узнал, что знак процента %экранируется путем его удвоения ( %%); что амперсанд &является разделителем для объединения нескольких строк кода в одну строку, которая экранируется с помощью символа вставки ^, но я все еще озадачен, поскольку двойные кавычки, "похоже, оказываются дословно в переменных через SET или вне его echo; кроме того, forкоманда, похоже, всегда выполняется (и я не могу экранировать ее с помощью символа вставки) - даже если она является частью оператора переменной SET.

Итак, в конечном итоге, я не могу преобразовать этот скрипт в однострочный, поэтому я могу использовать его как аргумент для start.exeкоманд запуска; обратите внимание, что я не хотел бы иметь два пакетных файла, я хотел бы иметь только один. Я хотел бы сначала сохранить этот скрипт в переменной, чтобы я мог вывести его для отладки — и вот чего я достиг:

SET TCMD="" pushd \\NetworkPath\Users\myname\Downloads ^& chdir ^& SET CurrentDir="%%~dp0" ^& SET var=^%%cd^%% ^& SET CDIR=^(`chdir`) ^& SET PATH=%%PATH%%;%%CD%% ^& echo %%CurrentDir%%, %%var%%, %%CDIR%%, %%bvar%% ;;; %%PATH%% ---  %%CD%% ""
echo %TCMD%
start cmd.exe /k "%TCMD%"

Проблема - новый cmd.exe запускается с:

'""' is not recognized as an internal or external command,
operable program or batch file.

Затем, %CD%относится кпредыдущийкаталог (из которого был запущен .bat-скрипт), а не в новый.

Ни одна из этих команд не извлекает новое имя диска/пути при запуске таким образом, за исключением, возможно for /f "usebackq" %%x in (`chdir`), , который я не могу точно зафиксировать (я могу видеть его вывод), и, похоже, он не совсем последователен (иногда кажется, что он пуст).

Как мне экранировать мой первый скрипт, чтобы он мог служить однострочным аргументом startмоего второго скрипта, и я смогу запустить cmd.exeтерминал, как задумано?

Использованная литература:

решение1

Ты слишком много об этом думаешь. Ты, похоже, не видишь леса за деревьями ;-)

Во-первых, "%~dp0"указывает местоположение вашего текущего исполняемого скрипта,неттекущий каталог.

Во-вторых, вы уже используете %CD%для вывода текущего каталога в конце - почему бы не использовать это при расширении PATH!?

@echo off
pushd "\\NetworkPath\Users\myname\Downloads"
path %path%;"%cd%"

Связанный контент