识别或删除批处理脚本文本流或文件中的双引号字符
identify or delete double quote char in batch script text stream or in a file
我已经创建了命令脚本来读取 file
中的 %N%
行。问题是当我处理文件的文本时,我无法从所有文本流的任何地方删除 "
。 "
删除是非常必要的,因为如果文件的文本行有像 "text"
和 text
这样的子字符串有特殊字符或更糟的脚本代码,那么脚本会崩溃或无法正常工作(包括脚本由专门编写 text
).
的程序员控制捕获
如果我无法从文本流中删除 "
,那么我只想确定 file
(或者它的第一个 %N%
行,包括空行)包含在至少一个 "
个字符。
感谢任何想法,包括任何 file
预处理。但主要目标是脚本速度。
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 Off
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q39558311.txt"
SET "tempfilename1=%sourcedir%\q39558311#.txt"
>"%tempfilename1%" ECHO("
SET /a linefound=0
FOR /f "tokens=1 delims=:" %%a IN ('findstr /n /g:"%tempfilename1%" "%filename1%"') DO (
IF %%a gtr 2 SET /a linefound=%%a&GOTO report
)
:report
ECHO quote found AT line %linefound%
DEL "%tempfilename1%"
GOTO :EOF
您需要更改 sourcedir
和 filename1
的设置以适合您的情况。
tempfile1
可以是任何名称——它只是一个临时文件;为了方便起见,我选择了那个特定的名称。
我使用了一个名为 q39558311.txt
的文件,其中包含一些用于测试的虚拟数据。
本质上,创建一个在单行上包含单引号的文件 *tempfile1) 然后使用 findstr
和 /g:filename
选项来读入要查找的目标字符串。当 findstr
找到该行时,它对其进行编号并输出 line_number:line found
。以:
为分隔符,此行的token 1为行号。
我不明白你为什么要在代码中使用 skip=number
。您打算跳过测试目标文件的前两行吗?
IF %%a gtr 2
测试找到的行号。如果大于 2,则设置变量 linefound
并终止 for
循环。
我选择将 linefound
初始化为零。如果在第 2..end 行中没有找到 "
,它将保持为零。同样,您可以清除它,然后它将被定义(first-line-found-with-quote-greater than-2 的值)并且没有定义未找到。
我只能识别"
,不能删除。等待您的建议!
>nul 2>&1 findstr /m \" "file"
if not errorlevel 1 echo double quote found!
我已经创建了命令脚本来读取 file
中的 %N%
行。问题是当我处理文件的文本时,我无法从所有文本流的任何地方删除 "
。 "
删除是非常必要的,因为如果文件的文本行有像 "text"
和 text
这样的子字符串有特殊字符或更糟的脚本代码,那么脚本会崩溃或无法正常工作(包括脚本由专门编写 text
).
的程序员控制捕获
如果我无法从文本流中删除 "
,那么我只想确定 file
(或者它的第一个 %N%
行,包括空行)包含在至少一个 "
个字符。
感谢任何想法,包括任何 file
预处理。但主要目标是脚本速度。
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 Off
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q39558311.txt"
SET "tempfilename1=%sourcedir%\q39558311#.txt"
>"%tempfilename1%" ECHO("
SET /a linefound=0
FOR /f "tokens=1 delims=:" %%a IN ('findstr /n /g:"%tempfilename1%" "%filename1%"') DO (
IF %%a gtr 2 SET /a linefound=%%a&GOTO report
)
:report
ECHO quote found AT line %linefound%
DEL "%tempfilename1%"
GOTO :EOF
您需要更改 sourcedir
和 filename1
的设置以适合您的情况。
tempfile1
可以是任何名称——它只是一个临时文件;为了方便起见,我选择了那个特定的名称。
我使用了一个名为 q39558311.txt
的文件,其中包含一些用于测试的虚拟数据。
本质上,创建一个在单行上包含单引号的文件 *tempfile1) 然后使用 findstr
和 /g:filename
选项来读入要查找的目标字符串。当 findstr
找到该行时,它对其进行编号并输出 line_number:line found
。以:
为分隔符,此行的token 1为行号。
我不明白你为什么要在代码中使用 skip=number
。您打算跳过测试目标文件的前两行吗?
IF %%a gtr 2
测试找到的行号。如果大于 2,则设置变量 linefound
并终止 for
循环。
我选择将 linefound
初始化为零。如果在第 2..end 行中没有找到 "
,它将保持为零。同样,您可以清除它,然后它将被定义(first-line-found-with-quote-greater than-2 的值)并且没有定义未找到。
我只能识别"
,不能删除。等待您的建议!
>nul 2>&1 findstr /m \" "file"
if not errorlevel 1 echo double quote found!