我遇到了一些奇怪的行为,其默认参数似乎null根据该函数是否使用了一个.或&在其中调用本机命令来更改值(或空字符串).
这是一个带有两个相同函数的示例脚本,唯一的区别是它们如何调用本机命令(cmd.exe):
function Format-Type($value)
{
if ($value -eq $null) { '(null)' } else { $value.GetType().FullName }
}
function Use-Dot
{
param(
[string] $Arg = [System.Management.Automation.Language.NullString]::Value
)
Write-Host ".: $(Format-Type $Arg)"
. cmd.exe /c exit 0
}
function Use-Ampersand
{
param(
[string] $Arg = [System.Management.Automation.Language.NullString]::Value
)
Write-Host "&: $(Format-Type $Arg)"
& cmd.exe /c exit 0
}
Use-Dot
Use-Ampersand
Run Code Online (Sandbox Code Playgroud)
在PowerShell 5.1上,我得到以下输出,显示参数的值在两种情况下是不同的:
.: (null)
&: System.String
Run Code Online (Sandbox Code Playgroud)
以这种方式关联这种行为听起来很荒谬,因此我确信我必须在这里遗漏一些明显(或者可能非常微妙)的东西,但那又是什么呢?
-
问题PowerShell管道中的.简写是什么?讨论了 …
我们有一堆.bat构建脚本,这些脚本由基于 PowerShell 的 GitLab 运行器调用,这些运行器最近重构为:
program args
if !errorlevel! neq 0 exit /b !errorlevel!
Run Code Online (Sandbox Code Playgroud)
更简洁:
program args || exit /b
Run Code Online (Sandbox Code Playgroud)
今天我调查了一个构建作业,如果您查看错误日志,该作业显然失败了,但报告为成功。经过大量实验,我发现这种模式并不总是按预期工作:
program args || exit /b
Run Code Online (Sandbox Code Playgroud)
但是当前者没有时,这似乎确实有效:
program args || exit /b !errorlevel!
Run Code Online (Sandbox Code Playgroud)
我已经阅读了 SO question Windows batch exit option b with or without errorlevel和下面来自https://www.robvanderwoude.com/exit.php的声明,但仍然不能完全解释我正在观察的内容。
DOS 联机帮助 (HELP EXIT) 没有明确说明 /B 参数退出当前脚本实例不一定与退出当前脚本相同。即,如果脚本在 CALLed 代码段中,则 EXIT /B 退出 CALL,而不是脚本。
这是我用来探索这个的最小批处理文件:
@echo off
setlocal EnableDelayedExpansion
cmd /c "exit 99" || exit /b
:: cmd /c …Run Code Online (Sandbox Code Playgroud)