ECHO off
FOR /r %%a IN (*) DO (
IF NOT "%pth%"==%%~da%%~pa (
ECHO "%pth%">>Liste.txt
)
SET pth=%%~da%%~pa
)
我想只传递一次路径;不是每个文件都包含子目录。如何将%pth%
字符串变量传递给文本文件?为什么这段代码不起作用?
这段代码错了吗?
FOR /r %%a IN (*) DO (
SET pth=%%~da%%~pa
ECHO %pth%>>Liste.txt
)
以下代码有效。它传递每个文件的路径。如果子目录中有多个文件,则它会传递与o个文件一样多的路径。我不想要它。我希望一次传递相同的路径。
FOR /r %%a IN (*) DO ECHO %%~da%%~pa>>Liste.txt
答案 0 :(得分:2)
你没有说清楚(用一个例子)你想要做什么。
基本上,在块语句(a parenthesised series of statements)
中,解析整个块并执行然后。块中的任何%var%
将在解析块时被该变量的值替换 - 在块执行之前 - 同样的事情适用于FOR ... DO (block)
。< / p>
因此,IF (something) else (somethingelse)
将在遇到%variables%
时使用IF
的值执行。
解决此问题的两种常见方法是1)使用setlocal enabledelayedexpansion
并使用!var!
代替%var%
来访问已更改的var
或2}值以进行调用一个子程序,用于使用更改的值执行进一步处理。
因此
@ECHO off
setlocal enabledelayedexpansion
FOR /r %%a IN (*) DO (
IF NOT "!pth!"=="%%~dpa" (
ECHO "!pth!">>Liste.txt
)
SET "pth=%%~dpa"
)
应该有效(我还没试过)
OR
for /r /d %%a in (*) do >>liste.txt echo %%a
这可能更容易(生成所有子目录的列表)
请注意,%%~da%%~pa
相当于%%~dpa
编辑包含必需的“
答案 1 :(得分:0)
dir /ad /s /b >> liste.txt
这应该与您尝试执行的代码相同:将所有子文件夹附加到目标文件中。
原始代码的问题是解析器如何处理变量。在批处理文件中,当到达行或行块时,解析器将删除所有变量读取,在执行代码之前将其替换为值。因此,如果在行/块内部更改了变量,则无法在删除读取操作的同一行/块内检索此更改的值。处理它的常用方法是启用延迟扩展。这允许将所需的变量读取语法从%var%
更改为!var!
,向解析器指示必须延迟读取操作直到执行代码。
因此,在您的情况下,过滤文件的路径
setlocal enabledelayedexpansion
set "pth="
FOR /r %%a IN (*) DO (
IF NOT "!pth!"=="%%~dpa" (
ECHO "%%~dpa">>Liste.txt
SET "pth=%%~dpa"
)
)
答案 2 :(得分:0)
@Magoo:谢谢。你告诉我正确的。 下面的代码是我想要的;但“如果有条件”不起作用:(“!pth!”== %% ~dpa)我认为检查总是返回FALSE。
@ECHO off
setlocal enabledelayedexpansion
FOR /r %%a IN (*) DO (
IF NOT "!pth!"==%%~dpa (
ECHO %%~dpa>>Liste.txt
)
SET "pth=%%~dpa"
)
@Magoo:问题是上面的代码如何像下面的一行代码一样工作:
for /r /d %%a in (*) do >>liste.txt echo %%a
或者像@MC ND编写的那样:
dir /ad /s /b >> liste.txt
答案 3 :(得分:0)
最后这个有效。感谢大家。 代码:
@ECHO off
setlocal enabledelayedexpansion
FOR /r %%a IN (*) DO (
IF NOT "!pth!"=="%%~dpa" (
ECHO %%~dpa>>Liste.txt
)
SET "pth=%%~dpa"
)
答案 4 :(得分:-1)
将IF %pth%
条件置于FOR
之外,它应该有效。
你到底想做什么?也许这是一种更简单的方法。