【发布时间】:2016-01-28 14:14:57
【问题描述】:
我正在使用 REN 查找具有特定命名模式的文件并对其进行修改,如下所示:
REN "?%var1%?%var2%.S16" "?%var1%?%var3%.S16"
这会找到所有文件,如 aXaY.S16、bXaY.S16、cXbY.S16(等)并将它们重命名为 aXaZ.S16、bXaZ.S16、cXbZ.S16(等)。如果它找到它正在寻找的东西,它就可以正常工作。但是有一个问题:REN遇到错误不会停止操作。
为了证明是这样,我的脚本如下:
@echo off
set /p var1=Enter first var:
set /p var2=Enter second var:
set /p var3=Change second var to:
echo Searching for all files matching ?%var1%?%var2%.S16
REN "?%var1%?%var2%.S16" "?%var1%?%var3%.S16"
echo Errorlevel: %errorlevel%
IF ERRORLEVEL 1 goto :FAIL
echo Success!
PAUSE
goto :eof
:FAIL
echo I done goofed!
PAUSE
exit
我在一个包含几百个文件的文件夹中运行它。我搜索了匹配 ?0?a.S16 的文件(其中有大约 40 个结果)并要求它将“a”更改为“c”,因为我知道具有此名称的文件已经存在并且应该会产生冲突。
这是控制台输出(为简洁起见):
Enter first var: 0
Enter second var:a
Change second var to:c
Searching for all files matching ?0?a.S16
A duplicate file name exists, or the file
cannot be found.
A duplicate file name exists, or the file
cannot be found.
A duplicate file name exists, or the file
cannot be found.
...(etc)...
Errorlevel: 1
I done goofed!
Press any key to continue . . .
正如预期的那样,关于重复的投诉持续了大约 40 行。但是,正如您所见,Errorlevel 在进程结束时返回 1,而不是在出现问题的第一个迹象时退出,这是我宁愿这样做的。
我确实考虑过通过 FOR /f 传递它,但我不知道如何通过它传递搜索掩码。我知道 FOR 支持 '*' 通配符,但据我所知,它不支持 '?'和 REN 一样。一种可能的替代方法是以某种方式使用正则表达式,但尽管尝试过,我还是无法完全理解它们。
有什么线索吗?非常感谢您的观看。
【问题讨论】:
-
你的情况很混乱。
%errorlevel% is not the same aserrorlevel. The first is a new local variable namederrorlevel, the second is the built inERRORLEVEL`。第一个的值不一定与第二个的值匹配,因为它们不一样。 -
注意,感谢您提供的信息。但是脚本最终会检查 ERRORLEVEL,因此尽管出现了错误(那个 echo 只是作为调试输出,可以省略),但问题仍然存在。
-
@KenWhite:据我所知,
errorlevel变量的值与if errorlevel命令中使用的值相同。您能否发布一个这两个值不匹配的示例?我对这个主题非常感兴趣,以便在this post 上保持准确的信息。 TIA -
@KenWhite - 只要没有人明确定义用户定义的 ERRORLEVEL 变量,那么 OP 的代码就可以了。
%ERRORLEVEL%将优先扩展为用户定义的环境变量值,并且仅当未定义环境变量时才会默认为所需的 ERRORLEVEL 值。
标签: windows batch-file cmd