Try Catch заявляет, что мой код

Это небольшой фрагмент сценария 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 не отображается в моей оболочке

$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 должен содержать исключение и не нарушать мой код.

Спасибо за вашу помощь

1 ответ

Поскольку вы используете оператор return это ожидаемое поведение. Write-Host "toto" эффективно недоступен, поскольку вы возвращаете значение независимо от того, преуспеет ли ваш вызов или выбрасывает ошибку. Был ли этот код С#, было бы предупреждение о компиляции. Unreachable code detected.

Вы должны иметь возможность добиться желаемого результата, изменив блок catch на:

...
catch
 {
 $_
 }
...

Таким образом, если есть ошибка, он будет передан конвейером в качестве объекта, и выполнение будет продолжено.

licensed under cc by-sa 3.0 with attribution.