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

911
sdaau

Я хотел бы получить командную строку 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%всегда удваивает точку с запятой ;перед приложенным части, когда окончательными сцепляются PATHв 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терминал, как предполагалось?

Рекомендации:

0
Какова цель? Вы открываете окно, чтобы открыть новое, это ваша цель? Если это так, просто создайте пакет, открыв другой командой start Paul 8 лет назад 0

1 ответ на вопрос

1
dbenham

You are way over thinking this. You can't seem to see the forest for the trees ;-)

First off, "%~dp0" gives the location of your currently executing script, not the current directory.

Secondly, you are already using %CD% to print out the current directory at the end - why not use it when you extend your PATH !?

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