批处理:如何将数据作为参数转发到新的 CMD 实例

批处理:如何将数据作为参数转发到新的 CMD 实例

我正在寻找调用另一个 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 可以将它们存储在外部。(退出时,您可以随意更改)

相关内容