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"
trzeba głosować na drugim komentarzu pod tym jednym, że zawiera więcej scenariuszy ... Esp, jak to zrobić, jeśli wtedy jeszcze .. –
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