批处理脚本,替换文件行中的变量不适用于扩展变量

问题描述 投票:0回答:1

我很少使用批处理脚本,但这似乎是替换图像文件中一起出现的两个变量的合理方法,因为它们代表 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! 的扩展变量包装器等等..这没有帮助。

接下来我可以尝试什么?

file batch-file
1个回答
0
投票

您的代码的问题是您在代码块内使用变量,其中变量的值在代码块内设置/更改。 问题变量是以 '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
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.