Вопрос:

PowerShell: не работает try-catch

powershell

3751 просмотра

1 ответ

738 Репутация автора

У меня есть сценарий PowerShell, который получает список имен файлов из файла, ищет в папке имена файлов, архивирует их, а затем выполняет другие действия.

#make non-terminating errors behave like terminating errors (at script level)
$ErrorActionPreference = "Stop"

#set the folder that has the list and the files
$some_path = "D:\some_folder\"
$archive = "D:\archive\"

#set the list file name
$file_list = $some_path + "file_list.txt"

#get the files that I'm searching for from this list file
$files_to_retrieve = Select String -Path $file_list -Pattern "something" | Select-Object Line

#get the number of files for this search string
$n = $file_list.Length - 1

#seed the while loop counter
$i = 0

#while loop to archive and modify the files
While ($i -le $n)
{
    #set the current file name
    $current_file = $path + $files_to_retrieve[$i].Line

    try
    {
        Copy-Item -Path $current_file -Destination $archive_path
    }
    catch
    {
        Write-Host ("file " + $files_to_retrieve[$i].Line + " not found")
    }

    $data = Get-Content $current_file

    #do modifications here
}

Try-catch не работает, как ожидалось. У меня есть имя файла в списке файлов, которого нет в $ some_path. Я ожидал, что try-catch остановит выполнение и сделает Write-Host. Вместо этого он не запускает Write-Host и переходит к $data = Get-Content $current_fileшагу, который вызывает завершающую ошибку, поскольку путь к отсутствующему файлу не существует. Как я могу это исправить?

Автор: skyline01 Источник Размещён: 31.10.2015 08:05

Ответы (1)


3 плюса

36066 Репутация автора

Ваша первая проблема, try/catchкак вы знаете. Кратко рассмотрев документацию по about_Try_Catch_Finally, вы увидите это ..

Используйте блоки Try, Catch и Наконец, чтобы реагировать или завершать ошибки в сценариях.

Ваша Copy-Itemстрока не выдает завершающую ошибку. Мы исправим это с помощью общего параметра-ErrorAction

Copy-Item -Path $current_file -Destination $archive_path -ErrorAction Stop

Таким образом, если есть проблема, тогда Catchблок должен быть вызван. Предполагая, что это была настоящая проблема там.


У меня есть и другая проблема, которая может быть просто опечаткой. Я вижу следующий фрагмент более одного раза.

$file_list[$i].Line

Ранее вы объявили $file_listкак «D: \ some_folder \ file_list.txt», что является строкой. Я думаю, что вы имели в виду ниже. Приведенный выше код будет нулевым, поскольку строка не имеет свойства строки. Но возврат Select-Stringможет!

$files_to_retrieve[$i].Line
Автор: Matt Размещён: 01.11.2015 12:49
Вопросы из категории :
32x32