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

时间:2013-02-13 07:57:55

标签: batch-file cmd filepath

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

SET VAR1=C:\Folder1\Folder2\File.txt

我想提取目录结构并进行检索:

C:\Folder1\Folder2\

我已阅读this之类的帖子,我需要使用%~dp0 0我认为%~dpVAR1作为参数传递。我尝试了IF但这不起作用。如何获取我正在寻找的输出,但是包含文件路径的变量?

另外,为了使事情变得困难,我必须在!条件下执行所有这些操作,这意味着一旦声明了变量,我将需要使用%而不是{来引用它{1}}(我已在脚本的开头声明setlocal enableextensions enabledelayedexpansion以允许此操作。)

非常感谢任何帮助!

谢谢!

安德鲁

4 个答案:

答案 0 :(得分:8)

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

使用CALL(相对较慢):

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

:getPath
set "%2=%~dp1"
exit /b

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

(...
  for %%F in ("!var!") do set "var=%%~dpF"
 ...
)

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

(...
  for /f "delims=" %%F in ("!var!") do set "var=%%~dpF"
 ...
)

注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

答案 1 :(得分:1)

我确实相信(再一次)许多问题都在同一主题上(字符串约束或分裂字符串)。

我没有给你完整的代码,而是给你一个模板,解释为什么%~dpVAR!不起作用。

首先,为什么%~dpVAR!无效。

在进入修饰符之前,让我们讨论一下参数。您可能知道批处理文件可以相互解析参数。可以通过在数字0-9前面使用单个百分号(%)来调用这些参数。据我所知(有人可能已经找到了解析更多内容的方法),只能解析9个参数。您可能认为这是错误的(有10个参数对吗?)。参数1-9被解析为批处理文件(或一个中的函数),%0是批处理文件(或函数名)的文件路径。如果你看,%~dp0与%0有一些(不是真的)相似之处。这将在下面讨论。

其次,术语%~dp0中包含修饰符。修饰符是修改变量的东西(仅在参数的情况下和在for循环中声明的那些,你知道具有双百分号的那些,如%% i)和参数。仅当d将参数扩展为路径时,修饰符p才会将参数展开为驱动器号。您可能认为这些会自相矛盾,但参数可以组合在一起以创建极其古怪的格式。

因此,正如您所看到的,您尝试使用变量名替换0失败,因为它没有为这些事情指定。

现在,转到模板。

您可以将变量约束(并将它们放入其他变量),如下所示: set variable=!variable:~offset,amount!

如果这看起来令人困惑,请不要担心,我即将解释这些组件。

首先,请注意没有/a开关。这是因为这不是一个数学函数(不知道为什么我添加了这个)。所以,在我解释它之前,这里是一个例子,说明它对变量名numbers的作用是什么,其值为0123456789

set numbers=!numbers:~5,1!

通过使用该行代码,numbers现在将等于5。这是因为它使用较小版本的原始值重新创建变量(这很难解释)。如您所见,上面的模板上有5 offset。这是因为它正在跳过前5个字符并将变量设置为下一个amount1字符(我真的希望你得到这个)。

基本上,它将变量设置为由偏移量和要包含的字符数确定的不同(或相同)变量的较短值。

我真的希望这会有所帮助,因为我可能不会理解这一点。

有人可以将这个可怜的家伙重定向到更好地解释这个问题的链接(我试过,好的!)?

答案 2 :(得分:0)

从变量中提取路径的完整示例:

@echo off
set /p Fullpath="Specify full path: "
call :getPath %Fullpath% filename folder
echo %filename%
echo %folder%
pause
exit /b

:getPath
set "%2=%~nx1"
set "%3=%~dp1"
exit /b

答案 3 :(得分:-1)

这会有效吗?

SET VAR1=C:\Folder1\Folder2\File.txt
echo %var1%

Echo是你的exe的名字。

%CD%也可以起作用:Echo%CD%

相关问题