【问题标题】:Try Catch statement is breaking my codeTry Catch 语句破坏了我的代码
【发布时间】:2014-07-01 22:43:23
【问题描述】:

这是一小段 Powershell 脚本,用于递归获取所有文件夹/子文件夹和文件,我不能使用 Get-ChildItem 因为它在 UNC 网络路径上太慢了,所以我的想法是使用 [Microsoft.VisualBasic.FileIO.FileSystem]::GetFiles 执行远程使用 PSSession,它可以工作。

使用 PsSession 远程执行此代码后,我的 try/catch 语句运行良好,我可以将结果放入 $GetRemoteFolderCheck 变量中。

$path_folder = "C:\sources\sql"

    $session = New-PSSession -ComputerName $ipsqlserver -Credential $credentials
        Invoke-Command -Session $session -ScriptBlock {
        [reflection.assembly]::loadwithpartialname("Microsoft.VisualBasic") | Out-Null
        }

        $GetRemoteFolderCheck = Invoke-Command -Session $session -ScriptBlock {
           try
           {
            [Microsoft.VisualBasic.FileIO.FileSystem]::GetFiles(
            $using:path_folder,
            [Microsoft.VisualBasic.FileIO.SearchOption]::SearchAllSubDirectories)
           }
           catch
           {
               return $_
           }
        }

但是当我在本地执行相同的代码而不使用 PSSession 时,它不起作用,它破坏了我的代码...因为 Write-Host 没有显示在我的 shell 中

$path_folder = "C:\sources\sql"

$GetLocalFolderCheck =  try{[Microsoft.VisualBasic.FileIO.FileSystem]::GetFiles(
        $path_folder,
        [Microsoft.VisualBasic.FileIO.SearchOption]::SearchAllSubDirectories) }
        catch
        {
           return $_
        }

    Write-Host "toto"

我不明白为什么它没有按预期工作,我的 $GetlocalFolderCheck 应该包含异常,并且没有破坏我的代码。

感谢您的帮助

【问题讨论】:

    标签: .net powershell try-catch


    【解决方案1】:

    因为您使用的是return 语句,所以这是预期的行为。 Write-Host "toto" 实际上是无法访问的,因为无论您的调用是成功还是抛出错误,您都在返回一个值。如果是这个 C# 代码,将会有编译警告Unreachable code detected

    您应该能够通过将catch块更改为:

    ...
    catch
           {
               $_
           }
    ...
    

    这样,如果出现错误,它将作为对象向上传递并继续执行。

    【讨论】:

    • 非常感谢。初学者错误:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    相关资源
    最近更新 更多