小编Chr*_*ood的帖子

为什么此PowerShell函数的默认参数会根据使用情况更改值.或&以在其中调用命令?

我遇到了一些奇怪的行为,其默认参数似乎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管道中.简写是什么?讨论了 …

powershell

13
推荐指数
1
解决办法
231
查看次数

"|| exit /b" 和 "|| exit /b !errorlevel!" 之间的区别

我们有一堆.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)

powershell cmd batch-file

12
推荐指数
3
解决办法
426
查看次数

标签 统计

powershell ×2

batch-file ×1

cmd ×1