2017-05-25 231 views
1

我正在处理一个脚本来自动执行一些任务。基本上,它只是重命名文件,如果它们存在。但是,这些文件对于某些其他软件的操作至关重要。如果重命名文件失败,或者它找不到文件,我希望它说出它是哪个文件。但是,REN命令在失败时不是非常具有描述性。我知道如果它失败了,它会将ERRORLEVEL提升到1.是否还有其他信息可以从失败中获得,如文件名?或者它几乎只是成功或失败?批处理文件中的错误处理

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

由于

+2

它成功或失败。没有关于哪个文件导致失败的信息。 –

+0

您所需要的只是在ren回显试图重命名的文件后附加一个条件执行命令。 'Ren filea.txt fileb.txt ||回声仁filea.txt fileb.txt失败' – LotPings

+1

我对此页面上的所有内容感到困惑。在我看来,你已经把文件名作为迭代变量捕获了,不是吗?我的意思是,如果你通过文件循环来执行重命名,使用类似'for %% I'的命令来执行重命名“%%〜fI”“%%〜nI.bak”'或类似的操作,对吧?为什么不只是'... do(ren %%〜fI“”%%〜nI.bak“|| echo Renaming %%〜nxI failed)''或类似的?可能相关的,你可能会发现[prename.bat](https://stackoverflow.com/a/38191137/1683264)对批量重命名很有用。 – rojo

回答

3

作为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了解更多信息。

0

如前所述,ren使用通配符不会告诉您哪个文件失败。所以你必须分别处理每个文件。令人欣慰的是,有这样的命令:forforfiles

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

这种尝试重命名每一个文件,以“destination.ext”,这对于第一个他们的正常工作。
重命名其余文件将失败(目标已存在)。
||是一个“如果以前的命令失败,那么”运营商。
2>nul删除的ErrorMessage(你没用,因为它不会告诉你的文件名)

(注:这是对批处理文件中的语法如果直接尝试在命令行中,
每个%%a%a取代。 )