为什么我的 if 语句总是错误的?

30 windows script powershell

我运行这个脚本:

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
}
Run Code Online (Sandbox Code Playgroud)

当我以普通用户身份运行此脚本时,我在else语句中收到消息,因为我不是 root。这没关系。

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

我还检查了错误代码及其 always False

Sim*_*onS 82

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

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

您在这里有三个选择:

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

if (Copy-Item .\test.ps1 $env:SystemRoot\System32 -PassThru)
Run Code Online (Sandbox Code Playgroud)

使用该$?变量查看您之前的命令是否成功:

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
}
Run Code Online (Sandbox Code Playgroud)

但是,最可靠的方法是将其包裹起来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
}
Run Code Online (Sandbox Code Playgroud)