批处理文件将变量传递给文本文件

时间:2015-02-23 07:30:21

标签: variables batch-file text echo text-files

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

5 个答案:

答案 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之外,它应该有效。

你到底想做什么?也许这是一种更简单的方法。