批次處理:如何將資料作為參數轉送到新的 CMD 實例

批次處理:如何將資料作為參數轉送到新的 CMD 實例

我希望呼叫另一個 CMD 實例並將資料從父實例傳遞給它。

我知道使用變數的一般途徑,但在這種情況下這是不可行的,因為 endlocal 和橋接會帶來太多不便(必須中繼數十個變數)。我還知道我可以使用臨時文件輕鬆移植我想要的所有數據,但這會留下不需要的足跡。編輯:setx 也可以非常成功地使用。

我在看具體來說對於一些常見的參數用法,例如:

test.bat -setvar"variable"="value" -setvar...

我之前確實找到了一種有其局限性的方法

在其他線程上發現我可以在 start cmd 的末尾添加命令

start cmd /c call "test.bat" ^& PAUSE

當然我們可以逆轉這個

start cmd /c call PAUSE ^& TIMEOUT 5 ^& PAUSE ^& test.bat

這些命令不能有“”,而且我懷疑還有任何特殊字元。當嘗試移植複雜變數時,這會帶來一個問題。

說到特殊字元:

start cmd /c call (PAUSE) ^& (TIMEOUT 5) ^& (REM !"#¤%&/=?`´^*"-.,_:;\*~¨) ^& test.bat

這根本行不通。我也許能夠逃避解釋,但對於某些變量,我可能無法了解足夠的值來將其處理成我可以處理的任何內容。 -- 實際上似乎不能容忍括號。

我需要做的主要事情之一是傳遞磁碟區名稱,這很容易實現,但這還不夠。

start cmd /c call echo \\?\Volume{6537febd-01bc-11d6-adb5-806e6f6e6963}\ ^& TIMEOUT 5 ^& PAUSE ^& test.bat

這可能已經在其他地方涵蓋了,如果是這樣,問題是我沒有找到正確的關鍵字或與相關線程的相似之處。

答案1

cmd實例繼承來自父級環境變數的所有環境變數。證明:讓我們建立兩個批次腳本:

測試1.bat

@setlocal
@set _batch
@set "_batchParentName=%~nx0"
@set "_batchParentPath=%~dp0"
@set "_batchParentSpec=< LSS > GTR & amper | pipe"
start "%~n0" cmd /C call "test.bat" "%_batchParentSpec%" %* ^& pause
@set _batch

測試.bat

@setlocal
@set _batch
@echo %~n0: %%* = %*

cmd實例輸出:

d:\bat>test1.bat first "1<2" third
Environment variable _batch not defined

d:\bat>start "test1" cmd /C call "test.bat" "< LSS > GTR & amper | pipe" first "1<2" third
 & pause
_batchParentName=test1.bat
_batchParentPath=D:\bat\
_batchParentSpec=< LSS > GTR & amper | pipe

d:\bat>

cmd實例輸出test.bat

_batchParentName=test1.bat
_batchParentPath=D:\bat\
_batchParentSpec=< LSS > GTR & amper | pipe
test: %* = "< LSS > GTR & amper | pipe" first "1<2" third
Press any key to continue . . .

注意右start命令語法"title"

START "title" [/D path] [options] "command" [parameters]

始終包含標題,這可以是一個簡單的字串,例如“我的腳本”,也可以只是一對空引號“”。根據 Microsoft 文檔,標題是可選的,但根據所選的其他選項,如果省略標題,可能會遇到問題。

確保start命令才不是包含/I選項開關(來自start /?):

 /I      The new environment will be the original environment passed
         to the cmd.exe and not the current environment.

為了消除子環境變更的另一種可能性,請包含以下/D切換:cmd

start "test1" cmd /D /C call "test.bat"

按照cmd /?

/D      Disable execution of AutoRun commands from registry

答案2

您可以用來setx設定 Windows 全域的環境變數。

使用時setx只需這樣寫:setx "name" "variable"其中 name 是一個簡單的名稱,variable 是您要設定的變數。

setx /?如果您想更深入地了解這些選項,請參閱所有選項和參數。

但請注意,setx 會將變數直接儲存到目前使用者的登錄機碼配置單元。這意味著您不需要任何管理權限,但也意味著這些變數在目前 cmd 會話中不能直接使用。set如果您只想在本地儲存變量,請使用常規變數。

您當然也可以將局部變數儲存到全域變數中,如下列範例所示:

@echo off
:: store "test" in variable "a"
set a=test

:: make this variable global
setx a %a%

正如您在上面的範例中看到的,%a%請引用本地範圍內的變量,並且 setx 使其公開可用

若要取消設定全域變量,請呼叫以下命令:setx "name" ""例如:setx a ""

同樣值得一提的是:您無法透過在另一個 cmd 實例中使用 setx 來修改一個 cmd 實例。一旦啟動cmd窗口,只有set可以更改其內部變量,而setx可以將它們儲存在外部。 (退出後如你所願)

相關內容