当我向其提供包含括号的当前值的变量时,批处理函数出错

问题描述 投票:0回答:1

我正在尝试编写一个 .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!"

但这并没有解决问题

感谢您的帮助!

batch-file arguments call local-variables parentheses
1个回答
0
投票

您的脚本导致错误,但原因不是括号,因为您已经通过使用双引号变量解决了这个问题,尤其是在每个 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
© www.soinside.com 2019 - 2024. All rights reserved.