Windows 在批处理脚本文本流或文件中标识或删除双引号字符

Windows 在批处理脚本文本流或文件中标识或删除双引号字符,windows,batch-file,text,escaping,double-quotes,Windows,Batch File,Text,Escaping,Double Quotes,我已经创建了用于从文件中读取%N%行的命令脚本。问题是当我处理文件的文本时,我不能从所有文本流的任何地方删除“”。“删除是非常必要的,因为如果文件的文本行有子字符串,如“text”,文本有特殊字符,甚至更糟的是脚本代码,那么脚本崩溃或工作方式不正确(包括由专门编写文本的程序员捕获的脚本控件)。 如果我不能从文本流中删除“,那么我只想确定文件(或者它的第一行%N%行,包括空行)至少包含一个”字符。 任何想法都值得赞赏,包括任何文件预处理。但主要目的是提高脚本速度 for /f "skip=2 de

我已经创建了用于从
文件中读取
%N%
行的命令脚本。问题是当我处理文件的文本时,我不能从所有文本流的任何地方删除
删除是非常必要的,因为如果文件的文本行有子字符串,如
“text”
文本有特殊字符,甚至更糟的是脚本代码,那么脚本崩溃或工作方式不正确(包括由专门编写
文本的程序员捕获的脚本控件)。
如果我不能从文本流中删除
,那么我只想确定
文件(或者它的第一行
%N%
行,包括空行)至少包含一个
字符。
任何想法都值得赞赏,包括任何
文件
预处理。但主要目的是提高脚本速度

for /f "skip=2 delims=" %%a in ('find /v /n "" "file" 2^>nul') do set "v=%%a"&call :v&if not errorlevel 1 goto FURTHER1
goto FURTHER2
:v
for /f "delims=[]" %%a in ("%v%") do set "line%%a=%v:*]=%"&if %%a lss %N% (exit /b 1) else exit /b 0
@ECHO关闭
SETLOCAL
设置“sourcedir=U:\sourcedir”
设置“filename1=%sourcedir%\q39558311.txt”
设置“tempfilename1=%sourcedir%\q39558311#.txt”
>“%tempfilename1%”回显(“
SET/a linefound=0
对于/f“tokens=1 delims=:”%%a IN('findstr/n/g:“%tempfilename1%”“%filename1%”)DO(
如果%%a全球技术法规2套/a线路找到=%%a和GOTO报告
)
:报告
在第%linefound%行找到回显报价
删除“%tempfilename1%”
后藤:EOF
您需要更改
sourcedir
filename1
的设置以适应您的环境

tempfile1
可以是任何名称-它只是一个临时文件;为了方便起见,我选择了这个特定的名称

我使用了一个名为
q39558311.txt
的文件,其中包含一些用于测试的虚拟数据

基本上,创建一个文件,在单行上包含一个引号*tempfile1)然后使用
findstr
/g:filename
选项读入要查找的目标字符串。当
findstr
找到行时,它对行进行编号并输出
line\u number:line found
。使用
作为分隔符,此行的标记1是行号

我不明白您为什么在代码中使用了
skip=number
。是否要跳过测试目标文件的前两行

IF%%a gtr 2
测试找到的行号。如果行号大于2,则设置变量
linefound
,并终止
for
循环

我选择将
linefound
初始化为零。如果在第2行中找不到
,它将保持为零。结束。同样,您可以清除它,然后它将被定义(第一行的值大于-2),并且在未找到上没有定义。

我只能识别
,但不删除。等待您的建议

>nul 2>&1 findstr /m \" "file"
if not errorlevel 1 echo double quote found!

使用(
!v!
)避免特殊字符出现问题;该问题是由正常(即时)字符引起的变量的展开
%v%
..@aschipfl我需要在脚本末尾使用相同的变量范围,因此请详细说明在这种情况下如何使用延迟展开,因为
setlocal
创建新范围而
endlocal
删除创建的变量范围scope@aschipfl更重要的是:即使延迟扩展,如何将文件的文本行传递给variable?无论如何,这行代码出现在解释器预处理器之前。或者您有其他解决方案?如果有人建议不使用
findstr
的解决方案,这将非常好。有一些方法可以将变量值传递到
endlocal
屏障之外——例如,请参见…
skip=2
是必需的,因为
find
打印2个非数据在文件数据输出前一行,测试
find/v”““AnyFile”
,您将看到您的帮助只是建议
findstr
读取
"
来自其他文件。谢谢,我将使用它并在此处发布答案。我只想指出,Windows“批处理文件”无法在不使用第三方工具或获取其他编程语言服务的情况下编辑/删除文本流并直接替换。您所能有效地做的就是写入另一个文件,然后替换original文件和新编写的文件。@Compo“写入另一个文件”是什么意思?我的意思是你不能读取文本流,更改它,然后直接回写到源文件。你必须读取、更改、写入其他文件,然后用其他文件替换源文件。我希望这对你来说足够清楚。@Compo我已经理解了你的fir的第一部分st注释清楚,无需再次澄清。但我认为您指的是对文件进行更具体的操作若要删除,您是否可以创建一个包含每行内容的变量,并将这些变量写入一个新文件,方法是将doublequote替换为nothing,
ECHO%variable:=%