2 votes

NSIS Replace Line in File : Ne lit jamais le fichier et n'identifie jamais la ligne correcte.

Je tente de remplacer une ligne dans un fichier.

Mon problème : Je n'arrive jamais à trouver la ligne que je cherche dans un fichier. Ma fonction trouve la ligne que je veux remplacer mais ne l'identifie pas correctement comme étant celle que je veux remplacer ou peut-être qu'elle ne parvient pas à ouvrir le fichier (le chemin d'accès au fichier est correct).

Si vous testez la fonction my avec le fichier texte simple suivant, elle échoue toujours :

abc
test
données

Pouvez-vous m'aider à faire en sorte que ma fonction remplace correctement une ligne dans un fichier ?

# 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

3voto

RobeN Points 2056

Vous devriez vérifier la macro LineFind pour NSIS : http://nsis.sourceforge.net/LineFind

Pour remplacer les lignes dans les fichiers, vous pouvez essayer d'utiliser :

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

Créer FILE.ini contenant et le garder dans le même dossier que celui que vous aurez 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X