Indice del forum Olimpo Informatico
I Forum di Zeus News
Leggi la newsletter gratuita - Attiva il Menu compatto
 
 FAQFAQ   CercaCerca   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati 
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

    Newsletter RSS Facebook Twitter Contatti Ricerca
Trovare e sostituire una stringa in un file di testo
Nuovo argomento   Rispondi    Indice del forum -> Programmazione
Precedente :: Successivo  
Autore Messaggio
balubeto
Dio minore
Dio minore


Registrato: 19/05/06 08:22
Messaggi: 757

MessaggioInviato: 08 Dic 2011 12:54    Oggetto: Trovare e sostituire una stringa in un file di testo Rispondi citando

CIAO

Devo creare due script (da includere in un file bat):

1) Uno che trova una determinata stringa in un file di testo in modo che venga sostituita con un'altra stringa.

2) Uno che trova una determinata stringa in un file di testo in modo che la sua intera riga venga sostituita con un'altra stringa.

Questi script devono funzionare su Windows 7 SP1 32/64 bit.

Quindi, come faccio a fare cio?

GRAZIE

CIAO
Top
Profilo Invia messaggio privato
ZapoTeX
Dio maturo
Dio maturo


Registrato: 04/06/04 16:18
Messaggi: 2627
Residenza: Universo conosciuto

MessaggioInviato: 08 Dic 2011 15:11    Oggetto: Rispondi citando

Crei un'applicazione di tipo "console" con Visual Basic 2010 Express (gratuito) e la lanci dal file .bat.

Non sono sicuro che da un file .bat tu abbia a disposizione delle librerie di funzioni per le stringhe sufficienti per il tuo scopo.

Vediamo gli esperti ti consigliano diversamente, ma io farei così.
Top
Profilo Invia messaggio privato HomePage
GrayWolf
Dio maturo
Dio maturo


Registrato: 03/07/05 16:24
Messaggi: 2325
Residenza: ... come frontiera i confini del mondo...

MessaggioInviato: 08 Dic 2011 17:53    Oggetto: Re: Trovare e sostituire una stringa in un file di testo Rispondi citando

balubeto ha scritto:
CIAO

Devo creare due script (da includere in un file bat):

1) Uno che trova una determinata stringa in un file di testo in modo che venga sostituita con un'altra stringa.


Codice:

@echo off
REM -- Prepare the Command Processor --
SETLOCAL ENABLEEXTENSIONS
SETLOCAL DISABLEDELAYEDEXPANSION

::BatchSubstitude - parses a File line by line and replaces a substring"
::syntax: BatchSubstitude.bat OldStr NewStr File
::          OldStr [in] - string to be replaced
::          NewStr [in] - string to replace with
::          File   [in] - file to be parsed
:$changed 20100115
:$source http://www.dostips.com
if "%~1"=="" findstr "^::" "%~f0"&GOTO:EOF
for /f "tokens=1,* delims=]" %%A in ('"type %3|find /n /v """') do (
    set "line=%%B"
    if defined line (
        call set "line=echo.%%line:%~1=%~2%%"
        for /f "delims=" %%X in ('"echo."%%line%%""') do %%~X
    ) ELSE echo.
)



fonte


balubeto ha scritto:

2) Uno che trova una determinata stringa in un file di testo in modo
che la sua intera riga venga sostituita con un'altra stringa.


per questo non credo si possa fare con un .bat
occorre uno script, [come suggerito da Zapo]
però è già possibile con VBScript [nativo nel sistema]

edit:
a meno tu non voglia cimentarti nella modifica del batch sopra esposto,
utilizzando un quarto parametro per la sostituzione dell'intera riga, ma a dire la verità, la vedo piuttosto dura
Top
Profilo Invia messaggio privato
balubeto
Dio minore
Dio minore


Registrato: 19/05/06 08:22
Messaggi: 757

