所以我想做的是重新创建一个与我在 Bash 中使用的类似的函数,但在 Powershell 中:
yell() { echo "$0: $*" >&2; }
die() { yell "$*"; exit 111; }
try() { "$@" || die "FAILED: $*"; }
我目前最感兴趣的部分是这里的 try() 函数。本质上它的作用是允许我用这个函数包装一个命令并让它管理退出代码。效果是这样的:
try doSomething -args
如果doSomething
以非零值退出,它会将命令输出到 stderr 并停止脚本执行。
我意识到 Powershell 有一个可用于中止脚本的错误操作,但它似乎只适用于命令行开关。我需要一些可以在整个脚本中使用的东西。我还希望避免大量冗长的 try/catch 逻辑使脚本变得混乱,因此需要像 try/yell/die 这样优雅的东西。这样,我可以单独在这个函数中编写处理,并使用它来调用我想要处理的任何内容。
我发现$MyInvocation
并认为这可能是进入的方式,但我似乎无法找到从函数中实际执行它的方法。例如:
function run() {
$MyInvocation # ?? what do??
}
run doSomething -args
我想我可以自己弄清楚其余的,我只是不太清楚如何编写这个包装函数。有任何想法吗?
更新
所以我做了一些俗气的事情,我对命令进行了子串化,并对Invoke-Expression
剩下的内容做了一个,它似乎有效。感觉超级hacky,所以我仍然对想法持开放态度:
function attempt() {
$thisCommand = $MyInvocation.Line.Trim()
Write-Output $thisCommand
Invoke-Expression $thisCommand.Substring(8)
if($LASTEXITCODE -ne 0) {
throw "Command failed $thisCommand"
exit 111
}
}
attempt doSomething -args