我收到一个包含以下内容的文件:
\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 \?我希望蝙蝠在没有路径时什么也不返回。
非常感谢您的帮助。
答案 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