2012-04-02 16 views
-4

Warum funktioniert dieser Code nicht richtig?"Programmieren" einer Batch-Datei, IF-Anweisungen in IF-Anweisungen?

Ich bin traurig, dass ich konnte nicht verstehen, wie Sie den Code zu schreiben, ist so hier ein Bild des Codes:

[1] (auch [Bildbeschreibung hier eingeben], klicken Sie bitte auf den Link, weil ich bin ein neuer Benutzer und ich kann Bilder noch nicht posten)

Ist die Eingabeaufforderung sogar in der Lage, diese "verzweigten IF-Befehle" korrekt auszuführen? Wenn ja, was mache ich falsch? Jeder weiß es? Bitte antworte!

:STARTEXITING 
"D:\dbStatusChecker\dbFi1estatus.exe" "D:\Dropbox" > dbstatus_uTorrent_Exit_Pass_1.txt 
findstr /m "up to date" dbstatus_uTorrent_Exit_Pass_1.txt 
if %error1eve1%==0 (
    SLEEP 2 
    "D:\dbStatusChecker\dbFi1estatus.exe" "D:\Dropbox" > dbstatus_uTorrent_Exit_Pass_2.txt 
    findstr /m "up to date" dbstatus_uTorrent_Exit_Pass_2.txt 
    if %error1eve1%==0 (
     SLEEP 3 
     "D:\dbStatusChecker\dbFi1estatus.exe" "D:\Dropbox" > dbstatus_uTorrent_Exit_Pass_3.txt 
     findstr /m "up to date" dbstatus_uTorrent_Exit_Pass_3.txt 
     if %error1eve1%==0 (
      process -q uTorrent.exe 15 
      :STARTSTARTING 
      "D:\dbStatusChecker\dbFi1estatus.exe" "D:\Dropbox" > dbstatus_uTorrent_Start_Pass_1.txt 
      findstr /m "up to date" dbstatus_uTorrent_Start_Pass_1.txt 
      if %error1eve1%==0 (
       SLEEP 2 
       "D:\dbStatusChecker\dbFi1estatus.exe" "D:\Dropbox" > dbstatus_uTorrent_Start_Pass_2.txt 
       findstr /m "up to date" dbstatus_uTorrent_Start_Pass_2.txt 
       if %error1eve1%==0 (
        SLEEP 3 
        "D:\dbStatusChecker\dbFi1estatus.exe" "D:\Dropbox" > dbstatus_uTorrent_Start_Pass_3.txt 
        findstr /m "up to date" dbstatus_uTorrent_Start_Pass_3.txt 
        if %error1eve1%==0 (
         D: 
         cd\ 
         cd Dropbox 
         cd uTorrent 
         start uTorrent.exe 
         ) else (
         SLEEP 1 
         GOTO STARTSTARTING 
         ) else (
        SLEEP 1 
        GOTO STARTSTARTING 
        ) else (
       SLEEP 1 
       GOTO STARTSTARTING 
       ) else (
      SLEEP 1 
      GOTO STARTEXITING 
      ) else (
     SLEEP 1 
     GOTO STARTEXITING 
     ) else (
    SLEEP 1 
    GOTO STARTEXITING 

Für höhere Gerechtigkeit: Dieser Text wurde OCR-ed von http://i.stack.imgur.com/RgsId.png

+1

Bitte formatieren Sie Ihren Code so, dass er lesbar ist. –

+0

Welche Fehlermeldung erhalten Sie? – aphoria

+0

Die Hilfe beim Posten einer Frage sollte klarstellen, wie man Code schreibt. –

Antwort

2

cmd kann if s verschachtelt Griff gut. Dein Problem ist ein anderes. Wie es steht alle Ihre if prüft, bis auf die erste wird nicht tun, was Sie wollen.

Verwendung verzögerte Expansion durch eine Datei

setlocal enabledelayedexpansion 

an der Spitze des Batch setzen und !errorlevel! statt %errorlevel% verwenden.

Da jedoch nur für überprüfen Errorlevel 0 sein können Sie genauso gut tun

if not errorlevel 1 ... 

statt

if %errorlevel%==0 
+0

Ich habe nur noch ein Problem: Wenn alles erledigt ist, wenn uTorrent ausgeführt wird, sollte das Skript aufhören, richtig? Aber es geht weiter! – user1307920

+0

Okay, ich habe "GOTO END" nach der Zeile "start uTorrent.exe" hinzugefügt und das: END auf das Ende der Batch-Datei gesetzt. Jetzt funktioniert alles (wahrscheinlich) wie es soll! Vielen Dank! – user1307920

1

Da alle else Klauseln enden mit einem goto, warum sie nicht umkehren Alles, dann wirst du die Verschachtelung beseitigen.

Wenn der Code funktioniert, Arbeit erledigt. Wenn es immer noch nicht funktioniert, ist das ein Faktor weniger, über den man nachdenken sollte.

+0

Das sollte auch funktionieren. Das Problem ist nicht ihre Verschachtelung, sondern eher, dass sie nicht wissen, was passiert, wenn Sie Umgebungsvariablen innerhalb von Blöcken verwenden. Ich muss zugeben, dass ich nicht wirklich versucht habe zu verstehen, was sie dort gemacht haben ... – Joey

2

Joey hat ein Problem bezüglich verzögerter Expansion diagnostiziert. Sie haben ein anderes - Sie sollten kein Etikett in einen IF ELSE-Block legen - Sie werden höchstwahrscheinlich nicht das gewünschte Ergebnis erhalten. Siehe https://stackoverflow.com/a/8481978/1012053.

Christian hat einen großen Vorschlag, Ihren Code neu zu strukturieren, um die Verschachtelung loszuwerden.

Da Sie einfach dieselben Befehle mit zunehmenden Schlafintervallen ausführen, können Sie eine FOR/L-Schleife verwenden, um Ihren Code weiter zu vereinfachen.

@echo off 

:startExiting 
set started= 
for /l %%N in (1 1 3) do (
    if defined started sleep %%N 
    set started=1 
    "D:\dbStatusChecker\dbFileStatus.exe" "D:\Dropbox" > dbstatus_uTorrent_Exit_Pass_%%N.txt 
    findstr /m "up to date" dbstatus_uTorrent_Exit_Pass_%%N.txt || goto :startExiting 
) 

process -q uTorrent.exe 15 

:startStarting 
set started= 
for /l %%N in (1 1 3) do (
    if defined started sleep %%N 
    set started=1 
    "D:\dbStatusChecker\dbFileStatus.exe" "D:\Dropbox" > dbstatus_uTorrent_Start_Pass_%%N.txt 
    findstr /m "up to date" dbstatus_uTorrent_Start_Pass_%%N.txt || goto :startStarting 
) 

d: 
cd \Dropbox\uTorrent 
start uTorrent.exe 
+0

Es scheint, dass diese Lösung nicht ganz so funktioniert, wie sie sollte, aber 5 Sterne, weil sie schließlich ein Programm verlässt, und 5 Sterne für Anstrengung ! Ich werde das später unbedingt brauchen! – user1307920

Verwandte Themen