批处理:在字符串中查找带引号的子字符串
Batch: Find substring with quotes in string
我无法让它工作。我正在逐行读取 XML 文件,然后查看每一行是否包含特定标记 。当我找到它时,我会修改它并将所有内容写回到文件中。
但是,我找不到标签,因为它包含引号。
@ECHO OFF
SETLOCAL EnableExtensions EnableDelayedExpansion
....some more code....
SET dllFile=%DestPath%\%ProjectName%.dll.manifest
IF NOT EXIST "%dllFile%" (
ECHO File %ProjectName%.dll.manifest does not exist^^!
GOTO ERROR
) ELSE (
ECHO Modifying %ProjectName%.dll.manifest in directory:
ECHO %DestPath%
REM Create a temporary file in the folder, where this batch file is being executed from
>"temp.xml" (
FOR /F "usebackq delims=" %%I IN ("%dllFile%") DO (
SET "line=%%I"
REM Insert existing line before modification
SETLOCAL DisableDelayedExpansion
ECHO %%I
ENDLOCAL
REM Find correct version number
SET "myVariable=<assemblyIdentity name="PostDeploymentAction" version"
IF not "!line!"=="!line:myVariable=!" (
echo !line!
)
....some more code....
)
)
)
无论我使用什么转义字符,它都找不到这一特定行(或者它找到每一行)。上面代码中的其他所有内容都可以正常工作——只有 IF 不是 "!line!"=="!line:myVariable=!" 不行。非常感谢任何帮助。
谢谢
使用另一种方法比较字符串:
@echo off
setlocal enabledelayedexpansion
; set "myvariable=<assemblyIdentity name="PostDeploymentAction" version"
set myvariable
for /f "delims=" %%a in (test.txt) do (
echo "%%a"|findstr /c:"!myvariable:"=\"!">nul && (
echo DEBUG: found %%a
REM do something special here
) || (
echo %%a
REM write line unchanged
)
)
(您必须使用 findstr;
findstr 转义双引号,使用反斜杠作为转义字符)
最后,我得到了
SET "xmlTag=<assemblyIdentity name="PostDeploymentAction"
FOR /F "usebackq delims=" %%A IN ("%dllFile%") DO (
ECHO "%%A"|FINDSTR /c:"!xmlTag:"=\"!">nul && (
FOR /F "tokens=2,3 delims=^=" %%B IN ("%%A") DO (
SET version=%%C
SET version=!version:~0,-9!
ECHO Found PostDeploymentAction.dll version number !version!
)
)
)
这给了我想要的版本号。完整的 XML 行是 <assemblyIdentity name="PostDeploymentAction" version="1.1.0.0" language="neutral" processorArchitecture="msil" />
。第一个 FOR 循环从 XML 文件中获取整行,而第二个 FOR 获取实际版本号“1.1.0.0”。
第二个 FOR 有点奇怪,但它有效。但是,我相信有更好的方法...
顺便说一句,上面的代码有点慢,因为文件的每一行都会调用 FINDSTR(逐行读取文件,然后用 FINDSTR 分析每一行)。
通过对整个文件仅调用一次 FINDSTR 然后分析 FINDSTR 找到的 return 结果,有一个非常非常快的版本。
SET "xmlTag=<assemblyIdentity name="PostDeploymentAction"
FOR /F "tokens=*" %%A in ('FINDSTR /c:^"!xmlTag:"=\"!^" ^"%dllFile%^"') DO (
FOR /F "tokens=5 delims=^=^ " %%B IN ("%%A") DO (
SET version=%%B
ECHO Found PostDeploymentAction.dll version number !version:~1,-1!
)
)
我无法让它工作。我正在逐行读取 XML 文件,然后查看每一行是否包含特定标记
@ECHO OFF
SETLOCAL EnableExtensions EnableDelayedExpansion
....some more code....
SET dllFile=%DestPath%\%ProjectName%.dll.manifest
IF NOT EXIST "%dllFile%" (
ECHO File %ProjectName%.dll.manifest does not exist^^!
GOTO ERROR
) ELSE (
ECHO Modifying %ProjectName%.dll.manifest in directory:
ECHO %DestPath%
REM Create a temporary file in the folder, where this batch file is being executed from
>"temp.xml" (
FOR /F "usebackq delims=" %%I IN ("%dllFile%") DO (
SET "line=%%I"
REM Insert existing line before modification
SETLOCAL DisableDelayedExpansion
ECHO %%I
ENDLOCAL
REM Find correct version number
SET "myVariable=<assemblyIdentity name="PostDeploymentAction" version"
IF not "!line!"=="!line:myVariable=!" (
echo !line!
)
....some more code....
)
)
)
无论我使用什么转义字符,它都找不到这一特定行(或者它找到每一行)。上面代码中的其他所有内容都可以正常工作——只有 IF 不是 "!line!"=="!line:myVariable=!" 不行。非常感谢任何帮助。
谢谢
使用另一种方法比较字符串:
@echo off
setlocal enabledelayedexpansion
; set "myvariable=<assemblyIdentity name="PostDeploymentAction" version"
set myvariable
for /f "delims=" %%a in (test.txt) do (
echo "%%a"|findstr /c:"!myvariable:"=\"!">nul && (
echo DEBUG: found %%a
REM do something special here
) || (
echo %%a
REM write line unchanged
)
)
(您必须使用 findstr;
findstr 转义双引号,使用反斜杠作为转义字符)
最后,我得到了
SET "xmlTag=<assemblyIdentity name="PostDeploymentAction"
FOR /F "usebackq delims=" %%A IN ("%dllFile%") DO (
ECHO "%%A"|FINDSTR /c:"!xmlTag:"=\"!">nul && (
FOR /F "tokens=2,3 delims=^=" %%B IN ("%%A") DO (
SET version=%%C
SET version=!version:~0,-9!
ECHO Found PostDeploymentAction.dll version number !version!
)
)
)
这给了我想要的版本号。完整的 XML 行是 <assemblyIdentity name="PostDeploymentAction" version="1.1.0.0" language="neutral" processorArchitecture="msil" />
。第一个 FOR 循环从 XML 文件中获取整行,而第二个 FOR 获取实际版本号“1.1.0.0”。
第二个 FOR 有点奇怪,但它有效。但是,我相信有更好的方法...
顺便说一句,上面的代码有点慢,因为文件的每一行都会调用 FINDSTR(逐行读取文件,然后用 FINDSTR 分析每一行)。 通过对整个文件仅调用一次 FINDSTR 然后分析 FINDSTR 找到的 return 结果,有一个非常非常快的版本。
SET "xmlTag=<assemblyIdentity name="PostDeploymentAction"
FOR /F "tokens=*" %%A in ('FINDSTR /c:^"!xmlTag:"=\"!^" ^"%dllFile%^"') DO (
FOR /F "tokens=5 delims=^=^ " %%B IN ("%%A") DO (
SET version=%%B
ECHO Found PostDeploymentAction.dll version number !version:~1,-1!
)
)