由于我有所有文件的多个备份副本,因此我使用以下批处理文件来重命名文件,这样我就不必进入每个驱动器/文件夹手动重命名文件。批处理文件可以很好地重命名文件。但是,在重命名文件夹时,有时它可以正常工作,有时它会生成另一个具有正确名称的文件夹。发生这种情况时,并不是每个文件夹都需要重命名,只有部分文件夹需要重命名。
批处理文件有问题吗?如何纠正?
chcp 65001
if exist C:\rename-all-4.txt del c:\rename-all-4.txt
SETLOCAL EnableDelayedExpansion
(for /f "tokens=1,2 delims=;" %%A in ('"TYPE C:\RENAME-ALL.txt"') do (
echo %%A | find /i "\"
if errorlevel 1 (
RENAME "D:\!mypath!%%A" "%%B"
RENAME "E:\!mypath!%%A" "%%B"
RENAME "\\PC1\D\!mypath!%%A" "%%B"
RENAME "\\PC1\E\!mypath!%%A" "%%B"
) ELSE (
echo "found pattern"
echo %%A
set mypath=%%A
echo mypath is !mypath!
)
)
) >> C:\RENAME-ALL-4.txt 2>&1
endlocal
CD /D C:\
以下是缩短的输入文件。运行批处理文件后,原文件夹(中国人民银行_files)仍然存在,同时还存在一个新文件夹(中國人民銀行_files)。
News\
中国人民银行_files;中國人民銀行_files
答案1
@echo off
setlocal enabledelayedexpansion
cd /d "%~dp0" & >nul chcp 65001
2>nul del/q /f .\rename-all-4.txt
>> .\rename-all-4.txt 2>&1 (
for /f tokens^=1-2^delims^=^; %%a in ('
type c:\rename-all.txt')do echo=%%~a|>nul findstr /e \ && (
echo="found pattern" && echo=%%~a
set "mypath=%%~a" && call echo=mypath is !mypath!
) || (
ren "d:\!mypath!%%~a" "%%~b"
ren "e:\!mypath!%%~a" "%%~b"
ren "\\pc1\d\!mypath!%%~a" "%%~b"
ren "\\pc1\e\!mypath!%%~a" "%%~b"
))
endlocal && CD /D C:\
- 这是一个错误的语法:
if errorlevel 1 ...
if errorlevel ???? 1 ...
errorlevel equal integer ::
if !errorlevel! equ 1 ...
if %errorlevel% equ 1 ...
另外,尝试将errorlevel
条件替换为运算符&&
和||
关于
errorlevel
在.bat
vs.cmd
文件中使用。Old style .bat Batch files vs .cmd Batch scripts. There is a key difference between the way .CMD and .BAT batch files set errorlevels
来源链接ss64.comA .BAT batch script running the 'new' internal commands: APPEND, ASSOC, PATH, PROMPT, FTYPE and SET will only set ERRORLEVEL if an error occurs. So if you have two commands in the batch script and the first fails, the ERRORLEVEL will remain set even after the second command succeeds.
进一步阅读:
[√]如果
[√]寻找
[√]For 循环
[√]For/F 循环
[√]!错误级别!%错误级别%
答案2
SETLOCAL EnableDelayedExpansion
(for /f "tokens=1,2 delims=;" %%A in ('"TYPE C:\RENAME-ALL.txt"') do if "%%B"=="" (
echo "found pattern"
echo %%A
set "mypath=%%A"
echo mypath is !mypath!
) ELSE (
RENAME "D:\!mypath!%%A" "%%B"
RENAME "E:\!mypath!%%A" "%%B"
RENAME "\\USER-PC1\D\!mypath!%%A" "%%B"
RENAME "\\USER-PC1\E\!mypath!%%A" "%%B"
)
) >> C:\RENAME-ALL-4.txt 2>&1
endlocal