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

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

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

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

如果变量包含引号或最后反斜杠脚本错误。

我怎样才能做到这一点?

windows batch-file cmd
2个回答
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将再次设置所有字符,但最后一个字符除外。

在剩余的批处理文件中,您必须用双引号将连接的字符串括起来。

顺便说一句:如果程序路径是包含批处理文件的文件夹的路径,那么顶部所需的全部是:

set "ProgramPath=%~dp0"
set "ProgramPath=%ProgramPath:~0,-1%"

要了解使用的命令及其工作方式,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • call /? ...解释%~dp0 ...参数0的驱动器和路径,这是批处理文件本身总是以反斜杠和%~f0结尾...参数0的完整文件名,文件扩展名和路径。
  • copy /?
  • echo /?
  • goto /?
  • if /?
  • mkdir /?
  • pause /?
  • rem /?
  • set /?

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
© www.soinside.com 2019 - 2024. All rights reserved.