尝试Catch语句破坏了我的代码

时间:2014-07-01 14:10:58

标签: .net powershell try-catch

这是Powershell脚本的一小部分,为了递归获取所有文件夹/子文件夹和文件,我无法使用Get-ChildItem,因为它在UNC网络路径上太慢了,所以我的想法是使用{{ 1}}使用PSSession远程执行,它可以工作。

使用PsSession远程执行此代码,我的try / catch语句工作正常,我可以将结果导入[Microsoft.VisualBasic.FileIO.FileSystem]::GetFiles变量。

$GetRemoteFolderCheck

但是当我在不使用PSSession的情况下在本地执行相同的代码时,它不起作用,它会破坏我的代码...因为我的shell中没有显示$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 $_ } }

Write-Host

我不明白为什么它没有按预期工作,我的$path_folder = "C:\sources\sql" $GetLocalFolderCheck = try{[Microsoft.VisualBasic.FileIO.FileSystem]::GetFiles( $path_folder, [Microsoft.VisualBasic.FileIO.SearchOption]::SearchAllSubDirectories) } catch { return $_ } Write-Host "toto" 应该包含异常,而不是破坏我的代码。

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

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

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

来实现所需的结果
...
catch
       {
           $_
       }
...

这种方式如果出现错误,它将作为对象传递给管道并继续执行。