我正在尝试编写一个 .bat 文件来更改我需要使用的一些文件的位置和名称,(我将它们移动到批处理文件所在的同一文件夹中)第一个文件工作正常,但是当函数的参数包含括号时,它会崩溃,我认为可能有一个简单的解决方案,但最近 3 天我无法在网上找到它。希望有人能帮助我,坦克!
这是代码:
@echo off
set "grupo1c=Califica G1.xlsx"
set "grupo2c=Califica G2.xlsx"
set "grupo1cl=C22023 Calificaciones.xlsx"
set "grupo2cl=C22023 Calificaciones (1).xlsx"
set "carpeta=C:\Users\Jay\Desktop\"
call :funcionmovren "%grupo1cl%" "%grupo1c%"
call :funcionmovren "%grupo2cl%" "%grupo2c%"
pause
:funcionmovren
set "nombrelargo=%~1"
set "nombrecorto=%~2"
if exist "%carpeta%%nombrelargo%" (
echo The file "%nombrelargo%" exists. Proceding to move it.
move "%carpeta%%nombrelargo%"
if exist "%nombrecorto%" (
del "%nombrecorto%"
echo Renaming "%nombrelargo%" to "%nombrecorto%"
REN "%nombrelargo%" "%nombrecorto%"
echo Opening file "%nombrecorto%"
start "" "%nombrecorto%"
) else (
echo Renaming "%nombrelargo%" to "%nombrecorto%"
REN "%nombrelargo%" "%nombrecorto%"
echo Opening file "%nombrecorto%"
start "" "%nombrecorto%"
)
) else (
echo The file "%nombrelargo%" does not exist, opening last report.
if exist "%nombrecorto%" (
start "" "%nombrecorto%"
) else (
echo The file "%nombrecorto%" is not in the work folder, please add "%nombrelargo%" to downloads folder to update it.
)
)
goto :eof
我尝试了很多方法来找出问题所在,最后我发现当变量 %nombrelargo% 的名称为 C22023 Calificaciones (1).xlsx 时,问题就出现了,我认为这与括号中出现的情况有关名称,但到目前为止我还没有找到解决方案。
我也尝试过使用
@echo off
setlocal enabledelayedexpansion
随着
call :funcionmovren "!grupo2cl!" "!grupo2c!"
但这并没有解决问题
感谢您的帮助!
您的脚本导致错误,但原因不是括号,因为您已经通过使用双引号变量解决了这个问题,尤其是在每个 echo 命令中。导致错误的原因是子例程之前缺少退出命令。在您的代码中,子例程被调用三次!,两次是因为您使用参数调用子例程,第三次是因为脚本在暂停命令后继续执行下一行。
我对您的脚本进行了一些更改/添加,主要是“良好实践”更改。 我添加了一项检查以防止脚本从桌面(移动命令的源目录)运行。 我已将目的地添加到移动命令中。 尽管省略时目标默认为当前目录,但移动命令的帮助中未记录这一点,因此最好在脚本中指定目标。 我通过从内部 if 语句中删除一些重复的代码来缩短子例程代码。 有关更多更改,请参阅下面的脚本。
@echo off
set "carpeta=C:\Users\Jay\Desktop\"
if /i "%~dp0"=="%carpeta%" (
echo This script can not be run from the desktop!
exit /b
)
rem use setlocal/endlocal to prevent pollution of the environment with variables from previous runs of this script
setlocal
rem set current directory to script dir
pushd %~dp0
echo Current directory is %CD%
set "grupo1c=Califica G1.xlsx"
set "grupo2c=Califica G2.xlsx"
set "grupo1cl=C22023 Calificaciones.xlsx"
set "grupo2cl=C22023 Calificaciones (1).xlsx"
call :funcionmovren "%grupo1cl%" "%grupo1c%"
call :funcionmovren "%grupo2cl%" "%grupo2c%"
pause
rem restore original directory
popd
rem restore original environment
endlocal
exit /b
:funcionmovren
set "nombrelargo=%~1"
set "nombrecorto=%~2"
if exist "%carpeta%%nombrelargo%" (
echo The file "%nombrelargo%" exists. Proceding to move it.
rem I have added "." as destination, this is equivalent to, but shorter than "%CD%"
move "%carpeta%%nombrelargo%" "."
if exist "%nombrecorto%" del "%nombrecorto%"
echo Renaming "%nombrelargo%" to "%nombrecorto%"
REN "%nombrelargo%" "%nombrecorto%"
echo Opening file "%nombrecorto%"
start "" "%nombrecorto%"
) else (
echo The file "%nombrelargo%" does not exist, opening last report.
if exist "%nombrecorto%" (
start "" "%nombrecorto%"
) else (
echo The file "%nombrecorto%" is not in the work folder, please add "%nombrelargo%" to downloads folder to update it.
)
)
goto :eof