尝试Catch仍然无法在Powershell V2中工作,即使“$ ErrorActionPreference =”Stop“

时间:2015-09-28 16:07:05

标签: powershell-v2.0 try-catch-finally

我在三台计算机上运行完全相同的代码。在电脑" 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,由于没有人分享,我们不允许升级它们。

欢迎任何想法或想法。 谢谢,

1 个答案:

答案 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]块的一个实例来实现此目的。

希望这有帮助!