Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 批处理文件中的错误处理_Windows_Powershell_Batch File_Rename - Fatal编程技术网

Windows 批处理文件中的错误处理

Windows 批处理文件中的错误处理,windows,powershell,batch-file,rename,Windows,Powershell,Batch File,Rename,我正在编写一个脚本来自动化一些任务。本质上,它只是重命名文件(如果存在)。但是,这些文件对于其他一些软件的操作至关重要。如果重命名文件失败,或者找不到文件,我想让它说出是哪个文件。然而,REN命令在失败时并不是很具有描述性。我知道如果失败,它会将ERRORLEVEL提高到1。我是否可以从故障中获得其他信息,如文件名?或者,这几乎只是一个成功或失败 这将运行在Windows 7及更高版本的机器上,所以如果需要,powershell也是一个选项,但我更喜欢批处理 谢谢正如在对该问题的评论中指出的,c

我正在编写一个脚本来自动化一些任务。本质上,它只是重命名文件(如果存在)。但是,这些文件对于其他一些软件的操作至关重要。如果重命名文件失败,或者找不到文件,我想让它说出是哪个文件。然而,REN命令在失败时并不是很具有描述性。我知道如果失败,它会将ERRORLEVEL提高到1。我是否可以从故障中获得其他信息,如文件名?或者,这几乎只是一个成功或失败

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

谢谢

正如在对该问题的评论中指出的,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文件中,并假设已运行,则会看到以下错误输出:

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

运行并了解更多信息。

正如在对问题的评论中指出的,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文件中,并假设已运行,则会看到以下错误输出:

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

运行并了解更多信息。

如前所述,使用通配符不会告诉您哪个文件失败。因此,您必须单独处理每个文件。谢天谢地,有这样做的命令:for和forfiles

这会尝试将每个文件重命名为destination.ext,这对第一个文件很有效。 重命名其余文件将失败,因为目标已存在。 ||如果上一个命令失败,则为运算符。 2> nul会删除对您没有用处的errormessage,因为它不会告诉您文件名

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

,如前所述,使用通配符不会告诉您哪个文件失败。因此,您必须单独处理每个文件。谢天谢地,有这样做的命令:for和forfiles

这会尝试将每个文件重命名为destination.ext,这对第一个文件很有效。 重命名其余文件将失败,因为目标已存在。 ||如果上一个命令失败,则为运算符。 2> nul会删除对您没有用处的errormessage,因为它不会告诉您文件名

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

它是成功还是失败。没有关于哪个文件导致失败的信息。您只需在ren回显试图重命名的文件后附加一个条件执行命令。Ren filea.txt fileb.txt | | Echo Ren filea.txt fileb.txt失败我对本页上的所有内容都感到困惑。在我看来,您已经将文件名捕获为迭代变量,不是吗?我的意思是,如果你在文件中循环使用%%I in*do ren%%~fI%%~nI.bak或类似的东西来执行重命名,对吗?为什么不。。。ren%%~fI%%~nI.bak | | echo重命名%%~nxI是否失败或类似?可能与此相关,您可能会发现批量重命名很有用。这是成功还是失败。没有关于哪个文件导致失败的信息。您只需在ren回显试图重命名的文件后附加一个条件执行命令。我被伊芙弄糊涂了 这一页上有很多东西。在我看来,您已经将文件名捕获为迭代变量,不是吗?我的意思是,如果你在文件中循环使用%%I in*do ren%%~fI%%~nI.bak或类似的东西来执行重命名,对吗?为什么不。。。ren%%~fI%%~nI.bak | | echo重命名%%~nxI是否失败或类似?可能与此相关,您可能会发现批量重命名非常有用。例如| |要在出现错误时显示自定义消息,是否有任何方法可以在成功情况下显示自定义消息?@Vivek&&&。您也可以将它们组合在一起:command&&echo success | | | echo failLike | | | | | | |在出现错误时显示自定义消息,是否也可以通过任何方式显示成功案例的自定义消息?@Vivek&&&。您也可以将它们组合在一起:命令&echo成功| | echo失败