我在三台计算机上运行完全相同的代码。在电脑" A"这是PSV2(我不允许升级到PSV3),以下代码不执行任何操作,除非在执行结束时打印错误消息。
.class
屏幕旁边的消息说我无法添加图片,所以这才变得有趣......
$ErrorActionPreference = "Stop"
TRY { $ErrorActionPreference = "Stop"
New-Item -Type File $("C:\Windows\System32\NewFile.Txt") -ErrorAction Stop }
CATCH [System.UnauthorizedAccessException],[System.UnauthorizedAccessException]
{ Write "Rerun with elevated permissions" }
FINALLY { Get-ChildItem $("C:\Windows\System32\new*") }
无论如何,在计算机" B" &安培; " C"它们分别是PSV3 / PSV4,按预期工作,给出以下内容
PS C:\Temp> $ErrorActionPreference = "Stop"
PS C:\Temp> TRY { $ErrorActionPreference = "Stop"
>> New-Item -Type File $("C:\Windows\System32\NewFile.Txt") -ErrorAction Stop }
>> CATCH [System.UnauthorizedAccessException],[System.UnauthorizedAccessException] { Write "Rerun with elevated permissions" }
>> FINALLY { Get-ChildItem $("C:\Windows\System32\new*") }
>>
Directory: C:\Windows\System32
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 7/13/2009 9:41 PM 313856 newdev.dll
-a--- 7/13/2009 9:39 PM 76288 newdev.exe
New-Item : Access to the path 'C:\Windows\System32\NewFile.Txt' is denied.
At line:2 char:15
+ New-Item <<<< -Type File $("C:\Windows\System32\NewFile.Txt") -ErrorAction Stop }
+ CategoryInfo : PermissionDenied: (C:\Windows\System32\NewFile.Txt:String) [New-Item], UnauthorizedAccessException
+ FullyQualifiedErrorId : NewItemUnauthorizedAccessError,Microsoft.PowerShell.Commands.NewItemCommand
正如您在上面的源代码中看到的那样。除了命令本身的-Erroraction Stop之外,$ ErrorActionPreference行在try块之外以及try块内部,并且在V2计算机上它不起作用,而V3 / V4加工它是
超过98%的机器都是PSv2,由于没有人分享,我们不允许升级它们。
欢迎任何想法或想法。 谢谢,
答案 0 :(得分:0)
唯一突出的是你正在使用&#34;写&#34;简写而不是完整的&#34; Write-Host&#34;脚本中的命令。我希望这可能会导致一个问题,因为有许多不同的&#34;写 - *&#34;您可以在PowerShell中执行的命令。可能是PowerShell的V3和V4有&#34; Write&#34;作为&#34; Write-Host&#34;的简写,而V2不是。
以下是您的代码的更新示例,仅为了清晰起见;
$ErrorActionPreference = "Stop"
TRY { New-Item -Type File $("C:\Windows\System32\NewFile.Txt") }
CATCH [System.UnauthorizedAccessException]
{ Write "Rerun with elevated permissions" }
FINALLY { Get-ChildItem $("C:\Windows\System32\new*") }
我还删除了不必要的ErrorAction信息 - 根据您编写的代码,$ ErrorActionPreference仅需要设置一次,因为如果首选项设置为outide,UnauthorizedAccessException将生成终止错误尝试/捕获/最后阻止。此外,您应该只需要Catch旁边的[System.UnauthorizedAccessException]块的一个实例来实现此目的。
希望这有帮助!