批处理文件将变量传递给文本文件
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"
)
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"
)