Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

simple Batch - bin ich zu doof?

Frage Entwicklung Batch & Shell

Mitglied: thecaptain

thecaptain (Level 1) - Jetzt verbinden

20.03.2008, aktualisiert 16:39 Uhr, 4114 Aufrufe, 10 Kommentare

Hallo,

ich bin grade dabei ein Batch-Sicherungsprogramm mit Robocopy zu schreiben und teste vorher kleinere Elemente der Batch in separaten Dateien.

Jetzt stoße ich bei einem meiner Tests grade auf ein völlig unlogisches Problem: Ich führe die Batch aus, das cmd-Fenster erscheint für eine Zehntelsekunde und schließt sich gleich wieder - normalerweise ein Zeichen für irgendeinen gravierenden Syntaxfehler oder ähnliches.

Um den Fehler zu isolieren habe ich die Batch sehr vereinfacht, sehe aber keinen Fehler. Ich bin jetzt sogar so kühn zu behaupten, dass dort kein Fehler drin ist! (oho)

Könnte bitte mal einer über den Text schauen und mir sagen, ob ich was übersehen habe oder ob CMD einfach nur spinnt? Um die Funktion der Batch geht es hier vorläufig nicht, sondern nur darum, ob ich heute lieber wegen akuter Verblödung früh nach Hause gehen sollte.

01.
@echo off 
02.
 
03.
set i= 
04.
%i%=false 
05.
goto test 
06.
 
07.
:test 
08.
echo ":test" aufgerufen 
09.
echo
10.
 
11.
if %i%==false ( 
12.
 %i%=true 
13.
 rem goto test 
14.
  
15.
 echo innerhalb if ist i immer noch = %i% 
16.
 echo muesste aber true sein!  
17.
18.
 
19.
echo nach if i = %i% 
20.
pause
Mitglied: Galamar
20.03.2008 um 08:54 Uhr
Ich würde bahaupten, dass das Problem bei
[code]
set i=
%i%=false
[/code]
liegt.

In dem Moment, in dem die Variable erstellt wird muss ihr auch ein Wert zugewiesen werden vorausgesetzt natürlich, dass nicht ich derjenige bin, der sich wegen totaler Verblödung freinehmen sollte ;)
Bitte warten ..
Mitglied: thecaptain
20.03.2008 um 09:01 Uhr
Ich würde bahaupten, dass das Problem
bei
[code]
set i=
%i%=false
[/code]
liegt.

Hm, eigentlich sollte es dass nicht. In diesem Beispiel wird das auch so gemacht.

Aber du scheinst recht zu haben: Die CMD schließt sich nicht sofort wieder - merkwürdig.

01.
@echo off 
02.
 
03.
set i=false 
04.
rem %i%=false 
05.
goto test 
06.
 
