如何使用批处理文件在单个变量中传递多个值

时间:2014-10-09 09:32:37

标签: windows batch-file cmd

我想在变量中传递多个值。这是我的代码

@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开头的所有行都将被删除,但没有删除任何行。这段代码有什么问题?

3 个答案:

答案 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