iau*_*eee 3 for-loop batch-file filter duplicates findstr
我正在创建一个文本文件,显示文件夹中每个文件的文件扩展名.我想摆脱重复,因为它为每个文件创建一行文本.
经过一些搜索后,我发现我应该使用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
)
Run Code Online (Sandbox Code Playgroud)
但它仍然将初始文件留空(如预期的那样),同时仍然将每一行复制到filtered.txt文件.我很乐意得到一些帮助.
您可以filtered.txt立即创建文件,不需要initial.txt:
> "filtered.txt" rem/
for %%A in ("*.*") do (
> nul find /I "%%~xA" "filtered.txt"
if ErrorLevel 1 (
>> "filtered.txt" echo %%~xA
)
)
Run Code Online (Sandbox Code Playgroud)
我在这里使用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
)
)
Run Code Online (Sandbox Code Playgroud)
这段代码与上面几乎相同; 唯一的区别是先前创建initial.txt(可能包含重复项),以及枚举其内容(by for /F)而不是直接枚举当前目录.