3

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

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

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

C:\Folder1\Folder2\

我已经阅读过这样的线程我需要%~dp00我认为作为参数传递的地方使用。我已经尝试过%~dpVAR1,但这不起作用。如何获得我正在寻找的输出,但变量包含文件路径?

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

任何帮助深表感谢!

谢谢!

安德鲁

4

4 回答 4

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 contains 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
于 2013-02-13T12:22:09.833 回答
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. 这是因为它正在使用原始值的较小版本重新创建变量(这很难解释)。如您所见,上面的模板中有一个5where offsetwas。这是因为它跳过了前 5 个字符并将变量设置为下一个amount1字符(我真的希望你能得到这个)。

所以基本上,它将一个变量设置为一个不同(或相同)变量的较短值,该变量由偏移量和包含在其中的字符数量决定。

我真的希望这会有所帮助,因为我可能一个字都听不懂。

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

于 2013-02-13T08:32:56.290 回答
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
于 2020-07-19T06:59:45.973 回答
-2

这会起作用吗:

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

其中 Echo 是您的 exe 的名称。

%CD% 也可以工作:Echo %CD%

于 2015-04-18T00:24:46.787 回答