2011-12-16 8 views

Respuesta

7

No está evaluando una condición para el IF. Supongo que no quiere copiar si encuentra stringToCheck en fileToCheck. Es necesario hacer algo como (código no probado, pero se entiende la idea):

CD C:\MyFolder 
findstr /c:"stringToCheck" fileToCheck.bat 
IF NOT ERRORLEVEL 0 XCOPY "C:\OtherFolder\fileToCheck.bat" "C:\MyFolder" /s /y 

EDITAR por dbenham
El ensayo anterior está mal, siempre se evalúa como FALSO.
La prueba es correcta IF ERRORLEVEL 1 XCOPY ...

Actualización: No puedo probar el código, pero no estoy seguro de qué valor de retorno findstr devuelve realmente si no encuentra nada. Puede que tenga que hacer algo como:

CD C:\MyFolder 
findstr /c:"stringToCheck" fileToCheck.bat > tempfindoutput.txt 
set /p FINDOUTPUT= < tempfindoutput.txt 
IF "%FINDOUTPUT%"=="" XCOPY "C:\OtherFolder\fileToCheck.bat" "C:\MyFolder" /s /y 
del tempfindoutput.txt 
+0

es necesario votar por el otro comentario por debajo de éste, que incluye más escenarios ... Esp cómo hacerlo si then else .. –

+1

La lógica de la verificación ERRORLEVEL es definitivamente incorrecta. Siempre evaluará a FALSO porque FINDSTR siempre sale con ERRORLEVEL 0 o 1, y 'IF NOT ERRORLEVEL 0' solo es verdadero si ERRORLEVEL es menor que 0. – dbenham

5

En DOS/Windows lotes mayoría de los comandos devuelven un exitCode, llamado "nivel de error", es decir, un valor que habitualmente es igual a cero si el comando finaliza correctamente, o un número mayor que cero si termina debido a un error, con un mayor número de errores mayores (de ahí el nombre).

Hay un par de métodos para comprobar ese valor, pero el original es:

IF ERRORLEVEL value command 

anterior si prueba si el nivel de error devuelto por el comando anterior fue mayor o igual al valor dado y, si esto es cierto, ejecuta el comando. Por ejemplo:

verify bad-param 
if errorlevel 1 echo Errorlevel is greater than or equal 1 
echo The value of errorlevel is: %ERRORLEVEL% 

Findstr comando de retorno 0 si se encuentra la cadena y 1 si no:

CD C:\MyFolder 
findstr /c:"stringToCheck" fileToCheck.bat 
IF ERRORLEVEL 1 XCOPY "C:\OtherFolder\fileToCheck.bat" "C:\MyFolder" /s /y 

código anterior copiará el archivo si la cadena no se encontró en el archivo.

CD C:\MyFolder 
findstr /c:"stringToCheck" fileToCheck.bat 
IF NOT ERRORLEVEL 1 XCOPY "C:\OtherFolder\fileToCheck.bat" "C:\MyFolder" /s /y 

Código anterior copie el archivo si se encontró la cadena. Prueba esto:

findstr "string" file 
if errorlevel 1 (
    echo String NOT found... 
) else (
    echo String found 
) 
56

supongo que quiere copiar C: \ OtherFolder \ fileToCheck.bat a C: \ MiCarpeta si el archivo existente en C: \ MiCarpeta está ausente por completo, o si no se encuentra "stringToCheck ".

FINDSTR establece ERRORLEVEL en 0 si se encuentra la cadena, en 1 si no lo está. También establece errorlevel en 1 si el archivo falta. También imprime cada línea que coincide. Como intenta usarlo como condición, supongo que no necesita o no quiere ver ninguna de las salidas. Lo primero que sugeriría es redirigir tanto la salida normal como la de error a nul usando >nul 2>&1.

Solución 1 (en su mayoría los mismos que las respuestas anteriores)

Puede utilizar IF ERRORRLEVEL N para comprobar si el nivel de error es> = N. O puede utilizar para comprobar si IF NOT ERRORLEVEL N nivel de error es < N. En su caso quieres lo primero.

findstr /c:"stringToCheck" "c:\MyFolder\fileToCheck.bat" >nul 2>&1 
if errorlevel 1 xcopy "C:\OtherFolder\fileToCheck.bat" "c:\MyFolder" 

Solución 2

Puede probar un valor específico del nivel de error utilizando% ERRORLEVEL%. Probablemente pueda verificar si el valor es igual a 1, pero podría ser más seguro verificar si el valor no es igual a 0, ya que solo se establece en 0 si el archivo existe y contiene la cadena.

findstr /c:"stringToCheck" "c:\MyFolder\fileToCheck.bat" >nul 2>&1 
if not %errorlevel% == 0 xcopy "C:\OtherFolder\fileToCheck.bat" "c:\MyFolder" 

o

findstr /c:"stringToCheck" "c:\MyFolder\fileToCheck.bat" >nul 2>&1 
if %errorlevel% neq 0 xcopy "C:\OtherFolder\fileToCheck.bat" "c:\MyFolder" 

Solución 3

Hay una sintaxis muy compacto para ejecutar condicionalmente un comando basado en el éxito o fracaso de la orden anterior: cmd1 && cmd2 || cmd3 que significa ejecutar cmd2 si cmd1 fue exitoso (errorlevel = 0), de lo contrario ejecute cmd3 si cmd1 falló (errorlevel <> 0). Puede usar & & solo o || solo. Todos los comandos deben estar en la misma línea. Si es necesario ejecutar condicionalmente múltiples comandos que se pueden utilizar varias líneas de paréntesis, añadiendo

cmd 1 && (
    cmd2 
    cmd3 
) || (
    cmd4 
    cmd5 
) 

Así que para su caso, todo lo que necesita es

findstr /c:"stringToCheck" "c:\MyFolder\fileToCheck.bat" >nul 2>&1 || xcopy "C:\OtherFolder\fileToCheck.bat" "c:\MyFolder" 
0

He intentado conseguir este trabajo utilizando FINDSTR, pero para alguna razón mi "depuración" siempre un nivel de salida de comandos de error de 0:

ECHO %ERRORLEVEL% 

mi solución es utilizar Grep de Cygwin, que da salida a la derecha nivel de error (que dará un correo rrorlevel mayor que 0) si no se encuentra una cadena: también errorlevel salida 2 si no se encuentra el archivo

dir c:\*.tib >out 2>>&1 
grep "1 File(s)" out 
IF %ERRORLEVEL% NEQ 0 "Run other commands" ELSE "Run Errorlevel 0 commands" 

grep de Cygwin. Aquí está el hash de mi versión:

C: \ temp \ temp> grep --version grep (grep de GNU) 2.4.2

C: \ cygwin64 \ bin> md5sum grep.exe c0a50e9c731955628ab66235d10cea23 * grep .exe

C: \ cygwin64 \ bin> sha1sum grep.exe ff43a335bbec71cfe99ce8d5cb4e7c1ecdb3db5c * grep.exe

Cuestiones relacionadas