Presumo che si desidera copiare C: \ OtherFolder \ fileToCheck.bat a C: \ MyFolder se il file esistente in C: \ MyFolder è mancante del tutto, o se manca "stringToCheck ".
FINDSTR imposta ERRORLEVEL su 0 se la stringa viene trovata, su 1 se non lo è. Imposta anche errorlevel su 1 se il file è mancante. Stampa inoltre ogni riga corrispondente. Dal momento che stai cercando di usarlo come una condizione, presumo che non ti serva o desideri vedere alcun risultato. La prima cosa che suggerirei è di reindirizzare sia l'output normale che l'errore a zero usando >nul 2>&1
.
Soluzione 1 (per lo più la stessa di risposte precedenti)
È possibile utilizzare IF ERRORRLEVEL N
per verificare se l'errorlevel è> = N. Oppure è possibile utilizzare IF NOT ERRORLEVEL N
per verificare se errorlevel è < N. Nel tuo caso tu vuoi il primo
findstr /c:"stringToCheck" "c:\MyFolder\fileToCheck.bat" >nul 2>&1
if errorlevel 1 xcopy "C:\OtherFolder\fileToCheck.bat" "c:\MyFolder"
Soluzione 2
È possibile verificare per un valore specifico di errorlevel utilizzando% ERRORLEVEL%. Probabilmente è possibile verificare se il valore è uguale a 1, ma potrebbe essere più sicuro verificare se il valore non è uguale a 0, poiché è impostato su 0 solo se il file esiste e contiene la stringa.
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"
Soluzione 3
C'è una sintassi molto compatto per eseguire in modo condizionale un comando basato sul successo o il fallimento del comando precedente: cmd1 && cmd2 || cmd3
che significa eseguire cmd2 se cmd1 ha avuto successo (errorlevel = 0), altrimenti eseguire cmd3 se cmd1 non è riuscito (errorlevel <> 0). È possibile utilizzare & & da solo o || solo. Tutti i comandi devono essere sulla stessa riga. Se avete bisogno di eseguire in modo condizionale comandi multipli è possibile utilizzare più linee da parentesi aggiungendo
cmd 1 && (
cmd2
cmd3
) || (
cmd4
cmd5
)
Quindi per il vostro caso, tutto ciò che serve è
findstr /c:"stringToCheck" "c:\MyFolder\fileToCheck.bat" >nul 2>&1 || xcopy "C:\OtherFolder\fileToCheck.bat" "c:\MyFolder"
Hai bisogno di votare per l'altro commento qui sotto questa, che include più scenari ... Esp come fare se altrimenti ... –
La logica del controllo ERRORLEVEL è decisamente sbagliata. Valuterà sempre FALSE perché FINDSTR esce sempre con ERRORLEVEL 0 o 1 e 'SE NOT ERRORLEVEL 0' è vero solo se ERRORLEVEL è minore di 0. – dbenham