我想在变量中传递多个值。这是我的代码
@echo off
setlocal EnableDelayedExpansion
set LF=^
set "content="
for /f "delims=" %%x in (file.txt) do (
set "content=!content!%%x!LF!"
Type paul.txt | findstr /I /V /C:"!content!" > edit.txt
)
echo(!content!
PAUSE
endlocal
基本上,此代码打开文件file.txt,并使用该文件的内容并传递给变量" content"。
示例:
file.txt包含ff:
A
B
因此,文件paul.txt上以A或B开头的所有行都将被删除,但没有删除任何行。这段代码有什么问题?
答案 0 :(得分:1)
哎哟!你完全错了。首先,我将列出一些错误。然后我会告诉你一个非常简单的解决方案。
1)无需将所有行放在单个变量中。每行代表一个独立的搜索词。将所有行(包括换行符)放在变量中并使用/C:string
选项中的行将整个内容视为单个搜索词,尝试将文件内容与整个词匹配,包括换行符。
2)即使你确实想要一个变量中的所有行,你的逻辑也是错误的。您正在每次迭代时执行FINDSTR,但您只想在完全填充变量后执行一次。
3)延迟扩展无法按预期工作,因为您尝试将其与管道一起使用 - 该值过早扩展。请参阅https://stackoverflow.com/a/8194279/1012053。
4)您声明要使用文件内容排除 开始 的行。您需要相应地指示FINDSTR。
5)不是错误,但根本不需要使用管道。只需让FINDSTR直接读取paul.txt。
简单的解决方案:
findstr /viblg:file.txt paul.txt >edit.txt
请注意,我在单个/
之后连接了FINDSTR选项。这是众多undocumented FINDSTR features之一。
/G:file
选项指示FINDSTR将文件中的每一行用作独立的搜索字符串。
/L
选项强制将搜索字符串解释为文字字符串(与正则表达式相对)
/B
选项会强制搜索字词仅匹配行的开头。
答案 1 :(得分:0)
这会在你的情况下完成这项工作吗?
findstr /r /i /v /c:"^A" /c:"^B" file.txt >file2.txt
答案 2 :(得分:0)
findstr /l /v /g:file.txt Paul.txt > edit.txt
在Paul.txt
中找到不匹配的行,从file.txt
读取搜索字符串,将输出发送到edit.txt
如果匹配需要在整行上,请在参数列表中包含/x