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

batch file passing variable to a text file

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
 )

下面的代码有效。它传递每个文件的路径。如果子目录中有多个文件,它会传递与文件数一样多的相同路径。我不想要它。我想通过相同的路径一次。

 FOR /r %%a IN (*) DO ECHO %%~da%%~pa>>Liste.txt

IF %pth% 条件放在 FOR 之外,它应该可以工作。

你到底想做什么?也许有更简单的方法。

dir /ad /s /b >> liste.txt

这应该与您的代码尝试执行的操作相同:将所有子文件夹附加到目标文件中。

原始代码的问题在于解析器如何处理变量。在批处理文件中,当到达一行或一行块时,解析器会删除所有变量读取,并在执行代码之前用它的值替换它们。因此,如果在 line/block 中更改了一个变量,则无法在相同的 line/block 中检索此更改的值,因为读取操作已被删除。通常的处理方法是启用延迟扩展。这允许将需要的变量读取语法从 %var% 更改为 !var!,向解析器指示必须延迟读取操作,直到代码被执行。

因此,在您的情况下,过滤文件的路径

setlocal enabledelayedexpansion
set "pth="
FOR /r %%a IN (*) DO (
    IF NOT "!pth!"=="%%~dpa" (
        ECHO "%%~dpa">>Liste.txt
        SET "pth=%%~dpa"
    )
)

你还没有很清楚地告诉用户你想做什么。

基本上,在块语句 (a parenthesised series of statements) 中,整个 块被解析并 then 执行。块中的任何 %var% 将被该变量的值替换 在块被解析时 - 在执行块之前 - 同样的事情适用于 FOR ... DO (block).

因此,IF (something) else (somethingelse) 将在遇到 IF 时使用 %variables% 的值执行。

克服此问题的两种常见方法是 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"
 )

应该可以(我没试过)

for /r /d %%a in (*) do >>liste.txt echo %%a

这可能更容易(生成所有子目录的列表)

注意 %%~da%%~pa 等同于 %%~dpa

已编辑以包括必需的 "

@Magoo:谢谢。你给我看是对的。 下面的代码是我想要的;但是 "if conditional" 不起作用:("!pth!"==%%~dpa) 我认为检查总是 return 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

终于成功了。感谢大家。 代码:

@ECHO off
setlocal enabledelayedexpansion
FOR /r %%a IN (*) DO (
    IF NOT "!pth!"=="%%~dpa" (
        ECHO %%~dpa>>Liste.txt 
    )
SET "pth=%%~dpa"
)