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терминал, как предполагалось?
Какова цель? Вы открываете окно, чтобы открыть новое, это ваша цель? Если это так, просто создайте пакет, открыв другой командой 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%"