MessaggioInviato: 08 Dic 2011 19:59    Oggetto: Rispondi citando

Da quanto ho capito, il linguaggio batch non e` adatto a fare questi due script.

Mi potestri far vedere come si farebbero tali script in VBScript o PowerShell e come si fa a richiamarli da un file bat?

grazie

ciao
Top
Profilo Invia messaggio privato
GrayWolf
Dio maturo
Dio maturo


Registrato: 03/07/05 16:24
Messaggi: 2325
Residenza: ... come frontiera i confini del mondo...

MessaggioInviato: 09 Dic 2011 13:01    Oggetto: Rispondi citando

balubeto ha scritto:

Da quanto ho capito, il linguaggio batch non e` adatto a fare questi due script.


lo script che ho postato risolve il primo problema:

    .1 apri il blocco note
    .2 copi/incolli tutto quello che è compreso nel blocco "codice"
    .3 salvi con nome_che_vuoi.bat [consiglio: nome_che_vuoi = BatchSubstitude]
    .4 lo poni nella cartella del file su cui effettuare le sostituzioni [consiglio: fatti una copia prima]
    .5 lo esegui con la sintassi: nome_che_vuoi.bat "stringa DA sostituire" "stringa DI sostituzione" nome_del_file_in cui_effettuare _la_sostituzione.txt


NOTE:
.1 se il .bat è in una cartella diversa da quella in cui risiede il file di testo, nome_del_file_in cui_effettuare _la_sostituzione.txt deve essere preceduto dal suo percorso
.2 se il percorso contiene degli spazi deve essere racchiuso fra doppie virgolette

esempio, ipotizzando che:
.1 il .bat si chiamiBatchSubstitude.bat e sia nelle cartella C:\Batch
.2 il file su cui deve essere effettuata la sostituzione si chiami Prova.txt
.3 Prova.txt sia nella cartella: C:\Miei Files Di Testo
.4 Prova.txt contenga la stringa "Visualizza" da sostituire con "Esponi"
.5 dopo la creazione di BatchSubstitude.bat in C:\Batch
.6 dopo aver effettuato una copia di riserva di Prova.txt
.7 [in esegui] digiti: C:\Batch\BatchSubstitude.bat "Visualizza" "Esponi" "C:\Miei Files Di Testo.txt" rispettando spazi e doppie virgolette

Naturalmente C:\ può essere sostituito con qualsiasi unità:\Percorso



per il secondo problema:


    .1 non è necessario scrivere uno script che richiami un .bat
    .2 è lo script che deve farlo [lasciami il tempo di scriverlo]
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 11553
Residenza: Tokelau

MessaggioInviato: 09 Dic 2011 13:45    Oggetto: Rispondi citando

potresti provare questo per il primo caso link e questo per il secondo link

Ciao
Top
Profilo Invia messaggio privato HomePage
GrayWolf
Dio maturo
Dio maturo


Registrato: 03/07/05 16:24
Messaggi: 2325
Residenza: ... come frontiera i confini del mondo...

MessaggioInviato: 11 Dic 2011 13:48    Oggetto: Rispondi citando

ecco qua:

Codice:

