【问题标题】:Error handling in batch files批处理文件中的错误处理
【发布时间】:2017-10-26 15:23:59
【问题描述】:

我正在编写一个脚本来自动执行几项任务。本质上,它只是重命名文件(如果存在)。但是,这些文件对于其他一些软件的操作至关重要。如果重命名文件失败,或者找不到文件,我希望它说出它是哪个文件。但是,当 REN 命令失败时,它的描述性不是很强。我知道如果失败,它会将 ERRORLEVEL 提高到 1。我可以从失败中获得任何其他信息,例如文件名?还是只是成功或失败?

这将在 Windows 7 及更高版本上运行的机器,因此如果需要,powershell 也是一个选项,但我更喜欢批处理。

谢谢

【问题讨论】:

  • 成功或失败。没有关于哪个文件导致失败的可用信息。
  • 所有你需要的是在 ren 回显文件试图重命名之后附加一个条件执行命令。 Ren filea.txt fileb.txt || Echo Ren filea.txt fileb.txt failed
  • 我对这个页面上的所有内容感到困惑。在我看来,您已经将文件名捕获为迭代变量,不是吗?我的意思是,如果您正在循环文件以使用 for %%I in (*) do ren "%%~fI" "%%~nI.bak" 或类似的东西执行重命名,对吗?为什么不只是 ... do (ren "%%~fI" "%%~nI.bak" || echo Renaming %%~nxI failed) 或类似的?可能相关,您可能会发现 prename.bat 对批量重命名很有用。

标签: windows powershell batch-file rename


【解决方案1】:

如前所述,ren 使用通配符不会告诉您哪个文件失败了。所以你必须单独处理每个文件。谢天谢地,有这样的命令:forforfiles

for %%a in (*) do ren "%%a" "destination.ext" 2>nul || echo FAILED: %%a

这会尝试将每个文件重命名为“destination.ext”,这对于其中的第一个文件来说效果很好。
重命名其余文件将失败(目标已存在)。
||“如果上一个命令失败,则” 运算符。
2>nul 删除错误消息(无用对你来说,因为它不会告诉你文件名)

(注意:这是批处理文件的语法。如果您直接在命令行上尝试,
将每个%%a 替换为%a)

【讨论】:

  • || 一样在发生错误时显示自定义消息,还有什么方法可以显示成功案例的自定义消息?
  • @Vivek &&。你也可以组合它们:command && echo success || echo fail
【解决方案2】:

正如Ken White 在对该问题的评论中指出的那样,cmd.exeren 命令发出的错误消息包括所涉及的文件名。

相比之下,

PowerShell 提供详细的错误消息, 包含文件名
采用以下示例脚本:

# Create helper sample files.
$tempFiles = "$env:TEMP\foo", "$env:TEMP\bar"
$null = New-Item -Type File $tempFiles

# Try to rename a nonexistent item.
Rename-Item \no\such -NewName foo

# Try to rename to a file that already exists.
Rename-Item $env:TEMP\foo -NewName bar

# Clean up the sample files.
Remove-Item $tempFiles

如果您将以上内容保存到*.ps1 文件并运行它(假设您有permitted scripts to run),您将看到以下错误输出:

Rename-Item : Cannot rename because item at '\no\such' does not exist.
At C:\Users\jdoe\Desktop\pg\pg.ps1:8 char:5
+     Rename-Item \no\such -NewName foo
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Rename-Item], PSInvalidOperationException
    + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.RenameItemCommand

Rename-Item : Cannot create a file when that file already exists.
At C:\Users\jdoe\Desktop\pg\pg.ps1:11 char:5
+     Rename-Item $env:TEMP\foo -NewName bar
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : WriteError: (C:\Users\jdoe\AppData\Local\Temp\foo:String) [Rename-Item], IOException
    + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand

虽然输出很详细,但它确实包含所有相关信息,您甚至可以通过自动$Error 变量以编程方式检查它,该变量包含会话中报告的所有错误逆时间顺序($Error[0] 包含最近的最近错误)。

并不是说,默认情况下,当这些错误发生时,PowerShell 脚本会继续运行,因为它们被视为非终止

  • 立即中止脚本的最简单方法是使用$ErrorActionPreference= 'Stop' 行启动脚本。

  • 或者,您可以在每个命令的基础上使用-ErrorAction Stop

运行Get-Help about_Preference_VariablesGet-Help about_CommonParameters 以了解更多信息。

【讨论】:

    猜你喜欢
    • 2010-11-12
    • 2022-01-05
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多