2010-08-26 8 views
7

La siguiente es la secuencia de comandos por lotes que he escritoAsignación carácter de nueva línea a una variable en un script por lotes

@echo off 
setlocal enabledelayedexpansion 
set finalcontent= 
For /F "tokens=1-2* delims= " %%I in (abc.txt) do (
IF %%J EQU MAJORVER (
set currentline=%%I %%J %1 
set finalcontent=!finalcontent!!currentline! 
) ELSE IF %%J EQU MINORVER (
set currentline=%%I %%J %2 
set finalcontent=!finalcontent!!currentline! 
) ELSE IF %%J EQU BUILDNUM (
set currentline=%%I %%J %3 
set finalcontent=!finalcontent!!currentline! 
) ELSE (
set currentline=%%I %%J %%K%NL% 
set finalcontent=!finalcontent!!currentline! 
) 
) 
echo %finalcontent%>>xyz.txt 

Quiero un carácter de nueva línea se adjunta al final de cada ocurrencia de la currentline variable. ¿Alguien puede guiarme en esto?

Respuesta

5

Se puede definir la nueva línea de la siguiente manera:

set newline=^& echo. 

A continuación, puede utilizar la nueva línea en el eco-declaración, así: (no aplicable en la situación descrita, sin embargo)

echo %finalcontent%%newline% 

o puede utilizar la nueva línea en cada declaración-set, así: (mente el símbolo de intercalación adicional)

set finalcontent=!finalcontent!!currentline!^!newline! 

o similar:

set currentline=%%I %%J %1^%newline% 
+1

Originalmente marqué esto como -1 porque más tarde descubrí que esto funciona pero no con EnableDelayedExpansion (AKA! Var! En lugar de% var%). Podría considerar agregar eso a su respuesta en la parte superior en negrita. Así que puedo votar esto, no puedo cambiar mi voto a menos que se edite la respuesta. ;) –

16

Puede crear un carácter de nueva línea real y asignarlo a una variable.

setlocal EnableDelayedExpansion 
set LF=^ 


rem TWO empty lines are required 
echo This text!LF!uses two lines 

La nueva línea funciona mejor con la expansión retardada, también se puede utilizar con la expansión por ciento, pero entonces es un poco más complejo.

set LF=^ 


rem TWO empty lines are required 
echo This text^%LF%%LF%uses two lines 
echo This also^ 

uses two lines 

Cómo funciona?
El símbolo de intercalación es un carácter de escape, se escapa del siguiente carácter y se elimina.
Pero si el siguiente carácter es un salto de línea, también se eliminará el avance de línea y solo se escapará el siguiente carácter (incluso si esto también es un salto de línea).

Por lo tanto, se requieren dos líneas vacías, LF1 se ignora LF2 se escapa y LF3 es necesario para terminar la "línea".

set myLinefeed=^<LF1> 
<LF2> 
<LF3> 

Consejos:
a menudo es mejor utilizar un formato muy diferente de la definición de la variable de nueva línea, para evitar un borrado inadvertidamente de las líneas vacías requeridos.

(SET LF=^ 
%=this line is empty=% 
) 

He eliminado a menudo una de las líneas vacías y luego busqué por siempre por qué mi programa ya no funcionaba.

Y la versión paranoica también verifica la nueva variable para espacios en blanco u otra basura.

if "!LF!" NEQ "!LF:~0,1!" echo Error "Linefeed definition is defect, probably multiple invisble whitespaces at the line end in the definition of LF" 

FOR /F "delims=" %%n in ("!LF!") do (
    echo Error "Linefeed definition is defect, probably invisble whitespaces at the line end in the definition of LF" 
) 
+1

Eso está caliente. He estado usando este lenguaje para siempre, y aprendo cosas completamente nuevas casi semanalmente. Increíble cuantas peculiaridades tiene. Gracias – user1167442

Cuestiones relacionadas