如何格式化用户输入文件夹路径



用户必须编辑我的批处理文件以设置变量。例如,这一行:

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

最新更新