2010-06-18 8 views
97

Este archivo por lotes libera una compilación desde TEST a LIVE. Deseo agregar una restricción de verificación en este archivo que asegure que haya un documento de lanzamiento adjunto en una carpeta específica.¿Cómo se lee el contenido del archivo en una variable en un archivo por lotes?

"C:\Program Files\Windows Resource Kits\Tools\robocopy.exe" "\\testserver\testapp$"   
"\\liveserver\liveapp$" *.* /E /XA:H /PURGE /XO /XD ".svn" /NDL /NC /NS /NP 
del "\\liveserver\liveapp$\web.config" 
ren "\\liveserver\liveapp$\web.live.config" web.config 

Así que tengo un par de preguntas acerca de cómo lograr esto ...

  1. hay un archivo en la carpeta version.txt\\testserver\testapp$, y el único contenido de este archivo es el número de compilación (por ejemplo, 45 - para la compilación 45) ¿Cómo leo los contenidos del archivo version.txt en una variable en el archivo por lotes?

  2. ¿Cómo puedo verificar si existe un archivo, \\fileserver\myapp\releasedocs\ {build}.doc, usando la variable de la parte 1 en lugar de {build}?

Respuesta

198

contenidos de archivos de lectura en una variable:

for /f "delims=" %%x in (version.txt) do set Build=%%x 

o

set /p Build=<version.txt 

Ambos actúan de la misma con una sola línea en el archivo, para más líneas de la variante for se ponga la última línea en la variable, mientras que set /p usará primero .

utilizando la variable - al igual que cualquier otra variable de entorno - se una, después de todo:

%Build% 

Por lo tanto, para comprobar la existencia:

if exist \\fileserver\myapp\releasedocs\%Build%.doc ... 

Aunque también puede ser que ningún Las rutas UNC están permitidas allí. No puedo probar esto ahora, pero ten esto en cuenta.

+0

El método 'set' sólo lee unos 1.024 caracteres, ¿por qué ¿es eso? –

+8

Probablemente debido a los límites de un búfer dentro de 'cmd'. Es un lenguaje horrible para scripts confiables. – Joey

+0

Lo sé, luché durante horas para reemplazar una cadena en un archivo: | –

12

para obtener todas las líneas del archivo cargado en la variable, es necesaria expansión retardada, por lo que hacer lo siguiente:

SETLOCAL EnableDelayedExpansion 

for /f "Tokens=* Delims=" %%x in (version.txt) do set Build=!Build!%%x 

Hay un problema con algunos caracteres especiales, aunque especialmente ;, % y !

+0

Encerrar toda la expresión 'set' entre comillas dobles podría evitar problemas con al menos _some_ caracteres especiales:' establecer "Build =! Build! %% x" '. – aschipfl

+5

Mi script simplemente imprime "echo is ON". ¿Por qué el lote es basura completa? –

23

acaba de hacer:

type version.txt 

y se mostrará como si escribió:

set /p Build=<version.txt 
echo %Build% 
+1

-1 Lo mismo es respondido por Joey hace 3 años. Pero él proporciona más información – jeb

+4

@jeb, lo sé, pero todavía estoy agradecido por el comando de tipo porque eso es lo que necesitaba –

26

Usted puede leer múltiples variables de archivo de la siguiente manera:

for /f "delims== tokens=1,2" %%G in (param.txt) do set %%G=%%H 

donde param.txt:

PARAM1=value1 
PARAM2=value2 
... 
+0

esta es la solución perfecta. para responder literalmente al OP, '(param.txt)' debe ser '(version.txt)' y debe contener 'Build = 45' – robotik

+0

Esta es ** la ** solución. –

+1

%% G inesperado en este momento. – John

-2
@echo off 
set str=^&Type file.txt 
echo %str% 
+0

Esto está mal, ya que str no contiene el resultado del comando type. En cambio, simplemente contiene el comando con un signo de aprobación líder – jeb

Cuestiones relacionadas