gpt4 book ai didi

powershell - 正确使用调用表达式?

转载 作者:行者123 更新时间:2023-12-03 06:51:22 26 4
gpt4 key购买 nike

我最近刚刚在 powershell 中完成了我的第一个夜间构建脚本(实际上是第一个重要的脚本)。我似乎工作得很好,即使还不够稳健(我还没有处理重要的错误检查),但我发现自己陷入了 Invoke-Expression cmdlet 周围的习惯用法,并且我'我想知道我是否正确使用它。

具体来说,我使用一系列变量来构建命令行,我将使用它们来构建解决方案,然后运行解决方案的单元测试。例如,类似:

$tmpDir = "C:\Users\<myuser>\Development\Autobuild"
$solutionPath=$tmpDir+"\MyProj\MyProj.sln"
$devenv="C:\Program Files (x86)\Microsoft Visual Studio 10.0\common7\ide\devenv"
$releaseProfile="Release"
$releaseCommandLine="`"$devenv`" `"$solutionPath`" /build `"$releaseProfile`""

这工作得很好,$releaseCommandLine包含我完成后想要执行的命令行。然后我通过这一行执行它:

$output = Invoke-Expression "& $releaseCommandLine"

这是从 powershell 脚本执行手动构建的命令行的正确方法吗?我最初以为 Invoke-Command 可以做到这一点,但我一定是做错了什么,因为我半个小时根本无法让它工作,而且我几乎立即就开始工作了。

我在同一脚本中多次遵循相同的模式。这是最佳实践吗?

最佳答案

我觉得不错。我唯一要改变的是使用更多的 Powershell 功能来代替脆弱的假设。例如:

  • 使用 Join-Path 代替字符串连接

  • 使用 Env:\ 提供程序查找 %programfiles(x86)% 目录(或者更好的是,使用 HKML:\ 提供程序来查找路径 - 它位于 SOFTWARE\Microsoft\VisualStudio\\InstallDir)

  • 当我必须编写一个包含文字双引号变量扩展的字符串时,我通常会使用下面的语法。显然是个人喜好。

    '"{0}" "{1}" /build "{2}"' -f $devenv, $solutionPath, $releaseProfile

在某些情况下,我倾向于使用 Process.Start() ,以便我可以独立捕获 stdout 和 stderr 流(甚至可能交互式地控制 stdin,具体取决于应用程序)。

PS - “&”并不是绝对必要的。

关于powershell - 正确使用调用表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1355700/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com