批处理文件中的错误处理

时间:2017-05-25 20:51:29

标签: windows powershell batch-file rename

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

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

由于

2 个答案:

答案 0 :(得分:3)

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

相比之下,

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'启动脚本。

  • 或者,您可以在 per-command 的基础上使用-ErrorAction Stop

运行Get-Help about_Preference_VariablesGet-Help about_CommonParameters了解详情。

答案 1 :(得分:0)

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

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

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

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