用户必须编辑我的批处理文件以设置变量。例如,这一行:
REM Enter there you program path:
set Path1="C:folder1folder2"
我想将Path1
的值带到形式:
C:folder1folder2
用户可以写或不引用,最后一个后背
C:folder1folder2
C:folder1folder2
"C:folder1folder2"
甚至可能是一些不可预见的情况。我的脚本与此字符串使用一些串联,因此我需要一个视图。例如:
mkdir %Path1%plugins
copy %Path2% %Path1%pluginsplugin.dll
%Path1%program.exe
如果变量包含引号或最后的后斜线脚本错误。
我该怎么做?
随着 Path1
的稍后与其他字符串连接,第一个双引号应留在变量名称中,而不是在相等的符号之后,因为这会产生很大的不同,请参阅如何设置带有空格的环境变量?为什么在命令行上使用" set var = text"之后,没有" echo%var%"的字符串输出?
因此,在批处理文件的顶部应该有:
REM Enter here you program path:
set "ProgramPath=C:folder1folder2"
在批处理文件中,您可以使用字符串替换来确保环境变量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%pluginsplugin.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
再次设置为所有字符,所有字符都具有最后一个字符。
在剩余的批处理文件中,您必须将串联字符串包装在双引号中。
顺便说一句:如果程序路径是包含批处理文件的文件夹的路径,则顶部所需的所有内容均为:
set "ProgramPath=%~dp0"
set "ProgramPath=%ProgramPath:~0,-1%"
用于了解使用的命令及其工作方式,打开命令提示符窗口,执行以下命令,并完全仔细阅读所有命令显示的所有帮助页面。
-
call /?
...解释%~dp0
...驱动器和参数路径0是批处理文件本身总是以backslash和%~f0
结尾...参数的完整文件名0带文件扩展名和路径。 -
copy /?
-
echo /?
-
goto /?
-
if /?
-
mkdir /?
-
pause /?
-
rem /?
-
set /?
另外@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