2009-04-08 16 views
64

Estoy trabajando en un archivo por lotes de Windows que bcp tres archivos de texto en SQL Server. Si algo sale mal en la producción, quiero poder anular los nombres de los archivos. Así que estoy pensando en hacer algo como esto.Comprobar la variable nula en el lote de Windows

bcp.exe MyDB..MyTable1 in %1 -SMyServer -T -c -m0 
bcp.exe MyDB..MyTable2 in %2 -SMyServer -T -c -m0 
bcp.exe MyDB..MyTable3 in %3 -SMyServer -T -c -m0 

Me gustaría ser capaz de entrar en nombres predeterminados para los tres archivos, que se utilizará si no se suministran los parámetros posicionales. La idea sería o bien para ejecutar

myjob.bat 

sin parámetros, y tienen que utilizar los valores por defecto, o ejecutar

myjob.bat "c:\myfile1" "c:\myfile2" "c:\myfile3" 

y hacer que usar esos archivos. No he podido averiguar cómo saber si% 1,% 2 y% 3 existen y/o son nulos. Tampoco sé cómo establecer esos valores condicionalmente. es posible? Cualquier sugerencia sera apreciada.

Respuesta

114

para la prueba de la existencia de un parámetro de línea de comandos, utilice corchetes vacíos:

IF [%1]==[] echo Value Missing 

o

IF [%1] EQU [] echo Value Missing 

El SS64 page on IF le ayudará aquí. En "¿Existe% 1?".

No se puede establecer un parámetro de posición, así que lo que debe hacer es hacer algo como

SET MYVAR=%1 

A continuación, puede volver a configurar MYVAR basado en su contenido.

+0

¡Muy bueno para el viento! ¡Gracias! – antivirtel

+0

¿Esto significa 'IF"% 1 "==" "' es malo? – bryc

+0

Sí "% 1" genera un error de sintaxis cuando arg1 tiene comillas, por lo que es mejor usar corchetes. – mosh

13
rem set defaults: 
set filename1="c:\file1.txt" 
set filename2="c:\file2.txt" 
set filename3="c:\file3.txt" 
rem set parameters: 
IF NOT "a%1"=="a" (set filename1="%1") 
IF NOT "a%2"=="a" (set filename2="%2") 
IF NOT "a%3"=="a" (set filename1="%3") 
echo %filename1%, %filename2%, %filename3% 

Tenga cuidado con los caracteres de cita, puede o no necesitarlos en sus variables.

+2

+1; Casi cualquier caracter o cadena funcionará: si no es% 1. ==. si no es {% 1} == {}; si no% 1null == null ... –

+0

+1 para advertir acerca de las citas ... ¡la ruina de los programas por lotes! – RBerteig

28

Ambas respuestas son correctas, pero la mía es un poco diferente. Es posible que desee tener en cuenta un par de cosas ...

iniciar el lote con:

SetLocal 

y terminar con

EndLocal 

Esto mantendrá todos sus 'conjuntos" de ser la única válida durante la sesión actual, y no dejará nombres como "FileName1" o cualquier otra variable que establezca durante la ejecución, esto podría interferir con la siguiente ejecución del archivo por lotes. Por lo tanto, puede hacer algo como:

IF "%1"=="" SET FileName1=c:\file1.txt 

El otro truco es que si sólo se proporciona 1, 2 o parámetros, utiliza el comando SHIFT para moverlos, así que el que busca siempre está a 1% ...

Por ejemplo, el proceso de el primer parámetro, cambiarlos, y luego hacerlo de nuevo. De esta manera, no está codificando% 1,% 2,% 3, etc ...

El procesador por lotes de Windows es mucho más potente de lo que la gente le da crédito por ..He hecho algunas cosas locas con eso, incluido el cálculo de la fecha de ayer, incluso a través de los límites de meses y años, incluido el año bisiesto, y la localización, etc.

Si realmente quieres ser creativo, puedes llamar a funciones en el procesador por lotes ... Pero eso es realmente para una discusión diferente ... :)

Ah, y no nombra a sus archivos por lotes .bat bien .. son .cmd 's ahora .. je ..

Espero que esto ayude.

+0

Gracias por las sugerencias. Solo curiosidad ... ¿Por qué .cmd en lugar de .bat? –

+5

En realidad, creo que esto es un revés. BAT es para DOS, y CMD es para WinNT. Pero, la verdadera razón es que, al mismo tiempo, tenía cmd.exe y command.com. .cmd estaba relacionado con cmd.exe, era el analizador para aquellos. Creo que también te hace ver más guay, pero no puedo confirmarlo. :) – LarryF

+1

Hay una sutil diferencia entre ellos, y Raymond Chen tenía una publicación de Old New Thing que no puedo encontrar en este momento ... Google no está siendo mi amigo. Ver también este SO Q: http://stackoverflow.com/questions/148968/windows-batch-files-bat-vs-cmd – RBerteig

27

Lo correcto sería utilizar una declaración "if defined", que se utiliza para probar la existencia de una variable. Por ejemplo:

IF DEFINED somevariable echo Value exists 

En este caso particular, la forma negativa se debe utilizar:

IF NOT DEFINED somevariable echo Value missing 

PS: el nombre de la variable debe ser utilizado sin caracters "%".

+0

gracias por la respuesta. ¿Funcionaría eso con los parámetros numerados, como lo estoy usando en mi ejemplo, o solo con las variables nombradas? –

+0

+1 porque esto también funciona si 'somevariable' tiene ** quotes ** mientras' IF [% somevariable%] == [] 'arroja un error. –

+0

¿Por qué no es esta la respuesta aceptada? –

Cuestiones relacionadas