批处理文件:获取绝对路径

5 batch-file

我收到一个包含以下内容的文件:

\direcotry1\directory2\directory3\file1
\direcotry1\file2
\direcotry1\directory2\directory3\directory4\file3
\direcotry1\file4
\direcotry1\directory2\file5
file6
Run Code Online (Sandbox Code Playgroud)

文件中的文件数量和目录数量是可变的.

我需要的只是路径.

\direcotry1\directory2\directory3\ for file1
\direcotry1\ for file2
\direcotry1\directory2\directory3\directory4\ for file3
\direcotry1\ for file4
\direcotry1\directory2\ for file5
and nothing for file6
Run Code Online (Sandbox Code Playgroud)

我使用了变量%% ~pi,除了最后一个之外,它适用于所有人.对于最后一个它返回\ cft\
我猜是\ cft \被返回,因为调用bat文件的程序从那里启动它.

FOR /F %%i in (test.txt) DO (
  echo %%~pi
  command1
  command2
)
Run Code Online (Sandbox Code Playgroud)

有谁知道我怎么能避免batfile返回\ cft \?我希望蝙蝠在没有路径时什么也不返回.

非常感谢您的帮助.

pax*_*blo 3

经过一些测试后,似乎"%%~pi"会将当前目录作为每个不以 . 开头的元素的前缀"\"。我认为它假设是这种情况,因为如果您只使用“文件”,这将是您打开的文件 - 类似地,“x\y”将是文件“\x\y”。

例如,以下脚本:

@echo off
for /f %%i in (test.txt) DO (
    echo %%~pi
)
Run Code Online (Sandbox Code Playgroud)

当在以下文件上运行时:

\directory1\directory2\directory3\file1
\directory1\file2
\directory1\directory2\directory3\directory4\file3
\directory1\file4
\directory1\directory2\file5
file6
x\y
\z
Run Code Online (Sandbox Code Playgroud)

将产生(我在 \Documents and Settings\Administrator 目录中):

\directory1\directory2\directory3\
\directory1\
\directory1\directory2\directory3\directory4\
\directory1\
\directory1\directory2\
\Documents and Settings\Administrator\
\Documents and Settings\Administrator\x\
\
Run Code Online (Sandbox Code Playgroud)

所以答案很简单。首先检测那些不以开头的行"\"并特殊对待它们。以下脚本:

@echo off
setlocal enableextensions enabledelayedexpansion
for /f %%i in (test.txt) DO (
    set ch0=%%i
    set ch0=!ch0:~0,1!
    if not "!ch0!"=="\" (
        echo.
    ) else (
        echo.%%~pi
    )
)
endlocal
Run Code Online (Sandbox Code Playgroud)

生成您想要的输出,如下所示:

\directory1\directory2\directory3\
\directory1\
\directory1\directory2\directory3\directory4\
\directory1\
\directory1\directory2\


\
Run Code Online (Sandbox Code Playgroud)

setlocal/endlocal 是我现在在大多数脚本中放入的东西,因为它可以防止环境变量泄漏到一级并且延迟扩展非常出色(使用而"!"不是"%")。

我使用 ch0 临时变量来获取文件的第一个字符("!ch0:~0,1!"是一个子字符串运算符,“在 ch0 变量的偏移量 0 处获取一个字符”,"%"如果不进行延迟扩展,也可以使用该版本)。

然后我将其与 进行比较"\"。如果它是斜杠,我会回显"%%~pi",否则我只是根据您的规范输出一个空行。