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"
es necesario votar por el otro comentario por debajo de éste, que incluye más escenarios ... Esp cómo hacerlo si then else .. –
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