07.
:test 
08.
if %i%==false ( 
09.
 %i%=true 
10.
 rem goto test 
11.
  
12.
 echo innerhalb if ist i immer noch = %i% 
13.
 echo muesste aber true sein!  
14.
15.
 
16.
echo nach if i = %i% 
17.
pause
Weiß zufällig noch jemand, warum das so ist?? Außerdem zeigt er mir jetzt an "Der Befehl "false"ist entweder falsch geschrieben oder konnte nicht gefunden werden." --> HÄH??

Ich fürchte du darfst leider noch nicht ins Osterwochenende abdüsen - bei mir hingegen wird es immer wahrscheinlicher...
Bitte warten ..
Mitglied: BKAMk2
20.03.2008 um 09:01 Uhr
Moin,

ich denke mal du willst eine abfrage machen, bei der "i" den standardwert "false" bekommt.
Erst wenn eine bestimmte forderung erfüllt wurde soll diese auf true springen oder?

Wenn ja, hier die lösung:
01.
 
02.
@echo off 
03.
 
04.
set i=false 
05.
echo %i% 
06.
if %username%==%username% set i=true 
07.
echo %i% 
08.
if %i%==true echo Die Abfrage hat den Wert "true" ergeben! 
09.
pause 
10.
 
€dit:
Nach dem von dir genannten Beispiel wird das nicht so gemacht!^^
Die Variablen werden erst gesetzt damit sie leer sind.
Danach wird ihnen ein Wert gegeben.
das ganze würde bei meiner Batch so aussehen:

01.
@echo off 
02.
 
03.
:Variablen leeren 
04.
set i= 
05.
 
06.
:Variablen füllen 
07.
set i=false 
08.
 
09.
:Inhalt ausgeben 
10.
echo %i% 
11.
 
12.
:Abfragen und aktualisieren 
13.
if %username%==%username% set i=true 
14.
 
15.
:aktuellen Inhalt ausgeben 
16.
echo %i% 
17.
 
18.
:Wenn i den Wert true hat mache das hier 
19.
if %i%==true echo Die Abfrage von i hat true ergeben! 
20.
 
21.
pause
Em Variablen nachträglich einen Wert zuzuordnen muss man wieder mit dem "set" befehl arbeiten. Daher auch das sofortige schliessen der cmd. Die cmd hat "false" in diesem fall wie ein befehl behandelt und gemeckert, dass dieser befehl nicht existiert

musst halt nur die jetzige "if" abfrage durch die ersetzen, die zu dem ergebnis führt was du möchtest und dann noch eine abfrage am 'Ende so gestalten wie du möchtest.

Hoffe geholfen zu haben
Bitte warten ..
Mitglied: thecaptain
20.03.2008 um 09:11 Uhr
Nach dem von dir genannten Beispiel wird das
nicht so gemacht!^^
Die Variablen werden erst gesetzt damit sie
leer sind.
Danach wird ihnen ein Wert gegeben.

Aaaah, na sicher. Jetzt wird einiges klar. Aber warum er jetzt meint Der Befehl "false"ist entweder falsch geschrieben oder konnte nicht gefunden werden. ist mir immer noch schleierhaft.

### EDIT ###
Anmerkung am Rande:
Wenn ich bei deinem Vorschlag Copy&Paste benutze habe ich das gleiche Problem wie ganz zu Anfang: Die CMD schließt sich sofort wieder. Ich habe erst vermutet es liegt an den einfachen Doppelpunkten ( =Sprungmarken ), das scheint es aber nicht zu sein.
Bitte warten ..
Mitglied: BKAMk2
20.03.2008 um 09:23 Uhr
...
Aber warum er jetzt meint Der Befehl
"false"ist entweder falsch
geschrieben oder konnte nicht gefunden
werden.
ist mir immer noch schleierhaft.

Das lag daran, dass die CMD nicht wusste was sie mit dem "false" anzufangen hat.
Dadurch das du geschrieben hast:
01.
set i= 
02.
%i%=false
dachte die CMD die komplette zweite Zeile besteht aus Befehlen.
Den Befehl false kennt die CMD aber nicht


€dit:
Was für ein Betriebssystem hast du denn im Einsatz?

Hab Windows XP Prof. Klappt wunderbar.
Welches Beispiel hast du denn verwendet?
Bitte warten ..
Mitglied: thecaptain
20.03.2008 um 09:30 Uhr
Das lag daran, dass die CMD nicht wusste was
sie mit dem "false" anzufangen
hat.
Dadurch das du geschrieben hast:

dachte die CMD die komplette zweite Zeile
besteht aus Befehlen.
Den Befehl false kennt die CMD aber nicht

So sieht es bei mir jetzt aus, und der Fehler kommt trotzdem:
01.
set i= 
02.
set i=false
Wie wäre es richtig? (liegt wohl eher am OS, ich teste es gleich mal auf einer VM)
### EDIT ###
Gleicher Fehler auf WinXP home.


€dit:
Was für ein Betriebssystem hast du denn
im Einsatz?

Hab Windows XP Prof. Klappt wunderbar.
Welches Beispiel hast du denn verwendet?

1. Windows 2000 Prof. SP4
### EDIT ###
auf meiner WinXP home-VM geht es

2. Angepasst:
01.
@echo off 
02.
 
03.
::Variablen leeren 
04.
set i= 
05.
 
06.
::Variablen füllen 
07.
set i=false 
08.
 
09.
::Inhalt ausgeben 
10.
echo %i% 
11.
 
12.
::Abfragen und aktualisieren 
13.
if %username%==%username% set i=true 
14.
 
15.
::aktuellen Inhalt ausgeben 
16.
echo %i% 
17.
 
18.
::Wenn i den Wert true hat mache das hier 
19.
if %i%==true echo Die Abfrage von i hat true ergeben! 
20.
 
21.
pause
Bitte warten ..
Mitglied: BKAMk2
20.03.2008 um 09:46 Uhr
Kann daran liegen das Win 2000 die Variable %username% nicht kennt.
Gib mal "set" in der cmd ein. (ohne "")

Darauf sollte diese dir alle verfügbaren Varaiblen anzeigen.
Such dir da eine raus.

Ansonsten hab ich keine ahnung....hab erst vor kurzem mit Batch angefangen und das auch nur auf Win XP rechnern.
Bitte warten ..
Mitglied: thecaptain
20.03.2008 um 11:28 Uhr
Doch, kennt es. Wenn ich SET eingebe gibt es auch "USERNAME". Hatte ich schon probiert.

Wenn ich aber z.B. %username% durch %os% ersetze und weiter unten testweise ein
01.
echo %username%
reinschreibe geht es - seltsam.

Zwar weiß ich jetzt immer noch nicht, warum er meint "false" sei ein Befehl, aber dennoch:
Hoffe geholfen zu haben
-> auf jeden Fall!

### EDIT ###
Falls es noch jemanden interessiert, wie ich überhaupt auf diesen Code-Schnipsel gekommen bin:
Ich habe mir dieses Beispiel zu Gemüte geführt und gedacht " das könnte doch auch anders gehen... ".
Bitte warten ..
Mitglied: bastla
20.03.2008 um 12:55 Uhr
Hallo thecaptain und BKAMk2!

Ich habe mir dieses Beispiel zu Gemüte geführt und gedacht " das könnte doch auch anders gehen... ".
Kann es auch, aber nur bezüglich des Aktivierens der "DelayedExpansion" (der Möglichkeit, auch innerhalb von Blöcken wie "for"-Schleifen oder eben "if"-Konstrukten, Variableninhalte nicht nur verändern, sondern die geänderten Inhalte auch wieder auslesen zu können). Im verlinkten Beispiel wird dies durch den Start der CMD-Shell mit dem Argument "/v" erreicht - die Alternative dazu (findet sich auch in vielen Beispielen hier im Forum) besteht darin (meist gleich zu Beginn des Batches) folgenden Befehl zu verwenden:
01.
setlocal enabledelayedexpansion
Daraus ergibt sich, zusammen mit dem schon standardmäßigen "@echo off" folgende "Eröffnungszeile":
01.
@echo off & setlocal enabledelayedexpansion
Der Preis für die "verzögerte Variablenauflösung" ist die veränderte Schreibweise mit "!" anstelle von "%" und, dass in weiterer Folge "!" nicht mehr als gewöhnliches Textzeichen (zB bei Ausgabe eines Hinweises mit "echo") verwendet werden kann. Befinden sich in einem Text sogar zwei "!", wird der Teil dazwischen als Variablenname interpretiert, was dazu führt, dass er entweder verschwindet (da eine derartige Variable nicht definiert ist - zur Demo eine zusätzlich Zeile im Beispiel unten) oder sogar ein anderer Text aufscheint (falls es tatsächlich eine Variable dieses Namens bereits gäbe).

Um diesen Problemen auszuweichen, wird als Alternative zumeist ein internes Unterprogramm verwendet (Aufruf mit "call :Sprungziel", Ende mit "goto :eof" bzw Batchende).

Für den im Eröffnungsbeitrag geposteten Ansatz wären daher folgende Schreibweisen (inkl Korrektur der Variablenzuweisungen, die immer ein vorhergehendes "set" verlangen, und Absicherung der "if"-Zeile mit Anführungszeichen) möglich (die Änderung der jetzt nicht mehr zutreffenden Texte habe ich eingespart ):
01.
@echo off & setlocal enabledelayedexpansion 
02.
 
03.
set i=false 
04.
goto test 
05.
 
06.
:test 
07.
echo ":test" aufgerufen 
08.
echo. 
09.
 
10.
if "%i%"=="false" ( 
11.
 set i=true 
12.
 rem goto test 
13.
  
14.
 echo innerhalb if ist i immer noch = !i! 
15.
 echo muesste aber true sein!  
16.
 echo ... und das ist es jetzt !nicht! 
17.
18.
 
19.
echo nach if i = %i% 
20.
pause
oder
01.
@echo off 
02.
 
03.
set i=false 
04.
goto test 
05.
 
06.
:test 
07.
echo ":test" aufgerufen 
08.
echo. 
09.
 
10.
if "%i%"=="false" call :SetzeTrue &  rem goto test 
11.
 
12.
echo nach if i = %i% 
13.
pause 
14.
goto :eof 
15.
 
16.
:SetzeTrue 
17.
set i=true 
18.
   
19.
echo innerhalb if ist i immer noch = %i% 
20.
echo muesste aber true sein!  
21.
echo ... und das ist es jetzt !nicht! 
22.
 
23.
goto :eof
Noch zwei Anmerkungen:

Das oben gezeigte "setlocal" (ohne "enabledelayedexpansion") sollte eigentlich immer verwendet werden - damit wird die Gültigkeit aller innerhalb eines Batches vorgenommenen Veränderungen an Variablen auf diesen Batch beschränkt. Bereits vor der Ausführung des Batches definierte Variable (mit "set" zu überprüfen) können aber wie gewohnt verwendet werden und "bringen ihre Werte mit".

Da "i" sehr häufig als Laufvariable einer "for"-Schleife verwendet wird, würde ich für die Funktion als Schalter eher eine Variable "Fertig" oder "OK" oÄ verwenden.


Grüße
bastla
Bitte warten ..
Mitglied: miniversum
20.03.2008 um 16:39 Uhr
So und jetzt komm noch ich hinterher wegen dem %username% Problem
Könnte es seind as dein Benutzername eine Leerstelle enthält?
Dann würde das ganze bei demCode:
if %username%==%username% set i=true
sowas machen
if Vorname Nachname==Vorname Nachname set i=true
Der Befehl wir also zerpflückt.
Ändert man das ganze gringfügig funktioniert es:
if "%username%"=="%username%" set i=true

miniversum
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Batch & Shell
Dateinamen nach Zeichnen abschneiden - Batch-Shell (9)

Frage von cberndt zum Thema Batch & Shell ...

Batch & Shell
CMD Verschlüsslung ( Batch ) (11)

Frage von clragon zum Thema Batch & Shell ...

Batch & Shell
gelöst älteste dateien via batch löschen (6)

Frage von cali169 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (19)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (19)

Frage von patz223 zum Thema Windows Userverwaltung ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (15)

Link von Penny.Cilin zum Thema Viren und Trojaner ...