2011-12-16 9 views

risposta

7

Non si sta valutando una condizione per l'IF. Sto indovinando che non vuoi copiare se trovi stringToCheck in fileToCheck. Hai bisogno di fare qualcosa di simile (codice non testato, ma si ottiene l'idea):

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

EDIT dbenham
Il test di cui sopra è sbagliato, restituisce sempre FALSO.
Il test corretto è IF ERRORLEVEL 1 XCOPY ...

Update: Non riesco a testare il codice, ma non sono sicuro di quello di ritorno valore findstr in realtà torna se non trova nulla. Potrebbe essere necessario fare qualcosa di simile:

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

Hai bisogno di votare per l'altro commento qui sotto questa, che include più scenari ... Esp come fare se altrimenti ... –

+1

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

5

In DOS/Windows Batch maggior parte dei comandi restituiscono un exitCode, chiamato "errorlevel", cioè un valore che abitualmente è uguale a zero se il comando termina correttamente, o un numero maggiore di zero se finisce per un errore, con numeri maggiori per errori maggiori (da cui il nome).

Ci sono un paio di metodi per verificare che il valore, ma l'originale è:

IF ERRORLEVEL value command 

precedente SE test se l'errorlevel restituito dal comando precedente era maggiore o uguale al valore dato e, se questo è vero, esegui il comando. Per esempio:

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

Findstr comando di ritorno 0 se la stringa è stato trovato e 1 se non:

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

codice precedente copierà il file se la stringa non è stato trovato nel file.

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

Codice precedente copiare il file se la stringa è stata trovata. Prova questo:

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

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" 
0

Ho cercato di ottenere questo lavoro utilizzando FINDSTR, ma per qualche motivo il mio "debug" comando sempre in uscita un livello di errore di 0:

ECHO %ERRORLEVEL% 

la mia soluzione è utilizzare Grep da Cygwin, che emette l'errorlevel destra (che darà una e rrorlevel maggiore di 0) se una stringa non viene trovata: sarà anche errorlevel uscita 2 se non viene trovato il file

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

grep di Cygwin. Ecco l'hash da mia versione:

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

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

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

Problemi correlati