Windows cmd:轉義指令從批次檔啟動 cmd,執行加入到 PATH 的指令

Windows cmd:轉義指令從批次檔啟動 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本質上,這是我運行文件時想要在 new 開始時運行的腳本.bat。問題是,當「安裝」網路路徑時(例如,當pushd呼叫時),它總是會獲得一個新的不同的本機磁碟機號碼(X:,Y:,Z:...),所以我必須檢測這是什麼本機磁碟機路徑等效是(例如通過chdir),然後我可以將其新增至該會話的 PATH 中;而且,我很困惑為什麼當最後的連接是ed時,為什麼總是在附加部分之前SET PATH=%PATH%;%bvar%加倍分號。;PATHecho

我了解到百分號%可以用加倍來轉義 ( %%); & 符號&是將多行程式碼連接成一行的分隔符,該行用插入符號轉義^,但我仍然感到困惑,因為雙引號"似乎最終透過 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 腳本從中啟動的目錄),而不是新目錄。

像這樣運行時,這些都不會檢索新的驅動器/路徑名稱 - 除了 Maybe for /f "usebackq" %%x in (`chdir`),我無法真正捕獲它(我可以看到它的輸出),並且似乎也不是那麼一致(有時它似乎報告為空)。

如何讓我的第一個腳本轉義,以便它可以作為我的第二個腳本的參數中的一行start,以便我可以cmd.exe按預期啟動終端?

參考:

答案1

你想太多了。你似乎只見樹木不見森林;-)

首先,"%~dp0"給出目前執行腳本的位置,不是目前目錄。

其次,您已經%CD%在最後使用列印出當前目錄 - 為什麼在擴展 PATH 時不使用它!

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

相關內容