我正在寻找调用另一个 CMD 实例并将数据从父实例传递给它。
我知道使用变量的一般方法,但在这种情况下不可行,因为 endlocal 和桥接会带来太多不便(必须传递数十个变量)。我还知道我可以使用临时文件轻松移植我想要的所有数据,但这会留下不必要的痕迹。编辑:setx 也可以非常成功地使用。
我在看具体来说对于一些常见的参数用法,例如:
test.bat -setvar"variable"="value" -setvar...
我以前确实找到过一种方法,但它有局限性
在其他线程上发现我可以在启动 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
测试脚本
@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]
始终包含一个 TITLE,它可以是一个简单的字符串,如“My Script”,也可以是一对空引号“”。根据 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 可以将它们存储在外部。(退出时,您可以随意更改)