PowerShell:try-catch无法正常工作

时间:2015-10-31 20:05:10

标签: powershell

我有一个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。相反,它不会运行写主机并继续执行$data = Get-Content $current_file步骤,这会导致终止错误,因为丢失文件的路径不存在。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

你知道的第一个问题是try/catch。简要看一下documentation for about_Try_Catch_Finally你会看到......

  

使用Try,Catch和Finally块来响应或处理终止       脚本中的错误

您的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"这是一个字符串。我想你的意思是在下面。上面的代码将为null,因为string没有line属性。但是Select-String的回报可以!

$files_to_retrieve[$i].Line