我正在编写一个脚本来自动执行几项任务。从本质上讲,它只是重命名文件(如果存在)。但是,这些文件对于某些其他软件的操作至关重要。如果重命名文件失败,或者它找不到文件,我想说它是哪个文件。但是,REN命令在失败时不是很具描述性。我知道如果它失败了,它会将ERRORLEVEL提升为1.我可以从失败中得到任何其他信息,比如文件名吗?或者它只是成功还是失败?
将运行的机器是Windows 7及更高版本,因此如果需要,PowerShell也是一个选项,但我更喜欢批处理。
由于
答案 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_Variables
和Get-Help about_CommonParameters
了解详情。
答案 1 :(得分:0)
如前所述,ren
使用通配符并不会告诉您哪个文件失败。所以你必须单独处理每个文件。谢天谢地,这里有命令:for
和forfiles
。
for %%a in (*) do ren "%%a" "destination.ext" 2>nul || echo FAILED: %%a
这会尝试将每个文件重命名为“destination.ext”,这对于第一个文件来说效果很好
重命名其余文件将失败(目标已存在)
||
是“如果上一个命令失败,那么”运算符
2>nul
删除了错误消息(对你没用,因为它没有告诉你文件名)
(注意:这是批处理文件的语法。如果直接在命令行上尝试,
将每个%%a
替换为%a
)