2011-12-16 10 views

Odpowiedz

7

Nie oceniasz warunku dla IF. Zgaduję, że nie chcesz kopiować, jeśli znajdziesz stringToCheck w fileToCheck. Musisz zrobić coś takiego (kod niesprawdzone ale masz pomysł):

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

EDIT przez dbenham
Powyższy test jest źle, to zawsze ma wartość FAŁSZ.
Prawidłowe test jest IF ERRORLEVEL 1 XCOPY ...

Aktualizacja: Nie mogę przetestować kod, ale nie jestem pewien, co właściwie powrót wartość findstr zwraca jeśli nie znajdzie niczego. Być może trzeba zrobić coś takiego:

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

trzeba głosować na drugim komentarzu pod tym jednym, że zawiera więcej scenariuszy ... Esp, jak to zrobić, jeśli wtedy jeszcze .. –

+1

Logika kontroli ERRORLEVEL jest zdecydowanie błędna. Zawsze będzie FALSE, ponieważ FINDSTR zawsze kończy się z ERRORLEVEL 0 lub 1, a 'IF NOT ERRORLEVEL 0' jest prawdziwe, jeśli ERRORLEVEL jest mniejszy niż 0. – dbenham

5

wsadowym DOS/Windows Większość poleceń zwracają exitCode, zwany „errorlevel”, że jest to wartość, która zazwyczaj jest równa zero, jeśli komenda kończy się prawidłowo, lub numer większa niż zero, jeśli kończy się z powodu błędu, z większą liczbą dla większych błędów (stąd nazwa).

Istnieje kilka metod, aby sprawdzić tę wartość, ale oryginalny jest:

IF ERRORLEVEL value command 

Poprzednie badanie IF, czy errorlevel zwrócony przez poprzedniego polecenia był większy lub równy podana wartość, a jeśli to jest prawdą, wykonaj polecenie. Na przykład:

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

findstr powrotnej komenda 0 jeśli łańcuch został znaleziony i 1 jeśli nie:

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

Poprzedni kod kopiuje plik jeśli ciąg nie został znaleziony w pliku.

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

Poprzedni kod skopiuj plik, jeśli znaleziono ciąg. Spróbuj tego:

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

Przypuszczam chcesz skopiować C: \ OtherFolder \ fileToCheck.bat do katalogu C: \ MyFolder jeśli plik istnieje w katalogu C: \ MyFolder jest albo całkowicie brakuje, lub jeśli go brakuje „stringToCheck ".

FINDSTR ustawia ERRORLEVEL na 0, jeśli łańcuch zostanie znaleziony, na 1, jeśli nie jest. Ustawia także poziom błędu na 1, jeśli brakuje pliku. Drukuje również każdą pasującą linię. Ponieważ próbujesz użyć go jako warunku, zakładam, że nie potrzebujesz lub chcesz zobaczyć jakiekolwiek wyjście. Pierwszą rzeczą, którą sugerowałbym, jest przekierowanie zarówno normalnego, jak i wyjściowego błędu do nul przy użyciu >nul 2>&1.

Rozwiązanie 1 (w większości takie same jak w poprzednich odpowiedziach)

Można użyć IF ERRORRLEVEL N aby sprawdzić, czy errorlevel wynosi> = N. Albo można użyć IF NOT ERRORLEVEL N aby sprawdzić, czy errorlevel jest < N. W twoim przypadku chcesz ten pierwszy.

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

Rozwiązanie 2

można przetestować dla określonej wartości errorlevel przy użyciu% ERRORLEVEL%. Prawdopodobnie możesz sprawdzić, czy wartość jest równa 1, ale może być bezpieczniej sprawdzić, czy wartość nie jest równa 0, ponieważ jest ona ustawiona na 0, jeśli plik istnieje i zawiera ciąg.

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

lub

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

Rozwiązanie 3

Jest bardzo kompaktowy składnia warunkowo wykonanie polecenia w oparciu o sukces lub niepowodzenie poprzedniego polecenia: cmd1 && cmd2 || cmd3 co oznacza wykonanie cmd2 jeśli cmd1 powiodło się (errorlevel = 0), w przeciwnym razie wykonaj cmd3, jeśli nie udał się cmd1 (errorlevel <> 0). Możesz użyć tylko & & lub || sam. Wszystkie polecenia muszą znajdować się w tej samej linii. Jeśli trzeba warunkowo wykonanie wielu poleceń można korzystać z wielu linii, dodając nawiasach

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

więc w Twoim przypadku, wszystko czego potrzebujesz to

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

Starałem się uzyskać to działa przy użyciu findstr, ale dla jakiegoś powodu mój „debugowanie” komenda zawsze wydać poziom błędu 0:

ECHO %ERRORLEVEL% 

Moje obejście jest użyj grep z Cygwin, który wyprowadza prawy ERRORLEVEL (to daje e rrorlevel większa niż 0) jeśli ciąg nie zostanie znaleziony:

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

grep Cygwin będzie również wyjście errorlevel 2 Jeśli plik nie zostanie znaleziony. Oto skrót od mojego wersji:

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

Powiązane problemy