簡體   English   中英

Windows批處理:即使錯誤級別為1,REN也不會停止

[英]Windows batch: REN does not halt even if errorlevel 1

我正在使用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也一樣。 一種可能的選擇是以某種方式使用正則表達式,但是盡管嘗試了,但我還是無法將它們包裹住。

有什么線索嗎? 非常感謝您的關注。

是的,您已經記錄了REN命令的工作原理-即使重命名失敗,它也將繼續完成,如果至少一個重命名失敗,它將報告ERRORLEVEL 1。

如果要在出現第一個錯誤時停止處理,則必須編寫自己的循環來重命名每個文件,一次重命名。 您不應該使用簡單的FOR循環,因為它可以在掃描整個目錄之前開始進行迭代,因此存在將同一文件重命名兩次的風險。 安全的做法是改為使用FOR / F和DIR / B / AD。

@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

for /f "eol=: delims=" %%F in (
  'dir /b /a-d "?%var1%?%var2%.S16"'
) do ren "%%F" "?%var1%?%var3%.S16" || goto :break
:break
echo Errorlevel: %errorlevel%
IF ERRORLEVEL 1 goto :FAIL
echo Success!
PAUSE
goto :eof

:FAIL
echo Errorlevel: %errorlevel%
echo I done goofed!
PAUSE
exit

注意 -REN使用的通配符規則一點都不直觀。 您應該看看Windows RENAME命令如何解釋通配符? 以確保您得到期望的結果。

將您的ren命令替換為

FOR /f "delims=" %%x IN ('dir /b /a-d "%sourcedir%\?%var1%?%var2%.S16" 2^>nul') DO REN "%sourcedir%\%%x" "?%var1%?%var3%.S16"&IF ERRORLEVEL 1 ECHO failed AT %%x&goto :EOF 

注意這是我的測試的直接補丁,在該補丁中,我將sourcedir設置為測試目錄。 對於您的情況,您需要進行適當的調整。

這將使目錄列表以基本形式出現而沒有目錄,然后將每個文件名分配給%%x然后嘗試重命名並解釋由此產生的錯誤errorlevel 如果失敗,請出示適當措施的名稱並紓困。

[edit] 2^>nul添加到dir命令中。

這將導致dir錯誤(如“找不到文件”)被定向到nowhere 需要使用脫字符號( ^ )告訴cmd >dir命令的一部分,而不是for

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM