2017-04-10 266 views
0

我很新的命令脚本,请在下面的问题帮助。如何从批处理脚本中的文件路径获取目录路径

我有下面的for循环,它返回C:\test文件夹及其子文件夹中可用文件的路径。我想要文件路径中的目录路径例如。

如果for循环返回C:\test\scripts\sample.txt但我只想要C:\test\scripts。对于这个我写下面的命令

For /R C:\seq\ %%a IN (*) do (
set filename="%%a" 
echo %filename% 
) 

这是不分配文件路径到变量文件名,所以我可以得到它的目录路径。请在批处理脚本中帮助从文件路径获取目录路径。

+3

看看'for /?'特别是'〜' - 修饰符 – LotPings

回答

0

你只需要使用dp修改:

set filename=%%~dpa 

此外,为echo变量,你需要与延迟扩展,扩展它:

setlocal enabledelayedexpansion 
For /R C:\seq\ %%a IN (*) do (
set filename="%%a" 
echo !filename! 
) 
0
For /R C:\seq\ %%a IN (*) do (
set filename="%%~dpa" 
call echo %%filename:~0,-1%% 
) 

请参阅许多SO文章约delayed expansion其他方式显示filename

~dp指定%%a的驱动器和路径。

看到for /?|more从提示信息

:~0,-1echo选择所有文字栏最后一个

看到set /?从提示文档

0

要获得路径文件或目录的父目录,请使用for变量引用的~dp modifier。如果后\会干扰,你可以使用另一个for循环,如下图所示:

for /R "C:\test\scripts" %%I IN ("*.txt") do (
    echo Path to parent with trailing `\`: "%%~dpI" 
    echo Path to parent with trailing `\.`: "%%~dpI." 
    for /D %%J in ("%%~dpI.") do (
     echo Pure path to parent: "%%~fJ" 
    ) 
) 

让我推荐给删除由sub-string expansion尾部的反斜杠(你需要delayed expansion内循环时在做的,正如其他人所说的那样),因为可能会出现导致路径不再指向原始位置的情况。例如,路径D:\指向驱动器D:根目录目录;删除\后,路径为D:,该路径指向驱动器目录当前。使用上述技术避免了这样的问题。

相关问题