我正在制作批处理脚本,它不需要具有文件夹名的最后\
,例如:C:\Windows
(不是C:\Windows\
)。但是输入文件夹名是在用户方面。
是否可以删除windows batch-file上的最后一个\
?
我尝试不删除\
并做到了;这没用!
if /i "%~1"=="--dir" set "Directory_to_inst=%~2" & shift & shift
echo "%Directory_to_inst%\blah
我不想这样显示:
输入C:\Windows\
输出C:\Windows\blah
当前为C:\Windows\\blah
答案 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
您可能还希望为 /
包括其他方法,因为一些傻瓜无法理解windows使用反斜杠作为路径分隔符。
答案 1 :(得分:0)
好吧,像C:\Windows\\blah
这样的路径实际上并没有害处,它指向与C:\Windows\blah
或C:\Windows\none\..\blah
或C:\.\\Windows\\\blah
相同的位置。
但是在附加另一个元素之前 解析提供的路径是有意义的,因为如果提供了类似C:
的路径,则该路径指向 current 驱动器C:
的目录,附加\blah
,这会将父位置更改为驱动器的 root 目录(只有C:blah
指向< em>当前一个!)。
一种很好的实现方法是将~f
modifier应用于提供的命令行参数,然后附加\blah
,最后使用for
循环并再次应用~f
修改循环元变量:
for %%D in ("%~f2\blah") do echo(%%~fD
因此,例如:
C:\Windows
→C:\Windows
→C:\Windows\blah
→C:\Windows\blah
; C:\Windows\
→C:\Windows\
→C:\Windows\\blah
→C:\Windows\blah
; C:\Windows\none\..
→C:\Windows
→C:\Windows\blah
→C:\Windows\blah
; C:\.\\Windows\\\
→C:\Windows\
→C:\Windows\\blah
→C:\Windows\blah
; C:\
→C:\
→C:\\.
→C:\blah
; C:
(例如,以\Users
作为当前目录)→C:\Users
→C:\Users\blah
→C:\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%
这可行。