我可以删除输入的文件夹名用户的最后一个\吗?

时间:2019-07-18 09:20:42

标签: windows batch-file

我正在制作批处理脚本,它不需要具有文件夹名的最后\,例如:C:\Windows(不是C:\Windows\)。但是输入文件夹名是在用户方面。 是否可以删除 上的最后一个\

我尝试不删除\并做到了;这没用!

if /i "%~1"=="--dir"     set "Directory_to_inst=%~2"   & shift & shift
echo "%Directory_to_inst%\blah

我不想这样显示:

输入C:\Windows\

输出C:\Windows\blah

当前为C:\Windows\\blah

3 个答案:

答案 0 :(得分:0)

示例:

@Echo Off
If /I "%~1"=="--dir" (
    Set "Directory_to_inst=%~2"
    Call :ChkDir
    Shift
    Shift
)
Echo "%Directory_to_inst%\blah"
Pause
GoTo :EOF

:ChkDir
If Not "%Directory_to_inst:~-1%"=="\" Exit /B
Set "Directory_to_inst=%Directory_to_inst:~,-1%"
GoTo ChkDir

您可能还希望为 / 包括其他方法,因为一些傻瓜无法理解使用反斜杠作为路径分隔符。

答案 1 :(得分:0)

好吧,像C:\Windows\\blah这样的路径实际上并没有害处,它指向与C:\Windows\blahC:\Windows\none\..\blahC:\.\\Windows\\\blah相同的位置。

但是在附加另一个元素之前 解析提供的路径是有意义的,因为如果提供了类似C:的路径,则该路径指向 current 驱动器C:的目录,附加\blah,这会将父位置更改为驱动器的 root 目录(只有C:blah指向< em>当前一个!)。

一种很好的实现方法是将~f modifier应用于提供的命令行参数,然后附加\blah,最后使用for循环并再次应用~f修改循环元变量:

for %%D in ("%~f2\blah") do echo(%%~fD

因此,例如:

  • C:\WindowsC:\WindowsC:\Windows\blahC:\Windows\blah
  • C:\Windows\C:\Windows\C:\Windows\\blahC:\Windows\blah
  • C:\Windows\none\..C:\WindowsC:\Windows\blahC:\Windows\blah
  • C:\.\\Windows\\\C:\Windows\C:\Windows\\blahC:\Windows\blah
  • C:\C:\C:\\.C:\blah
  • C:(例如,以\Users作为当前目录)→C:\UsersC:\Users\blahC:\Users\blah

可能的负面影响是for循环解析global wildcards*?,以及未公开的<和{ {1}})。但是您可以禁止使用string manipulation syntax这样的字符,例如:

>

一种更通俗的处理通配符的方法是使用set "ARGV=%~2" if not defined ARGV (>&2 echo ERROR: missing argument!) & goto :EOF if not "%ARGV%" == "%ARGV**=:%" goto :CONTINUE if not "%ARGV%" == "%ARGV*?=:%" goto :CONTINUE if not "%ARGV%" == "%ARGV*<=:%" goto :CONTINUE if not "%ARGV%" == "%ARGV*>=:%" goto :CONTINUE >&2 echo ERROR: wildcards denied! goto :EOF :CONTINUE 循环来解析通配符,而不是像for(没有%~2修饰符!)这样的参数引用,它可以不是:

~f

for %%A in ("%~2") do ( if /I "%~2" == "%%~A" (goto :CONTINUE) else (goto :EXCEPTION) ) :EXCEPTION >&2 echo ERROR: wildcards denied! goto :EOF :CONTINUE 循环可解决for中出现的潜在通配符;如果没有,%~2等于%%~A,所以继续执行脚本;如果遇到通配符并因此解析(除去/替换)通配符,则%~2的值将永远不等于%%~A,并且%~2部分将永远不会到达。
实际上,:CONTINUE子句对于此功能不是必需的。但是,当带有通配符的参数匹配很多项目时,else循环将迭代多次,直到到达for节为止;使用:EXCEPTION子句时,它已在第一次循环迭代后输入。

答案 2 :(得分:0)

只需要CD即可。

if /i "%~1"=="--dir"     set "Directory_to_inst=%~2"   & shift & shift
cd %Directory_to_inst%
cd blah
set _DIRECTORY_one=%cd%
echo %DIRECTORY_one%

这可行。