Batch file CMD蝙蝠和环境变量的捕获

Batch file CMD蝙蝠和环境变量的捕获,batch-file,cmd,Batch File,Cmd,我有一个由powershell驱动的脚本系统,它调用BAT文件 我想在BAT会话结束时记录环境,以便它们可用于下一个BAT文件。我发现我做了什么,没有从BAT文件中捕获更改 更多 我有这样的代码 &cmd.exe“/c$script$optionalArgs&(echo Name^=Value&SET)>“c:\path\end\u envs.csv” $script==dosomework.bat 这似乎有效,即csv文件是使用env创建的,但没有使用$script创建的。。。而似乎是初始cm

我有一个由powershell驱动的脚本系统,它调用BAT文件 我想在BAT会话结束时记录环境,以便它们可用于下一个BAT文件。我发现我做了什么,没有从BAT文件中捕获更改

更多

我有这样的代码

&cmd.exe“/c$script$optionalArgs&(echo Name^=Value&SET)>“c:\path\end\u envs.csv”

$script==dosomework.bat 这似乎有效,即csv文件是使用env创建的,但没有使用$script创建的。。。而似乎是初始cmd.exe调用的环境

在将'echo xx'行添加到BAT文件并在$script中引用的BAT文件底部调用它之后,一切正常,我在$script BAT文件的末尾看到了env

<> P>是否有办法欺骗CMD.EXE/C把我的额外回音信息看作是调用脚本的一部分?


谢谢

最简单的可能是添加

(echo Name^=Value
SET) > "c:\path\end_envs.csv"
到$script结尾(或至少在退出之前强制执行这两行)

将其命名为$$script.bat

@ECHO OFF
(
 echo Name=Value
 CALL $script %*
 SET
)>"c:\path\end_envs.csv"
并修改您的代码以喜欢

& cmd.exe "/c $$script $optionalArgs"
whee
$$script.bat
自然可以是您喜欢的任何名称

注意,这假设
$script.bat
(您实际执行的)不包含
setlocal
指令


如果
$script
是变量,则在批处理文件
$$script.bat
中尝试

@ECHO关闭
SETLOCAL
(
echo Name=值
设置“参数=%*”
调用%1%%参数:*=%
设置“参数=”
设置
)>“u:\envs.csv”
后藤:EOF
这假设不存在混杂因素(例如,包含
cmd
敏感字符的参数-正常字母数字字符串应该可以)

所以

  • 写出标题行
  • params
    设置为提供的参数列表+空格
  • 执行子例程firstparameter和参数remainingparameters。
    call…%%params:*=%%
    语法表示“参数的值,直到并包括第一个空格”
  • 清除
    params
  • 列出remining环境变量
目标文件名当然由您决定。我使用了一个便于我的系统使用的名称


因此-您可以使用参数(您要运行的脚本的名字)+(您需要的任何其他参数)调用此脚本。

回答得好,这就是我想要的。我可以根据我的帖子和其他帖子,将其添加到脚本末尾,但是我希望由框架来处理。我看到的问题是,如果要用args调用abc.bat,而框架bat是doit.bat,我调用“&cmd.exe”/c doit.bat abc.bat args”,那么脚本是否需要使用%1 arg,然后使用所有%2*args?是的
%*
表示“过程的所有参数”,因此传递给
$$script
的任何参数都将传递给
$script
如果$$script.bat是某个powershell代码块的文件,hmm可以澄清吗?如果是一个文件,那么它需要知道调用什么BAT和传递什么参数。如果我调用doit.BAT,那么%1将是我想要调用的脚本名,这意味着(参数)上的%2需要传递给doit.BAT内部调用的脚本