2014-10-09 100 views
0

我想在变量中传递多个值。这里是我的代码如何使用批处理文件在单个变量中传递多个值

@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的并用,并传递给变量“内容”这个文件的内容。

实施例:

file.txt的包含FF:

A 
B 

所以,所有的行开始A或B上的文件paul.txt将被删除,但没有线被移除。这段代码有什么问题?

回答

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选项强制搜索词条中以仅匹配行的开头被解释为文字字符串(而不是正则表达式)。

+0

谢谢。这就是我正在寻找的:) – PeterS 2014-10-09 12:33:14

0

这会在你的情况下完成这项工作吗?

findstr /r /i /v /c:"^A" /c:"^B" file.txt >file2.txt 
+0

是的,但我想要使用的文件内容 – PeterS 2014-10-09 09:54:09

+0

您的代码会给你在文件内'paul.txt'的两个副本,他们都不会丢失所有以A或B开头的行。 – foxidrive 2014-10-09 10:05:46

+0

文件的内容.txt将用于删除paul.txt中的行。然后一旦删除,edit.txt将成为最终文件 – PeterS 2014-10-09 10:25:12

0
findstr /l /v /g:file.txt Paul.txt > edit.txt 

查找不匹配行Paul.txt,从file.txt阅读搜索字符串,将输出发送到edit.txt

如果比赛必须在整个线路,包括/x列表的论点

相关问题