在一个CMD命令行语句中设置多个环境变量是否可行?

10

我有一个 PowerShell 脚本设置在 MSBuild 完成后执行。它使用在构建过程的 POSTBUILD 部分设置的环境变量(如构建目录等)。目前它看起来像这样:

  set MAGE="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\mage.exe"
  set APPFILE=$(TargetDir)$(TargetName).application
  set MANIFEST=$(TargetPath).manifest
  set CERT=$(ProjectDir)$(TargetName).pfx
  set PROJECTNAME=$(TargetName)
  set CONFIGURATION=$(ConfigurationName)
  set TARGETDIR=$(TargetDir)
  set TEAMBUILD=$False
  Powershell -File "$(ProjectDir)POSTBUILD.ps1"

每组变量位于不同的行内,但仍在同一个CMD实例中。

是否有一种方式可以只使用一行代码设置多个变量,而不是7行?


1
为什么你想这样做呢?把它们分别放在自己的一行上更清晰。如果你真的想要单行,把所有的集合放在一个函数中。 - Robert Harvey
2
我同意当前的方式可能不够清晰。但是,我想通过MSBuild中的<Exec>任务命令来运行它们。每个<Exec>任务调用实际上都会创建自己独立的CMD实例,导致PowerShell脚本看不到任何声明。但如果我能在一行代码中完成所有操作,这个问题就可以解决了。 - Masamune_Shadow
2个回答

14
正如Ansgar所指出的,更好的解决方案是将命令连接起来,如下所示:
set "A=foo" & set "B=bar" & set "C=baz"

你甚至可以内联脚本执行:
set "A=foo" & set "B=bar" & set "C=baz" & Powershell -File "$(ProjectDir)POSTBUILD.ps1"

10
应该是 set A=foo & set B=bar & set C=baz 而不是 set A=foo & B=bar & C=baz - sdbbs
我同意@sdbbs(必须重复 set 关键字),@Ansgar 也重复了 set 关键字,所以我做了这个修改。 我也认为最好使用引号,就像 @Ansgar 所做的那样;否则,训练空格将成为您的变量值的一部分:> set A = foo & set B = bar,然后 > echo _%A%_ -> _foo_。所以我也会进行这个编辑... - Nate Anderson

12

是的,您可以将命令串联起来:

set A="hi" | set B="bye"

2
非常好!这正是我所需要的。如果我能的话,我会点赞+1,可恶的+15声望最低要求... - Masamune_Shadow
9
使用管道进行此操作是不合适的语义。管道是将一个命令的标准输出连接到另一个命令的标准输入的运算符。 CMD 提供了 & 运算符来连接多个命令。另外,您可能需要在整个赋值周围加上双引号,否则它们将成为值的一部分。像这样:set "A=hi" & set "B=bye" & ... - Ansgar Wiechers
谢谢Ansgar。我有一种感觉,管道不是最好的方法,但可以完成工作。 - Dan Schnau
1
@AnsgarWiechers - 小心,你正在将 AB 分别设置为 hi bye (末尾带有空格)。我曾将这样的结果传输到 GnuWin32 的 sed 中,几乎要把我的头发都拔光了,试图弄清楚为什么变量无法匹配:这是因为空格的缘故。相反,你必须这样做 set "A=hi"& set "B=bye"& ...,在和号之前不要加空格。 - Andrew Cheong
3
不。在分配表达式("VAR=value")周围使用双引号可以防止包含尾随空格。您可以使用类似于“echo _%A%_”这样的内容进行验证。 - Ansgar Wiechers
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接