'* VB Script Document
'*******************************************************************************
'* Descrizione   :             myFindAndSost
'*               :
'*               : Cerca in un file e sostituisce:
'*               : -  una stringa con un'altra
'*               :                oppure
'*               : - un'intera riga, che contiene una stringa, con una stringa
'*               :
'*---------------:--------------------------------------------------------------
'                           prototipo di lancio:
'
' myFindAndSost.vbs /from:"DA" /to:"A" /file"u:\path\file" [/line:sostLinea]
'
' il parametro /line: è facoltativo e il valore associato deve essere:
'                     'true' o 'false' [senza virgolette]
'                     se true, TUTTA la linea è sostituita con il contenuto del
'                     parametro /to:
'                     se mancante è assunto false = sostituzione di parola
'*---------------:--------------------------------------------------------------
'* Versione      : 1.0.0.0
'*---------------:--------------------------------------------------------------
'* Autore        : GrayWolf
'*---------------:--------------------------------------------------------------
'* Date          :
'* Creazione     : [sabato 10 dicembre 2011 - 11.30.53]
'* Ult. Modifica : [domenica 11 dicembre 2011 - 06.33.52]
'*---------------:--------------------------------------------------------------
'*               :                     Modifiche
'*---------------:--------------------------------------------------------------
'* vers. X.Y.Z.S :
'*   dd/mm/yyyy  :
'*---------------:--------------------------------------------------------------
'*               :                  ///---///---///---///
'*---------------:--------------------------------------------------------------
'*******************************************************************************
option explicit
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-~-~-~
'*                       variabili globali
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-~-~-~
'* -------------------------------------
'* costanti
'* -------------------------------------
  const g_sApiceSingolo = "'"
  const g_sApiceDoppio = """"

  const g_ForReading  = 1
  const g_ForWriting  = 2
'* -------------------------------------

'* -------------------------------------
'* oggetti
'* -------------------------------------
'* diretti
                                        '*--------------------------------------
  dim g_oFSO                            '* File System Object
                                        '*--------------------------------------
  dim g_oRegExpr                        '* Regular Expression
                                        '*--------------------------------------
  dim g_oShell                          '* shell per esecuzione comandi
                                        '*--------------------------------------
'* indiretti
                                        '*--------------------------------------
  dim g_oFolder                         '* oggetto cartella
                                        '*--------------------------------------
  dim g_oFiles                          '* insieme files
                                        '*--------------------------------------
  dim g_oFile                           '* oggeto file
                                        '*--------------------------------------
  dim g_oFileIN                         '* oggetto file originale
                                        '*--------------------------------------
  dim g_oFileOUT                        '* oggetto file modificato
                                        '*--------------------------------------
'* -------------------------------------

'* -------------------------------------
'* stringhe/ variant
'* -------------------------------------

'* stringhe
                                        '*--------------------------------------
  dim g_sCmd                            '* comando per shell
                                        '*--------------------------------------
  dim g_sScriptFName                    '* percorso e nome script
                                        '*--------------------------------------
  dim g_sScriptDir                      '* percorso script
                                        '*--------------------------------------
  dim g_sScriptName                     '* nome script
                                        '*--------------------------------------
  dim g_sTmp1                           '* generico: transito
                                        '*--------------------------------------
  dim g_sFileSost                       '* contenuto sostituito
                                        '*--------------------------------------
'* variant
                                        '*--------------------------------------
  dim g_avTmp                           '* generico: transito
                                        '*--------------------------------------
  dim g_avPar                           '* matrice parametri nella commandline
                                        '*--------------------------------------
'* -------------------------------------

'* -------------------------------------
'* numerici
'* -------------------------------------
                                        '*--------------------------------------
                                        '*--------------------------------------
'* -------------------------------------

'* -------------------------------------
'* segnali
'* -------------------------------------
                                        '*--------------------------------------
  dim g_bPrimaVolta                     '* prima esecuzione
                                        '*--------------------------------------
  dim g_bSostGlob                       '* segnala sostituzione effettuata
                                        '*--------------------------------------
'* -------------------------------------

'* message box -------------------------
  dim g_sMsg
  dim g_iButt
  dim g_lIco
  dim g_sTit

'* input box
  dim g_sRis
'* -------------------------------------
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-~-~-~



'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-~-~-~
'* -~-~-~-~-~-~-~-~-~-    MAINLINE PROGRAMMA    ~-~-~-~-~-~-~-~-~-~--~-~-~-~-~-~
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-~-~-~

'*------------------------------
'* impostazioni e
'* allocazione di oggetti
'*------------------------------
  inizioProgramma
'*------------------------------

'*------------------------------
'* rilevazione commandline
  impostaParCmdLine
'*------------------------------

'*------------------------------
'* non si sono verificati errori
'*------------------------------
   Trattamento
'*------------------------------

'*------------------------------
'* fine script
'*------------------------------
  fineProgramma
'*------------------------------
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-~-~-~
'* -~-~-~-~-~-~-~-~-~-  TERMINE MAINLINE PROGRAMMA  ~-~-~-~-~-~-~-~-~-~--~-~-~-~
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-~-~-~



'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-~-~-~
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-~-~-~
'* -~-~-~-~-~-~-~-~-~-~-~-~  SOTTOPROCEDURE  -~-~-~-~-~-~-~-~-~-~-~--~-~-~-~-~-~
'* -~-~-~-~-~-~-~-~-~-~-~-         E          -~-~-~-~-~-~-~-~-~-~-~--~-~-~-~-~-
'* -~-~-~-~-~-~-~-~-~-~-~-~     FUNZIONI     -~-~-~-~-~-~-~-~-~-~-~--~-~-~-~-~-~
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-~-~-~
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-~-~-~


'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-~~-~-~-~-~--~-~-~-
'* INIZIO PROGRAMMA
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-~~-~-~-~-~--~-~-~-
Sub inizioProgramma

'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
'* impostazionì
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
  g_bPrimaVolta = true
  g_sScriptFName = Wscript.ScriptFullName
  g_sScriptDir = left(g_sScriptFName,instrrev(g_sScriptFName,"\"))
  g_sScriptName = mid(g_sScriptFName,instrrev(g_sScriptFName,"\")+1)
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~

'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
'* alloca oggetti
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
  set g_oShell = CreateObject("Wscript.Shell")
  Set g_oRegExpr = CreateObject("vbscript.regexp")
  set g_oFSO = CreateObject("Scripting.FileSystemObject")
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~

end sub
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-
'* TERMINE INIZIO PROGRAMMA
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-

'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-
'* INIZIO impostaParCmdLine
'* imposta la matrice dei parametri
'* li rileva
'* li controlla
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-
sub impostaParCmdLine()

'*------------------------------
'* imposta matrice dei parametri
'*------------------------------
  redim g_avPar(2,3)
  g_avPar(0,0) = "from"
  g_avPar(1,0) = "o"
  g_avPar(2,0) = ""

  g_avPar(0,1) = "to"
  g_avPar(1,1) = "o"
  g_avPar(2,1) = ""

  g_avPar(0,2) = "file"
  g_avPar(1,2) = "o"
  g_avPar(2,2) = ""

  g_avPar(0,3) = "line"
  g_avPar(1,3) = "f"
  g_avPar(2,3) = ""
 
'* rileva
  if not RilePar (g_avPar,true) then
    fineProgramma
  end if
'* -----------------------------

'*------------------------------
'* controlla
'*------------------------------
'* esistenza file
  if not g_oFSO.FileExists(g_avPar(2,2)) then
    g_sMsg = "Il file:" _
           & string(2,vblf) _
           & g_avPar(2,2) _
           & string(2,vblf) _
           & "NON ESISTE!!!"
    g_lIco = vbcritical
    g_sTit = "ERRORE"
    msgbox g_sMsg,g_lIco,g_sTit
    fineProgramma
  end if

'* valore di line [facoltativo]
  if len(g_avPar(2,3))= 0 then
   '* applica il default
    g_avPar(2,3) = false
  else
    g_avPar(2,3) = lcase(g_avPar(2,3))
    if not g_avPar(2,3) = "true"  and _
       not g_avPar(2,3) = "false" then
      g_sMsg = "Il parametro line" _
             & string(2,vblf) _
             & "deve essere true o false" _
             & string(2,vblf) _
             & "/line:true" _
             & vblf _
             & "oppure" _
             & vblf _
             & "/line:false"
      g_lIco = vbcritical
      g_sTit = "ERRORE"
      msgbox g_sMsg,g_lIco,g_sTit
      fineProgramma
    end if
  end if
 
end sub
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-
'* TERMINE impostaParCmdLine
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-

'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-
'* INIZIO Trattamento
'*
'* corpo dell'elaborazione
'*
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-
sub Trattamento()

                                        '*---------------------------------
  dim sPercorso                         '* percorso del file origine
                                        '*---------------------------------
  dim sNomeFileBak                      '* nome del backup numerato
                                        '*---------------------------------
  dim sExt                              '* estensione del file origine
                                        '*---------------------------------
  dim iCountBak                         '* conta backups
                                        '*---------------------------------
 
'* sceglie il trattamento
  if g_avPar(2,3) then
   '* sostituzione di tutta la linea
    sostLine
  else
   '* sostituzione di 'parola'
    sostWord
  end if

'* verifica se avvenuta sostituzione
  if g_bSostGlob then
    sExt = g_ofso.GetExtensionName(g_avPar(2,2))
    sNomeFileBak = replace(g_avPar(2,2),sExt,"bk")
    sPercorso = g_oFSO.GetParentFolderName(g_avPar(2,2))
    set g_oFolder = g_oFSO.GetFolder(sPercorso)
    set g_oFiles= g_oFolder.Files
    iCountBak = -1
    for each g_oFile in g_oFiles
      iCountBak = iCountBak + 1
      if not g_oFSO.FileExists(sNomeFileBak & iCountBak) then
       '* crea backup numerato
        g_oFSO.CopyFile g_avpar(2,2),sNomeFileBak & iCountBak
        set g_oFileOUT = g_oFSO.OpenTextFile(g_avPar(2,2),g_ForWriting,false,-2)
        g_oFileOUT.Write g_sFileSost
        g_oFileOUT.Close
        exit for
      end if
    next
  end if
   
end sub

'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-
'* TERMINE Trattamento
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-

'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-
'* INIZIO sostWord
'* sostituzione di una stringa con un'altra
'*
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-
sub sostWord()

                                      '*-----------------------------------
  dim sFileCont                       '* contenuto file originale
                                      '*-----------------------------------
'* legge il file
  Set g_oFileIN = g_oFSO.OpenTextFile(g_avPar(2,2), g_ForReading)
  sFileCont = g_ofileIN.ReadAll
  g_ofileIN.Close

'* effettua la sostituzione
  Set g_oRegExpr = New RegExp
  g_oRegExpr.Global = True
  g_oRegExpr.IgnoreCase = true
  g_oRegExpr.Pattern = g_avPar(2,0) & "\b"
  if g_oRegExpr.Test(sFileCont) then
    g_bSostGlob = true
    g_sFileSost = g_oRegExpr.Replace(sFileCont,g_avPar(2,1))
  end if

end sub
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-
'* TERMINE impostaParCmdLine
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-


'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-
'* INIZIO sostLine
'*
'* sostituzione dell'intera linea con una stringa
'*
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-
sub sostLine()
                                        '*---------------------------------
  dim sLineCont                         '* linea originale
                                        '*---------------------------------
  dim sLineSost                         '* linea sostituita
                                        '*---------------------------------
  dim avFileCont                        '* vettore file             
                                        '*---------------------------------
  dim s                                 '* generico: scansione
                                        '*---------------------------------

'* imposta
  redim avFileCont(0)
  Set g_oRegExpr = New RegExp
  g_oRegExpr.Global = True
  g_oRegExpr.IgnoreCase = true
  g_oRegExpr.Pattern = g_avPar(2,0) & "\b"

'* legge il file
  Set g_oFileIN = g_oFSO.OpenTextFile(g_avPar(2,2), g_ForReading)

'* lo trasforma in array
  Do Until g_oFileIN.AtEndOfStream
    sLineCont = g_oFileIN.Readline
    redim preserve avFileCont(ubound(avFileCont)+1)
    avFileCont(ubound(avFileCont)) = sLineCont   
  Loop

'* esamina
  for s = 1 to ubound(avFileCont)
    sLineCont = avFileCont(s)
    if g_oRegExpr.Test(sLineCont) then
      sLineSost = g_avPar(2,1)
      avFileCont(s) = sLineSost
      g_bSostGlob = true
    end if
  next

'* costruisce il file con sostituzioni
  if g_bSostGlob then
    '* la join non è possibile:
    '* il vettore parte da 1
     for s = 1 to ubound(avFileCont)
       g_sFileSost = g_sFileSost _
                 & avFileCont(s) _
                 & vbnewline
     next
  end if 

end sub
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-
'* TERMINE sostLine
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-


'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-
'* FINE PROGRAMMA
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-
sub fineProgramma

'* disalloca tutti gli oggetti
  set g_oShell = Nothing
  set g_oFSO = Nothing
  Set g_oRegExpr = nothing

'* chiude lo script
  WScript.quit

end sub
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-
'* TERMINE FINE PROGRAMMA
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-


'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-
'* -~-~-~-~-~-~-~-~-~-~                  -~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-
'* -~-~-~-~-~-~-~-~-~ Funzioni di servizio -~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-
'* -~-~-~-~-~-~-~-~-~-~                  -~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-

'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-
'* aggiunge funzionalità mancante in vbscript
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-
Function IIF (expr, truepart, falsepart)
  If expr then
    IIF = truepart
  Else
    IIF = falsepart
  End If
End Function
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-


'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-
'* Rileva parametri in riga comando
'*
'* NOTE:
'* la proprietà Named permette l'dentificazione dei parametri
'* con la sintassi: /nome_parametro:valore
'* se valore contiene spazi dovrà essere racchiuso fra doppie virgolette
'*
'* IMPORTANTE: i parametri sono CASE INSENSITIVE
'*
'*                  ///---///---///---///
'*
'* la funzione restituisce falso se si sono verificati degli errori e
'*                               se Controllo = vero
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-
function rilePar(avNamedPar,bCntrl)

'*
                                        '*--------------------------------------
  dim colNamedArguments                 '* insieme parametri in commandline
                                        '*--------------------------------------
'*
                                        '*--------------------------------------'
  dim sItm                              '* nome del parametro
                                        '*--------------------------------------'
  dim sTmp                              '* generico: transito
                                        '*--------------------------------------'
  dim sElenco                           '* elenco errori
                                        '*--------------------------------------'
'*
                                        '*--------------------------------------'
  dim iAN                               '* scansione dell'insieme di parametri
                                        '*--------------------------------------'
'*
                                        '*--------------------------------------'
  dim bRet                              '* valore di ritorno della funzione:
                                        '* true  = OK
                                        '* false = si sono verificati errori
                                        '*--------------------------------------'

'* imposta per ok
  bRet = true

 '* rileva gli argomenti
  set colNamedArguments = WScript.Arguments.Named
  if not colNamedArguments.count = 0 then
    for iAN  = 0 to ubound(avNamedPar,2)
     '* rileva il nome del parametro
      sItm = avNamedPar(0,iAN)
     '* rileva il valore del parametro
      sTmp = colNamedArguments.Item(sItm)
      avNamedPar(2,iAN) = sTmp
    next
  end if

  if bCntrl then
   '* effetua il controllo sugli obbligatori
    sElenco = ""
    for iAN  = 0 to ubound(avNamedPar,2)
      if ucase(avNamedPar(1,iAN)) = "O" then
        if len(trim(avNamedPar(2,iAN))) = 0 then
          sElenco = sElenco _
                  & avNamedPar(0,iAN) _
                  & vblf
        end if
      end if
    next
   '* controlla se si sono verificati errori
    if len(sElenco) > 0 then
      g_sMsg = "I seguenti parametri obbligatori" _
             & string(2,vblf) _
             & sElenco _
             & string(2,vblf) _
             & "sono MANCANTI"
      g_lIco = vbCritical
      g_sTit = "ERRORE"
      msgbox g_sMsg,g_lIco,g_sTit
      bRet = false
    end if
  end if

'* restituzione
  rilePar = bRet

end function
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-

'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-~-~-~
'* -~-~-~-~-~-~-~-~ TERMINE SOTTOPROCEDURE E FUNZIONI ~-~-~-~-~-~-~--~-~-~-~-~-~
'* -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~--~-~-~-~-~-~

ISTRUZIONI

Descrizione
Lo script permette di effettuare:
.1 la sostituzione di una stringa cun un'altra
.2 la sostituzione di un'intera riga che contiene una stringa con una stringa
La scelta del tipo di servizio da svolgere è delegato a un paramentro in riga di lancio
A ogni esecuzione sullo stesso file è creato un file di backup numerato dell'originale

Creazione
.1 aprire blocco note
.2 copiare e incollare tutto il contenuto del blocco "Codice"
.3 salvare con estensione .vbs in una cartella a piacere

Esecuzione
myFindAndSost.vbs /from:"*1" /to:"*2" /file"*3" [/line:*4]
Lo script prevede tre parametri obbligatori e uno facoltativo
Il formato di ogni parametro è: /parametro:"valore"
Ogni parametro deve essere separato dai succevi con almeno uno spazio

Obbligatori
*1 /from: la stringa DA sostituire
*2 /to: la stringa DI sostituzione
*3 /file: unità:\percorso\nome_file
tutti racchiusi fra doppie virgolette

Facoltativi
*4 /line: è il discriminante del servizio:
se false la sostituzione avviene fra stringhe
se true tutta la riga che contiene il valore di /from: sarà sostituita con il valore di /to:

Esempi
Ipotizzando che:
.1 lo script sia stato memorizzato in c:\Script
.2 il testo da trattare sia presente in c:\Testi
.3 che mioTesto.txt contenga almeno una stringa Visualizza

l'esecuzione:
myFindAndSost.vbs /from:"Visualizza" /to:"Espone" /file:"c:\Testi\mioTesto.txt"
myFindAndSost.vbs /from:"Visualizza" /to:"Espone" /file:"c:\Testi\mioTesto.txt" /line:false
sostituirà "Visualizza" con "Espone",
ma NON: visualizzare o Visusalizzerà o Visualizzando

l'esecuzione:
myFindAndSost.vbs /from:"Visualizza" /to:"Espone" /file:"c:\Testi\mioTesto.txt" /line:true
sostituirà tutta la riga contenente "Visualizza" con Espone

Per delegare l'esecuzione a un .bat
creare un file con estensione .bat e con il seguente contenuto
Codice:

@ECHO OFF
if "%4" == "" (set parline=false) else (set parline=true)
c:\Script\myFindAndSost.vbs /from:"%1" /to:"%2" /file:"%3" /line:parline

Ipotizzando che il .bat sia stato creato con il nome sost.bat in C:\Batch
il suo richiamo sarà:
per la sostitozione di parola
C:\Batch\sost.bat "Visualizza" "Espone" "c:\Testi\mioTesto.txt"

per la sostituzione di linea
C:\Batch\sost.bat "Visualizza" "Espone" "c:\Testi\mioTesto.txt" true

edit, note dell'ultim'ora
AVVERTENZE
La sostituzione NON sarà effettuata se:
nella stringa associata a /from: è compreso uno spazio finale
e
nel testo la stringa è seguita [senza lo spazio] da un 'a capo' o dalla tabulazione

[i caratteri non stampabili sono resi visibile da editori di testo come PsPad o NotePad++]
Top
Profilo Invia messaggio privato
ZapoTeX
Dio maturo
Dio maturo


Registrato: 04/06/04 16:18
Messaggi: 2627
Residenza: Universo conosciuto

MessaggioInviato: 11 Dic 2011 15:06    Oggetto: Rispondi citando

Wow... Non avevo idea che i batch files fossero così potenti e versatili. Grazie a GreyWolf e SverX, si impara sempre da voi!
Top
Profilo Invia messaggio privato HomePage
balubeto
Dio minore
Dio minore


Registrato: 19/05/06 08:22
Messaggi: 757

MessaggioInviato: 11 Dic 2011 17:06    Oggetto: Rispondi citando

GRAZIE MILLE
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 11553
Residenza: Tokelau

MessaggioInviato: 12 Dic 2011 10:41    Oggetto: Rispondi citando

Zapo: i batch di DOS in effetti non sono né potenti né versatili, quello che ha postato GreyWolf è un VBscript e io ho postato due link a due programmini (console application -> ovvero vanno chiamati da riga di comando) fatti apposta per fare il lavoro di ricerca sostituzione.

(a meno di motivi didattici) non vedo perché non usare un programma già fatto per effettuare il lavoro... Rolling Eyes
Top
Profilo Invia messaggio privato HomePage
ZapoTeX
Dio maturo
Dio maturo


Registrato: 04/06/04 16:18
Messaggi: 2627
Residenza: Universo conosciuto

MessaggioInviato: 12 Dic 2011 11:21    Oggetto: Rispondi citando

Grazie della spiegazione! Smile
Top
Profilo Invia messaggio privato HomePage
passic
Comune mortale
Comune mortale


Registrato: 05/10/15 21:35
Messaggi: 1

MessaggioInviato: 05 Ott 2015 21:42    Oggetto: Rispondi citando

[quote="GrayWolf"]


[code]
@echo off
REM -- Prepare the Command Processor --
SETLOCAL ENABLEEXTENSIONS
SETLOCAL DISABLEDELAYEDEXPANSION

::BatchSubstitude - parses a File line by line and replaces a substring"
::syntax: BatchSubstitude.bat OldStr NewStr File
:: OldStr [in] - string to be replaced
:: NewStr [in] - string to replace with
:: File [in] - file to be parsed
:$changed 20100115
:$source http://www.dostips.com
if "%~1"=="" findstr "^::" "%~f0"&GOTO:EOF
for /f "tokens=1,* delims=]" %%A in ('"type %3|find /n /v """') do (
set "line=%%B"
if defined line (
call set "line=echo.%%line:%~1=%~2%%"
for /f "delims=" %%X in ('"echo."%%line%%""') do %%~X
) ELSE echo.
)
[/code]

[/quote]

Ciao Greywolf,
questo codice qui sopra è proprio quello che stavo cercando.
Purtroppo però ho visto che scrive a video il contenuto del file mentre a me servirebbe che riversasse tutto il nuoovo contenuto in un nuovo file txt.
Per favore, sarebbe complicato modificarlo in tal senso?
E cioè che riempisse un nuovo file con il contenuto che mostra a video?
sarebbe molto utile per me, ho provato a fare qualche modifica ma il risultato è che poi non funziona nemmeno quello che hai fatto tu :p
grazie, se puoi
cordialmente
passic
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 11:16
Messaggi: 11553
Residenza: Tokelau

MessaggioInviato: 06 Ott 2015 08:57    Oggetto: Rispondi

puoi redirigere l'output di un file batch verso un file (invece che verso lo schermo) usando l'operatore di redirezione dell'output.

Ovvero, se il batch si chiama 'miobatch.bat' allora devi solo lanciare

Codice:
miobatch.bat > file.txt


Ciao
Top
Profilo Invia messaggio privato HomePage
Mostra prima i messaggi di:   
Nuovo argomento   Rispondi    Indice del forum -> Programmazione Tutti i fusi orari sono GMT + 1 ora
Pagina 1 di 1

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi