我正在编写一个批处理文件,我可以在桌面上的文件夹中重命名xml文件名。
文件名(bb)中我的内容概述。
这是我的批处理脚本
@echo off
set /p fn=Enter Folder name:
if exist C:\Users\roberts\Desktop\%fn% (
set /p oldxmlname=Enter a old xml file name:
if exist C:\Users\roberts\Desktop\%fn%\%oldxmlname%.xml (
set /p newxmlname=Enter a new xml file name:
ren C:\Users\roberts\Desktop\%oldxmlname%.xml %newxmlname%.xml
echo file name changed successfully.
)
)else (
echo folder not found in path.
echo C:\Users\roberts\Desktop\%fn%
)
这是我的输出。文件名完全没有变化。
答案 0 :(得分:3)
在块语句(a parenthesised series of statements)
中,解析整个块并执行然后。在块执行之前,块中的任何%var%
将被该变量的值替换为块。
因此,IF (something) else (somethingelse)
将在遇到%variables%
时使用IF
的值执行。同样的评论适用于REN
。
解决此问题的两种常见方法是1)使用setlocal enabledelayedexpansion
并使用!var!
代替%var%
来访问已更改的var
或2}值以进行调用一个子程序,用于使用更改的值执行进一步处理。
如果使用ELSE
子句,则IF
- true命令必须为(parenthesised)
,)和 ELSE 必须位于同一物理线路上。如果ELSE
- true命令为(parenthesised)
,则ELSE
和(
必须位于同一物理行上。 必须是else
关键字两侧的空间。
示范:
@echo off
SETLOCAL
cls
set var=ORIGINAL
echo Start value of var=%var%
for %%i in (1) do (SET var=AFTER
ECHO var is %var% in the for loop
)
echo Final value of var=%var%
ENDLOCAL
ECHO.
echo ---- try again with ENABLEDELAYEDEXPANSION
ECHO.
setlocal enabledelayedexpansion
set var=ORIGINAL
echo Start value of var=%var%
for %%i in (1) do (SET var=AFTER
ECHO var is %var% not !var! in the for loop
ECHO Note: in the loop VAR has old value %var% and new value !var!
)
echo Final value of var=%var%
endlocal
请注意,根据var
或setlocal
的使用情况,setlocal enabledelayedexpansion
的值的解释方式会有所不同。 !var!
语法仅在delayedexpansion
模式下可用,并在块中修改时访问var
的值,
答案 1 :(得分:1)
您将\%fn%
从ren
命令中删除,因此您要求重命名的文件确实不存在。
您想要ren C:\Users\roberts\Desktop\%fn%\%oldxmlname%.xml %newxmlname%.xml
答案 2 :(得分:1)
这是一种不需要延迟扩展的方法,您的代码可以使用 更改变量并在循环中使用变量时,则需要延迟扩展。
有一些引号可以保护长文件/路径元素,并添加反斜杠来检测路径而不是文件。
@echo off
set /p fn=Enter Folder name:
if not exist "C:\Users\roberts\Desktop\%fn%\" (
echo The engines canna take the strain captain, try again!
goto :EOF
)
set /p oldxmlname=Enter a old xml file name:
if not exist "C:\Users\roberts\Desktop\%fn%\%oldxmlname%.xml" (
echo folder not found in path.
echo "C:\Users\roberts\Desktop\%fn%"
goto :EOF
)
set /p newxmlname=Enter a new xml file name:
ren "C:\Users\roberts\Desktop\%oldxmlname%.xml" "%newxmlname%.xml"
if not errorlevel 1 (
echo file name changed successfully.
) else (
echo oops! Something is fubar
)