我有一个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
步骤,这会导致终止错误,因为丢失文件的路径不存在。我该如何解决这个问题?
答案 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