我正在创建一个文本文件,显示文件夹中每个文件的文件扩展名。我想摆脱重复,因为它为每个文件创建了一行文本。
经过一些搜索,我发现我应该使用findstr覆盖初始文件,并删除已删除特定扩展名的新版本(在我将其写入过滤后的文件之后)。
for %%A in (*.*) do echo %%~xA >> initial.txt
for /F %%B in (initial.txt) do (
echo %%B >> filtered.txt
for /F %%C in (initial.txt) do findstr /v %%C initial.txt > initial.txt
)
但它仍然将初始文件留空(如预期的那样),同时仍然将每一行复制到filtered.txt文件。 我很乐意得到一些帮助。
答案 0 :(得分:6)
您可以立即创建文件filtered.txt
,不需要initial.txt
:
> "filtered.txt" rem/
for %%A in ("*.*") do (
> nul find /I "%%~xA" "filtered.txt"
if ErrorLevel 1 (
>> "filtered.txt" echo %%~xA
)
)
我在这里使用find
而不是findstr
,因为只搜索简单的文字字符串。如果遇到至少一个匹配,则find
(如findstr
)将ErrorLevel
设置为0
,如果未找到匹配,则设置为1
。
根据返回的ErrorLevel
,%%~xA
中当前迭代的文件扩展名会被回显并重定向到filtered.txt
。因此,如果filtered.txt
已包含当前项目,则不会回显它,但如果未遇到匹配项,则该项目将附加到文件中。
第一行为filtered.txt
创建一个空文件find
,使其首次执行时不会失败。
如果您仍想使用文件initial.txt
,可以执行以下操作:
>> "initial.txt" (
for %%A in ("*.*") do echo %%~xA
)
> "filtered.txt" rem/
for /F "usebackq eol=| delims=" %%A in ("initial.txt") do (
> nul find /I "%%~xA" "filtered.txt"
if ErrorLevel 1 (
>> "filtered.txt" echo %%~xA
)
)
此代码几乎与上述相同;唯一的区别是先前创建initial.txt
(可能包含重复项),以及其内容的枚举(通过for /F
),而不是直接枚举当前目录。