当前位置: 首页 > 知识库问答 >
问题:

强力外壳:尝试捕获不起作用

杜辉
2023-03-14

我有一个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停止执行并执行写主机。相反,它不运行写主机,而是继续执行< code > $ data = Get-Content $ current _ file 步骤,这将抛出一个终止错误,因为缺少的文件的路径不存在。我该如何解决这个问题?

共有1个答案

魏高邈
2023-03-14

您的第一个问题是您所知道的try/catch。简要查看留档about_Try_Catch_Finally您会发现…

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

您的Copy-Item行没有抛出终止错误。我们使用通用参数-ErrorAction修复它

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

因此,如果有问题,那么应该调用< code>Catch块。假设这是真正的问题。

我认为你还有另一个问题,可能只是一个打印错误。我不止一次看到下面的片段。

$file_list[$i].Line

之前,您已经将<code>$file_list</code>声明为“D:\some_folder\file_list.txt”,这是一个字符串。我想你想要的是下面。上述代码将为空,因为字符串没有行属性。但是从<code>选择字符串</code>返回可以!

$files_to_retrieve[$i].Line
 类似资料:
  • 我有一个存储过程似乎没有正确记录错误。 代码有错误,但 catch 块似乎未生效。 try块相当长,但错误部分很简单,并且在最后出现,所以我已经对此进行了预测。 proc失败的错误是我们的老朋友“列名或提供的值的数量与表定义不匹配”。我已经修复了这个错误 - 这是一个愚蠢的懒惰错误 - 但我感到困惑为什么我的错误日志记录过程似乎没有工作 - 没有行入到我的 ExtractsErrorLog 表中。

  • 问题内容: 根据我的经验,php服务器会向日志或服务器端抛出异常,但是node.js只会崩溃。因为尝试都是异步完成的,所以用try- catch包围我的代码也不起作用。我想知道其他人在生产服务器中做什么。 问题答案: 您可以从Node自己的文档中(http://nodejs.org/docs/latest/api/process.html#process_event_uncaughtexcepti

  • 问题内容: 我经常遇到如下情况: 仍然需要尝试-最终在内部捕获块。 克服此问题的最佳实践是什么? 问题答案: 写一个类,其中包含捕获和记录此类异常的方法,然后根据需要使用。 您最终会看到如下内容: 您的客户端代码将类似于: 更新: 自Java 7开始,各种JDBC接口都得到了扩展,而以上代码回答了原始问题,如果您直接针对JDBC API编写代码,则现在可以对其进行结构化:

  • 我在每个if()语句之前以及createUserBackEailAndPassword函数之前调用了try捕获,捕获永远不会工作,错误确实会发生。也通过从Firebase文档中复制代码,而且它也不起作用。 我做错了什么?我想抓住'auth/email-已经在使用'的错误代码(和任何其他)。 我添加了没有try-catch的代码。 });

  • 问题内容: 关于使用/的最佳实践,我有一个非常基本的问题。我有一个像这样的简单函数(DAO) 并在Web服务中使用DAO功能: OR最好在DAO函数中使用/,如下所示: 问题答案: 没有完美的规则。 如果需要尽早但尽可能晚地捕获异常,通常代码会更清晰,更简单。 您应该考虑在发生这种情况时谁必须采取行动,这决定了您是在方法(addVehicle)内进行操作还是调用方必须执行该操作。 例如: 在此示例