如何从cmd批处理文件中的变量获取目录路径

And*_*rew 3 cmd batch-file filepath

在我的批处理文件中,我有一个包含文件路径的变量:

SET VAR1=C:\Folder1\Folder2\File.txt
Run Code Online (Sandbox Code Playgroud)

我想提取目录结构和retreive:

C:\Folder1\Folder2\
Run Code Online (Sandbox Code Playgroud)

我已阅读线程像这样,我需要用%~dp0在那里0,我相信作为一个参数传递.我试过了,%~dpVAR1但那不起作用.如何获取我正在寻找的输出,但是包含文件路径的变量?

另外,为了使事情变得困难,我必须在一个IF条件下执行所有这一切,这意味着一旦变量被声明,我将需要引用它!而不是%(我已经setlocal enableextensions enabledelayedexpansion在我的脚本开头声明允许这个).

任何帮助深表感谢!

谢谢!

安德鲁

dbe*_*ham 8

您正在尝试在环境变量上使用参数扩展语法 - 这不起作用.但是做你想做的事情相对容易.

使用CALL(相对较慢):

(...
  call :getPath "!var!" var
  ...
)
exit /b

:getPath
set "%2=%~dp1"
exit /b
Run Code Online (Sandbox Code Playgroud)

使用FOR,假设变量不包含任何通配符(快速)

(...
  for %%F in ("!var!") do set "var=%%~dpF"
 ...
)
Run Code Online (Sandbox Code Playgroud)

使用FOR,如果变量可能包含通配符(也快)

(...
  for /f "delims=" %%F in ("!var!") do set "var=%%~dpF"
 ...
)
Run Code Online (Sandbox Code Playgroud)

注1:如果变量不包含完整路径,则所有解决方案都将尝试将名称解析为绝对路径,并返回完整的绝对路径.例如,如果var包含foobar\test.txt,则解决方案将包括当前目录的完整路径,即使找不到该文件也是如此.有点像c:\pathToCurrentDirectory\foobar\.

注2:上述所有解决方案都将删除路径中的所有引号.

注3:路径可能包含!字符,这会在扩展时导致问题,%~dp1或者%%~dpF因为您启用了延迟扩展.如果值包含^,!则延迟扩展将损坏两者!.有一个解决方案涉及保护!^.以下是适用于上述最后解决方案的演示.保护需要正常扩展,并且由于您在代码块内,因此至少需要一个CALL.它可以在没有子程序的情况下完成,但使用子程序更容易.子例程假定变量已命名var.

(...
  call :getPath
 ...
)
exit /b

:getPath
set "var=!var:"=!"
set "var=!var:^=^^^^!"
set "var=%var:!=^^^!%" !
for /f "delims=" %%F in ("!var!") do set "var=%%~dpF" !
exit /b
Run Code Online (Sandbox Code Playgroud)