我运行这个脚本:
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
}