为什么我的 if 语句始终为假?

为什么我的 if 语句始终为假?

我运行这个脚本:

if (Copy-Item .\test.ps1 $env:SystemRoot\System32)
{
    Write-Host "Done."
    exit 0
}
else
{
    Write-Host "Not done."
    Write-Host "You must be root."
    exit 1
}

当我以普通用户身份运行此脚本时,我收到了声明中的消息else,因为我不是 root。这没问题。

但是我以 root 身份运行此脚本,我也收到了声明中的消息else!但文件复制操作成功了。我无法收到if声明中的消息。为什么?

我也检查了错误代码,但总是这样False

答案1

语句if不会评估其条件内的命令是否成功运行。它只会检查值(在您的情况下是命令的返回值)并将其转换为bool

Copy-Item默认情况下不返回任何内容,这就是为什么您的if语句始终是false,因为[bool]$null$false

您有三个选择:

添加-PassThru参数来获取某种形式的返回:

if (Copy-Item .\test.ps1 $env:SystemRoot\System32 -PassThru)

使用$?变量来查看上一个命令是否成功:

Copy-Item .\test.ps1 $env:SystemRoot\System32
if ($?) {
    Write-Host "Done."
    exit 0
}
else {
    Write-Host "Not done."
    Write-Host "You must be root."
    exit 1
}

然而,最可靠的方法是将其包裹在Try {} Catch {}并添加-ErrorAction Stop

Try {
    Copy-Item .\test.ps1 $env:SystemRoot\System32 -ErrorAction Stop
    Write-Host "Done."
    exit 0
}
Catch {
    Write-Host "Not done."
    Write-Host "You must be root."
    exit 1
}

相关内容