Windows 如何通过批处理文件在文件扩展名后追加字符串

Windows 如何通过批处理文件在文件扩展名后追加字符串,windows,batch-file,file-rename,Windows,Batch File,File Rename,递归检查zip存档的完整性如何通过Windows下的批处理文件在文件扩展名后追加字符串来重命名文件夹中的坏文件? 我尝试了这个脚本,它没有给我任何错误,但也没有重命名坏文件 FOR /R \backup %%A IN (*.zip) DO ( 7z t "%%A" | FIND "Everything is Ok" || ((REN "%%A" "%%A.bad") & (ECHO.%%A BAD >> error.log)) ) 我有PHP脚本编写的经验,并且大体上

递归检查zip存档的完整性如何通过Windows下的批处理文件在文件扩展名后追加字符串来重命名文件夹中的坏文件? 我尝试了这个脚本,它没有给我任何错误,但也没有重命名坏文件

FOR /R \backup %%A IN (*.zip) DO (
   7z t "%%A" | FIND "Everything is Ok" || ((REN "%%A" "%%A.bad") & (ECHO.%%A BAD >> error.log))
)

我有PHP脚本编写的经验,并且大体上理解这个代码块(管道和逻辑OR运算符的含义)。但是,我在批处理脚本方面完全没有经验,并且采用了来自的脚本。据我所知,该检查收到“确定”或向日志文件添加条目并重命名该文件。添加日志条目,但不应用重命名。我不明白为什么。您能告诉我哪里出了问题,以及它如何才能按预期工作吗?

您可以使用此批处理代码执行任务

@echo off
rem Test all ZIP files recursive from directory backup in root of
rem current drive and append .bad to those ZIP files not validate.
rem The names of those files are additionally written into an
rem error.log text file in current working directory.

for /R "\backup" %%A in (*.zip) do (
   7z.exe t "%%A">nul
   if errorlevel 1 (
      ren "%%A" "%%~nxA.bad"
      echo %%A BAD>>error.log
   )
)
在7-zip的帮助中,有一个关于退出代码的页面。在本帮助页上可以看到,任何大于0的值都表示有问题

因此,
if errorlevel 1
可用于检查ZIP文件上的测试是否为阳性(退出代码为0)或失败(值大于或等于1)

输入
if/?
help if
后,在命令提示窗口中查看帮助输出,以了解有关errorlevel的详细信息<代码>如果错误级别1表示:如果上一个命令的退出代码大于或等于1,则


进一步的命令ren只需要新文件名而不需要路径作为第二个参数,否则它不会重命名使用路径或不使用路径作为第一个参数指定的文件。这就是为什么必须将
%%~nxA
用作命令ren的第二个参数,以便仅引用要重命名的文件的名称和扩展名。输入
for/?
Help for
后输出的命令帮助for包含文件名的修饰字母列表。

使用两条垂直线的
commandA | | commandB
的含义:运行
commandA
,如果失败,则运行
commandB
。如果失败,即以非零返回代码结束,请参见
errorlevel
。但是您的
命令a
永远不会失败,因为它会为右侧
.zip
文件显示一条消息。所以你应该重新制定你的条件。你介意提供一个合适的例子吗?你能告诉我,在这个脚本的配合下,我是否可以调试当前处理的路径,以及如何调试?我试图用7z.exe直接在行上方回送它,如
echo%%A
echo%%A
。然而,我没有得到预期的结果。它只是呼应出术语
%%A
。我想扩展脚本并检查当前处理的目录中是否存在文件。如果没有,则应该从当前处理的zip文件中提取。让我知道我是否应该为此问一个新问题。
echo%%a
7z.exe的上面一行
以完整路径输出处理过的文件
echo%%~dpA
只输出已处理文件的驱动器号和路径。如果您想修改使用此代码,但修改不起作用,最好问一个新问题。提示:环境变量(不是循环变量)在处理循环之前已展开,但在循环内部使用延迟展开除外。在命令提示窗口中输入
set/?
,然后从头到尾阅读帮助页面,以了解环境变量扩展延迟的原因。