我很少使用批处理脚本,但这似乎是替换图像文件中一起出现的两个变量的合理方法,因为它们代表 pgm 文件中不正确的像素值。值是 1020 然后 0。
ChatGPT 很有用,给了我一个大部分有效的示例,我调整了几行,但错误似乎确实是扩展变量与设置的“行...语法不能很好地配合。使用预设变量(dummyV1)做确实将交换变量正确写入该行,动态变量只需输入空格即可。
动态变量屏幕上的回显工作正常,只是写入行让我头疼。如果完全不可能,那么我知道停止浪费时间并使用另一种语言。
完整代码如下(请原谅所有调试回显):
@echo off
setlocal enabledelayedexpansion
:: Define file path and search/replace values
:: Get the current directory (where the .bat script is located)
set "fileName1=frame001cut.pgm"
set "fileName2=frame002.pgm"
set "fileName3=frame003.pgm"
set "fileName4=frame004.pgm"
set "fileName5=frame005.pgm"
set "currentDir=%\~dp0"
set "filePath1=%currentDir%%fileName1%"
set "filePath2=%currentDir%%fileName2%"
set "filePath3=%currentDir%%fileName3%"
set "filePath4=%currentDir%%fileName4%"
set "filePath5=%currentDir%%fileName5%"
set "filePathnew1=%currentDir%\\frame001_fix.pgm"
set "filePathnew2=%currentDir%\\frame002_fix.pgm"
set "filePathnew3=%currentDir%\\frame003_fix.pgm"
set "filePathnew4=%currentDir%\\frame004_fix.pgm"
set "filePathnew5=%currentDir%\\frame005_fix.pgm"
:: Check if the file exists
if exist "%filePath1%" (
echo File "%fileName1%" found in the current directory.
) else (
echo File "%fileName1%" not found in the current directory.
)
:: Create a temporary file for output
set "tempFile=%currentDir%\\tempfile.txt"
del "%tempFile%" 2\>nul
:: Variables to search for
set "searchValue1=1020"
set "searchValue2=0"
:: Variables to hold previous values
::set "prevValue1="
::set "prevValue2="
::set "prevValue3="
::set "prevValue4="
:: dummy values to write to the file
set "dummyV1=1"
set "dummyV2=2"
set "newValue1="
set "newValue2="
:: Loop through the file and process each line
for /f "tokens=\* delims=" %%A in (%filePath1%) do (
set "line=%%A"
:: Split the current line into individual words (values)
for %%B in (!line!) do (
set "currentValue=%%B"
:: If the previous two values match the search values, replace them
if defined prevValue4 (
if "!prevValue1!"=="%searchValue1%" (
echo preValue2 = search value 1
if "!currentValue!"=="%searchValue2%" (
set "prevValue3=!prevValue3!"
set "prevValue2=!prevValue2!"
set "line=!line:%searchValue1% %searchValue2%=%prevValue3% %prevValue2%!"
echo both values were found one after the other
echo Current Value =!currentValue!
echo search value 1 = %searchValue1%
echo search value 2 = %searchValue2%
echo preValue 4 =!prevValue4!
echo preValue 3 =!prevValue3!
echo preValue 2 =!prevValue2!
echo preValue 1 =!prevValue1!
echo current value = !currentValue!
echo dummy value 1 = %dummyV1%
echo dummy value 2 = %dummyV2%
echo newValue1 = !newValue1!
echo newValue2 = !newValue2! )
)
if "!currentValue!"=="%searchValue1%" (
echo Value 1
echo current value =!currentValue!dn
)
if "!currentValue!"=="%searchValue2%" (
echo Value 2
echo current value =!currentValue!dn
)
)
:: Update the previous values
set "prevValue4=!prevValue2!"
set "prevValue3=!prevValue2!"
set "prevValue2=!prevValue1!"
set "prevValue1=!currentValue!" )
:: Write the processed line to the temp file
echo !line! >> "%tempFile%"
)
:: Replace the original file with the modified content
move /y %tempFile% %filePathnew1%
echo Replacement complete.
pause
我尝试了上面的代码,还将变量重写为新变量,但我猜这是同样的事情。我还尝试在写入文件之前禁用延迟扩展,但这不起作用。 我还尝试了 !prevValue3! 的扩展变量包装器等等..这没有帮助。
接下来我可以尝试什么?
您的代码的问题是您在代码块内使用变量,其中变量的值在代码块内设置/更改。 问题变量是以 'prevValue' 开头的变量
下面的代码演示了两种避免此问题的方法。 在代码块中使用 line1 和 line2 的代码将会失败(错误的 prevValue)。 第3行的代码演示了调用集的使用。 第4行的代码演示了附加for参数的使用。
@echo off
cls
setlocal enabledelayedexpansion
set "line=abc SV1 SV2 xyz"
set "searchValue1=SV1"
set "searchValue2=SV2"
set "prevValue2=PV2"
set "prevValue3=PV3"
set line
set "line1="
rem the next line will fail if the search/prev values are set/changed within a codeblock
set "line1=!line:%searchValue1% %searchValue2%=%prevValue3% %prevValue2%!"
set line1
set "line2="
rem the next line will fail if the search/prev values are set/changed within a codeblock
call set "line2=%%line:%searchValue1% %searchValue2%=%prevValue3% %prevValue2%%%"
set line2
set "line3="
rem the next line uses 'call set' to be able to use the delayed syntax for the search and prev variables
call set "line3=%%line:!searchValue1! !searchValue2!=!prevValue3! !prevValue2!%%"
set line3
set "line4="
rem the next line stores the values of the search and prev variables in for parameters before using these values in the line replacement
for %%A in ("!searchValue1!") do for %%B in ("!searchValue2!") do for %%C in ("!prevValue3!") do for %%D in ("!prevValue2!") do echo [%%~A] [%%~B] [%%~C] [%%~D]
for %%A in ("!searchValue1!") do for %%B in ("!searchValue2!") do for %%C in ("!prevValue3!") do for %%D in ("!prevValue2!") do set "line4=!line:%%~A %%~B=%%~C %%~D!"
set line4
endlocal
pause
exit /b