用户必须编辑我的批处理文件以设置变量。例如,这一行:
REM Enter there you program path:
set Path1="C:\folder1\folder2"
我希望将Path1
的价值带入:
C:\folder1\folder2\
用户可以写\或不引用,最后反斜杠
C:\folder1\folder2\
C:\folder1\folder2
"C:\folder1\folder2"
甚至可能是一些无法预料的情况。我的脚本使用了这个字符串的连接,所以我需要一个视图。例如:
mkdir %Path1%\plugins
copy %Path2% %Path1%\plugins\plugin.dll
%Path1%\program.exe
如果变量包含引号或上一个反斜杠脚本错误。
我该怎么做?
答案 0 :(得分:0)
随着Path1
稍后与其他字符串连接,第一个双引号应该留给变量名而不是等号,因为这会产生很大的不同,请参阅How to set environment variables with spaces?和Why is no string output with 'echo %var%' after using 'set var = text' on command line?
因此,在批处理文件的顶部应该有:
REM Enter here you program path:
set "ProgramPath=C:\folder1\folder2"
在批处理文件中,您可以使用字符串替换来确保环境变量ProgramPath
保存没有双引号且末尾没有反斜杠的路径。
if not defined ProgramPath goto InvalidProgPath
set "ProgramPath=%ProgramPath:"=%"
if not defined ProgramPath goto InvalidProgPath
if "%ProgramPath:~-1%" == "\" set "ProgramPath=%ProgramPath:~0,-1%"
if not defined ProgramPath goto InvalidProgPath
if not exist "%ProgramPath%\" goto InvalidProgPath
rem Other commands as shown below.
mkdir "%ProgramPath%\plugins"
copy "%Path2%" "%ProgramPath%\plugins\plugin.dll"
"%ProgramPath%\program.exe"
goto :EOF
:InvalidProgPath
echo The program path as defined with ProgramPath at top of batch file
echo %~f0
echo is invalid. Please correct the path.
echo/
pause
第二个命令行将ProgramPath
的所有双引号替换为空,即从程序路径字符串中删除所有双引号。
第四行比较区分大小写的ProgramPath
值的最后一个字符和反斜杠,如果此字符是反斜杠,则ProgramPath
将再次设置所有字符,但最后一个字符除外。< / p>
在剩余的批处理文件中,您必须用双引号括起连接的字符串。
顺便说一句:如果程序路径是包含批处理文件的文件夹的路径,那么顶部所需的全部是:
set "ProgramPath=%~dp0"
set "ProgramPath=%ProgramPath:~0,-1%"
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
call /?
...解释%~dp0
...参数0的驱动器和路径,批处理文件本身总是以反斜杠和%~f0
结尾... ...的完整文件名带有文件扩展名和路径的参数0。copy /?
echo /?
goto /?
if /?
mkdir /?
pause /?
rem /?
set /?
答案 1 :(得分:0)
另外@Mofi回答,我为格式化路径做了一个小函数:
REM Use double quote "" in CALL parameter ""%param1%""
:formatPath
set "var=%1"
set "var=%var:"=%"
if "%var:~-1%" == "\" set "var=%var:~0,-1%"
set "_return=%var%"
set "var="
goto :eof
使用它的例子:
@echo off
REM Evil user entered wrong quotes
set Path1="C:\Program Files (x86)\!HALO\"
call :normalizeFolderPath ""%Path1%""
set "Path1=%_return%"
set "_return="
echo %Path1%
pause
goto :eof
REM Use double quote "" in CALL parameter ""%param1%""
REM Returns _return variable
:normalizeFolderPath
set "var=%1"
set "var=%var:"=%"
if "%var:~-1%" == "\" set "var=%var:~0,-1%"
set "_return=%var%"
set "var="
goto :eof