由于某些原因,当我针对不存在的文件运行以下脚本时,我的脚本没有捕获异常。我根据我在网络上找到的示例来编写此代码,但它似乎对我不起作用。
我很感激有关如何解决此问题的任何提示或指示。
注意:在下面的例子中我也试过
trap [Exception] {
但这也不起作用。
这是脚本:
function CheckFile($f) {
trap {
write-host "file not found, skipping".
continue
}
$modtime = (Get-ItemProperty $f).LastWriteTime
write-host "if file not found then shouldn't see this"
}
write-host "checking a file that does not exist"
CheckFile("C:\NotAFile")
write-host "done."
输出:
PS > .\testexception.ps1
checking a file that does not exist
Get-ItemProperty : Cannot find path 'C:\NotAFile' because it does not exist.
At C:\Users\dleclair\Documents\Visual Studio 2010\lib\testexception.ps1:12 char:35
+ $modtime = (Get-ItemProperty <<<< $f).LastWriteTime
+ CategoryInfo : ObjectNotFound: (C:\NotAFile:String) [Get-ItemProperty], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetItemPropertyCommand
if file not found then shouldn't see this
done.
PS >
答案 0 :(得分:6)
试试这样:
trap { write-host "file not found, skipping";continue;}
$modtime = Get-ItemProperty c:\manoj -erroraction stop
基于OP的评论:
我认为你误解了你所链接的文章中的内容:
在这个例子中,我们使用继续导致执行返回到 陷阱所在的范围并执行下一个命令。这很重要 请注意,执行只返回陷阱的范围,所以如果 异常被抛入函数内部,甚至在if语句中抛出, 并被困在它之外...继续将在结束时恢复 嵌套范围。
所以如果你做这样的事情:
trap{ write-host $_; continue;}
throw "blah"
write-host after
after
将被打印。
但如果你做这样的事情:
trap{ write-host $_ ; continue}
function fun($f) {
throw "blah"
write-host after
}
fun
write-host "outside after"
after
将不会被打印,但outside after
将会打印。
或者,使用try-catch块:
try{
$modtime = (Get-ItemProperty $f -erroraction stop).LastWriteTime
write-host "if file not found then shouldn't see this"
}
catch{
write-host "file not found, skipping".
}
答案 1 :(得分:0)
您必须在函数内部或外部({全局应用程序中)将$ErrorActionPreference
设置为SilentlyContinue
才能使trap
生效。或者(如上所述),将-ErrorAction
公共参数设置为相同的内容。