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

时间:2009-03-17 13:05:23

标签: batch-file

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

\direcotry1\directory2\directory3\file1
\direcotry1\file2
\direcotry1\directory2\directory3\directory4\file3
\direcotry1\file4
\direcotry1\directory2\file5
file6

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

我需要的只是路径。

\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

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

FOR /F %%i in (test.txt) DO (
  echo %%~pi
  command1
  command2
)

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

非常感谢您的帮助。

4 个答案:

答案 0 :(得分:3)

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

例如,以下脚本:

@echo off
for /f %%i in (test.txt) DO (
    echo %%~pi
)

在以下文件上运行时:

\directory1\directory2\directory3\file1
\directory1\file2
\directory1\directory2\directory3\directory4\file3
\directory1\file4
\directory1\directory2\file5
file6
x\y
\z

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

\directory1\directory2\directory3\
\directory1\
\directory1\directory2\directory3\directory4\
\directory1\
\directory1\directory2\
\Documents and Settings\Administrator\
\Documents and Settings\Administrator\x\
\

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

@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

生成所需的输出,如下所示:

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


\

setlocal / endlocal是我现在在大多数脚本中添加的内容,因为它可以防止环境变量泄漏一个级别,延迟扩展非常棒(使用"!"代替"%")。

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

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

答案 1 :(得分:2)

您可以将要忽略的目录存储在变量中:

FOR %%i in (file) do set ignoredir=%%~pi
FOR /F %%i in (test.txt) DO (
  if not %%~pi == %ignoredir% echo %%~pi
)
set ignoredir=

这可以按预期工作。输出:

\direcotry1\directory2\directory3\
\direcotry1\
\direcotry1\directory2\directory3\directory4\
\direcotry1\
\direcotry1\directory2\

答案 2 :(得分:0)

<强> UPDATE2:

正如Lieven所说,如果您可以强制执行test.txt文件中的所有内容都以“\”开头,那么您可以使用以下代码:

@echo off
FOR /F %%i in (test.txt) DO (
  if not "%%~pi" == "\" echo %%~pi
)

<强>更新

实际上,在再次阅读你的问题之后,我注意到你需要的是一个EXIST声明..

FOR / F %% i in(test.txt)DO(如果存在%% i echo %% ~pi command1 command2)

这是你需要的吗?

我的原帖......

调用批处理文件时,只需执行以下操作:

yourbatchfile.bat >nul 2>nul

任何进入stdout和stderr(你的屏幕显示)的东西都将被传送到没有地方,并且没有出现。请注意,该批处理文件绝对不会输出任何内容...

答案 3 :(得分:0)

这似乎是由于file6前面缺少反斜杠 是不是可以将输入更改为始终具有反斜杠?

您的输入将变为

\directory1\directory2\directory3\file1 
\directory1\file2 
\directory1\directory2\directory3\directory4\file3 
\directory1\file4 
\directory1\directory2\file5 
\file6