是$?值始终设置为true?在下面的示例中,它被设置为TRUE,因为我写了silentlycontinue
。在这个脚本中,我正在管理文件的错误处理以从用户输入中获取内容:测试文件是否繁忙的脚本在再次访问之前等待2秒,如下所示:
$filecontent = get-content $filename -ea silentlycontinue
**while (-not $?)**
{
$filecontent = get-content $filename -ea silentlycontinue
start-sleep: -sec 2
}
答案 0 :(得分:3)
$?包含上次操作的执行状态。它包含 如果上一次操作成功则为TRUE,如果失败则为FALSE。
它的值与ErrorActionPreference设置无关:
PS>$ErrorActionPreference="continue"
PS>gc afile.txt
gc : Impossible de trouver le chemin d'accès « C:\Users\u1\afile.txt », car il n'existe pas.
Au caractère Ligne:1 : 1
+ gc afile.txt
+ ~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\Users\u1\afile.txt:String) [Get-Content], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand
PS>$?
False
PS>$ErrorActionPreference="silentlycontinue"
PS>gc afile.txt #no error message displayed
PS>$?
False
更好的方法是通过将$ ErrorActionPreference设置为“stop”并使用try catch语句来使所有错误终止。
function openFile{
try{
$file=[System.io.File]::Open('c:\windows\windowsupdate.log', 'Open', 'Read', 'None')
}
catch{
write-host "File is locked"
start-sleep 2
openFile
}
finaly{
return $file
}
}
$ErrorActionPreference="stop"
$file=openFile