2012-05-15 3 views
5

Ho un file denominato file.txt che contiene:file di testo multilinea, come mettere in una variabile d'ambiente

 this is line one^
    this is line two^
    this is the last line 

come posso mettere che in un env var?

posso fare questo da un file batch: test.bat

set LF=^ 
    [blank line] 
    [blank line] 
    rem two blank lines needed above 
    set multi=Line 1!LF!Line 2!LF!Last line 
    echo !multi! 

questo emette tre linee:

 Line 1 
     Line 2 
     Last line 

così come posso ottenere file.txt in envvar all'interno di un file batch ?

+0

è la carati^davvero nel file, o è che un segnaposto per un CRLF? Presumo che questa sia una macchina Windows. – RobW

+0

Il punto di inserimento è veramente nel file, è il modo di creare una variabile che contiene un carattere di avanzamento riga. 'imposta LF = ^' seguito da due righe vuote – jeb

+0

grazie jeb per il chiarimento –

risposta

7

Come diceva dbenham, può essere fatto anche con/f ma è un po 'più complicato.

La soluzione semplice 80% è

setlocal EnableDelayedExpansion 

set "var=" 
set LF=^ 


rem *** Two empty lines are required for the linefeed 
FOR /F "delims=" %%a in (myFile.txt) do (
    set "var=!var!!LF!%%a" 
) 
echo !var! 

ma non riesce con:
- Se una linea è vuota verrà saltato
- Se una linea inizia con ; l'EOL caratteri
- Se una riga contiene ! (e CARETS)

Ma allora si potrebbe usare un po 'complessa soluzione più

@echo off 
SETLOCAL DisableDelayedExpansion 
set "all=" 
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ aux1.txt"`) do (
    set "line=%%a" 
    SETLOCAL EnableDelayedExpansion 
    set "line=!line:#=#S!" 
    set "line=!line:*:=!" 
    for /F "delims=" %%p in ("!all!#L!line!") do (
     ENDLOCAL 
     set "all=%%p" 
    ) 
) 
SETLOCAL EnableDelayedExpansion 
if defined all (
set "all=!all:~2!" 
set ^"all=!all:#L=^ 

!" 
set "all=!all:#S=#!" 
) 
echo !all! 

Che codice fa?
primo luogo, il findstr /n ^^ sarà all'inizio di ciascuna riga un numero di riga e due punti, come

1:My first Line 
2:; beginning with a semicolon 
3: 
4:there was an empty line 

Questo risolve il problema di righe vuote e anche l'EOL-caratteri standard ; può essere ignorato.
Per ottenere il contenuto della linea, il valore è impostato su una variabile mentre l'espansione ritardata è disabilitata, questo risolve il problema con ! e ^ caratteri.

Per rimuovere il numero di riga e i due punti, verrà abilitata l'espansione ritardata (no, un delim di : non può risolverlo).

Quindi tutti gli # vengono sostituiti con #S, questo verrà eseguito prima, poiché dopo il prefisso la rimozione della riga potrebbe essere vuota e la sostituzione non riuscirebbe.
Ma perché lo sostituisco?
Ecco perché non posso inserire i ritorni a capo qui, come la seguente FOR/F fallirebbe con ritorni a capo incorporati,
così ho solo aggiungere avanzamento riga marcatore (in questo caso io uso #L), ma il contenuto del file potrebbe contenere anche un #L, ma sostituendo tutti gli # con #S tutti i contrassegni sono unici.

Dopo il contrassegno, c'è il problema di chiudere/disattivare l'espansione ritardata con un endlocal, ma conservare il contenuto della variabile modificata all e line.
Questo è fatto con il trucco FOR/F-endlocal, in quanto il %%p può trasportare il contenuto dietro la barriera endlocal.

Quindi, dopo aver letto il file completo, controllo se lo all è definito, in quanto sarebbe vuoto per un file vuoto.
Quindi il primo indicatore di riga #L verrà rimosso e tutti gli altri indicatori verranno sostituiti con un carattere di avanzamento reale.
Quindi il sicuro più sicuro #S verrà ripristinato su #.

Questo è tutto, quindi, anche questa soluzione è ovviamente ...

+0

+1, ho iniziato a percorrere la rotta FOR/F, ma poi ho pensato a me stesso, "Perché sto facendo tutto questo lavoro?" :-) – dbenham

+0

molto divertente :) ma poi sono venuto come una piccola cavalletta che vuole solo imparare le intrache di DOS ... e sono umiliato che tu gli daresti il ​​vecchio college provare ... ma molte grazie per tutte le tue lavoro, qui e all'estero! starò sul sentiero –

+0

questo ovviamente è geniale! come il mio file sorgente (aux) è in realtà un file html che deve essere inserito in un record SQL (e la fonte contiene! nella prima riga). quindi +2 per quel bit di codice perspicace! quindi ora devo solo controllare la dimensione del file per assicurarmi che sia sotto il limite di 8k, altrimenti non posso dividere il! tutto! in! all1! ! all2 !, ecc. circa la metà dei miei file sono 8k-30K quindi probabilmente il massimo è quattro o cinque! tutto! var di. grazie per la condivisione –

2

Eri quasi arrivato. È necessario leggere ogni riga di testo e quindi aggiungere la riga più un avanzamento riga alla variabile.

FOR/F può essere utilizzato, ma non funziona bene con l'espansione ritardata se il contenuto contiene ! caratteri. È anche scomodo conservare righe vuote e scomodo per disabilitare l'opzione EOL.

Una soluzione più semplice è utilizzare SET/P per leggere le righe. Le limitazioni di questa tecnica sono:

1) trim caratteri finali controllo di ogni riga

2) Il file necessario utilizzare Windows terminatori di linea standard di ritorno, avanzamento linea. Non funzionerà con il feed di riga in stile Unix.

3) è limitato a leggere 1023 byte per riga (esclusi i caratteri linea terminatore)

tener presente che una variabile ambiente può contenere solo un poco meno di 8 kbyte di dati. Quindi sei limitato a caricare solo un file molto piccolo in una variabile con questa tecnica.

@echo off 
setlocal enableDelayedExpansion 
set LF=^ 


:: Two blank lines above needed for definition of LF - do not remove 
set file="test.txt" 
set "var=" 
for /f %%N in ('find /c /v "" ^<%file%') do set lineCnt=%%N 
<%file% (
    for /l %%N in (1 1 %lineCnt%) do (
    set "ln=" 
    set /p "ln=" 
    set "var=!var!!ln!!lf!" 
) 
) 
set var 
+0

ringrazia signor Benham! sto lavorando su questo ora. –

+0

+1, poiché è il modo più semplice e nella maggior parte dei casi non hai bisogno di più – jeb

+0

beh penso che potrei spingere il limite con questo dato che il mio file a volte eccede 8k, quindi dovrò analizzare l'unico file in due o più variabili ... anche a DOSville dove tenterò l'impossibile :) –