gpt4 book ai didi

parsing - NSIS 替换文件 : Never reads file & never identifies the correct line 中的行

转载 作者:行者123 更新时间:2023-12-04 05:46:25 27 4
gpt4 key购买 nike

我正在尝试替换文件中的一行。

我的问题:我永远无法在文件中找到我要查找的行。我的函数找到了我想要替换的行,但没有正确地将其识别为我想要替换的行,或者它可能无法打开文件(文件路径正确)。

如果您使用以下简单的文本文件测试 my 函数,它仍然会失败:

abc
test
data



你能帮我让我的函数正确替换文件中的一行吗?
# usage that fails to work
Push "C:\Users\blah\Desktop"
Push "test.txt"
Push "abc"
Push "def"
Call ReplaceLineInFile

Function ReplaceLineInFile
# T-3 = nDir
# T-2 = nFile
# T-1 = targetLine
# TOP = replaceLine # TOP is top of stack
# $4 = tempName
# $5 = numTargetLinesFound

Pop $3 # replaceLine
Pop $2 # targetLine
Pop $1 # nFile
Pop $0 # nDir
StrCpy $1 "$0\$1" # create the string 'C:\users\blah\mytext.txt'
IntOp $5 0 + 0
MessageBox MB_OK "ReplaceLineInFile: dir: $0$\r$\nfile: $1$\r$\ntarget: $2$\r$\nreplace: $3"

ClearErrors
FileOpen $8 $1 "r" ; open target file for reading
GetTempFileName $4 ; get new temp file name
FileOpen $7 $4 "w" ; open temp file for writing
loop:
FileRead $8 $6 ; read line from target file
IfErrors done ; check if end of file reached
MessageBox MB_OK "Line: $6$\r$\nTarg: $2"
StrCmp $6 "$2$\r$\n" 0 +3 ; compare line with search string with CR/LF
StrCpy $6 "$3$\r$\n" ; change line
IntOp $5 $5 + 1
StrCmp $6 "$2" 0 +3 ; compare line with search string without CR/LF (at the end of the file)
StrCpy $6 "$3" ; change line
IntOp $5 $5 + 1
FileWrite $7 $6 ; write changed or unchanged line to temp file
Goto loop

done:
FileClose $8 ; close target file
FileClose $7 ; close temp file
Delete $1 ; delete target file
CopyFiles /SILENT $4 $1 ; copy temp file to target file
Delete $4 ; delete temp file
MessageBox MB_OK "Targets found: $5"

FunctionEnd

最佳答案

您应该检查 NSIS 的 LineFind 宏:http://nsis.sourceforge.net/LineFind

要替换文件中的行,您可以尝试使用:

Name "Text Replacer"
OutFile "TextReplacer.exe"

;[DEFINES] You define String To Find and String To Replace

!include "TextFunc.nsh"
!insertmacro LineFind
!include "Sections.nsh"

!define STRTOFIND "BaseLine1: TextThatShouldBeChanged"
!define STRTOREPL "BaseLine1: TextHasBeenCHANGED!!!"
!define STRTOFIND2 "[BaseLine2=TextThatShouldBeChanged;"
!define STRTOREPL2 "[BaseLine2=TextCHANGED!!!;"

;[Functions] You create Line Replace Functions for each line

Function LineFindCallback
StrLen $0 "${STRTOFIND}"
StrCpy $1 "$R9" $0
StrCmp $1 "${STRTOFIND}" 0 End
StrCpy $R9 "${STRTOREPL}$\r$\n"
End:
Push $0
FunctionEnd
Function LineFindCallback2
StrLen $0 "${STRTOFIND2}"
StrCpy $1 "$R9" $0
StrCmp $1 "${STRTOFIND2}" 0 End
StrCpy $R9 "${STRTOREPL2}$\r$\n"
End:
Push $0
FunctionEnd

;[Sections] You call function for specific line in specific file
;Input and Output file can be same or different
;If Output file name is different (new file is created)
;then every next LineFind call should take Previous Output file as Input file

Section "Replace 1" Section1
SectionIn 1 +2
${LineFind} "$EXEDIR\FILE.ini" "$EXEDIR\FILE.ini" "1:-1" "LineFindCallback"
IfErrors 0 +2
MessageBox MB_OK "Error"
${LineFind} "$EXEDIR\FILE.ini" "$EXEDIR\FILE.ini" "1:-1" "LineFindCallback2"
IfErrors 0 +2
MessageBox MB_OK "Error"
SectionEnd

创建 FILE.ini包含并将其保存在您将拥有的同一文件夹中 TextReplacer.exe :
This is File.ini file
That line will not be changed
BaseLine1: TextThatShouldBeChanged
This line=is just a dummy line
[BaseLine2=TextThatShouldBeChanged;
File.ini end

关于parsing - NSIS 替换文件 : Never reads file & never identifies the correct line 中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10630437/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com