Zurück   CC-Community Board > CC-CB Knowledge Base > Top-Topic Forum

Antwort
 
Themen-Optionen Thema durchsuchen Ansicht
Alt 20.08.2005, 15:18   #1
Ragnar
Oldie
 
Registriert seit: 15.05.2003
Beiträge: 1.490
Standard Rag's BatchTips und Hilfe Thread

In den letzten Tagen kamen mehrere Anfragen nach Batchlösungen oder Fragen die durch batch recht einfach gelöst werden konnten.

Da diese uralte und nicht gerade mächtige "skriptsprache" immer noch gebraucht werden kann möchte ich mal ein paar tips geben die ich laufe der Jahre gelernt habe.

Und wenn jemand Fragen zu batch und zur Lösung von Probleme in Batch hat können wir hier versuchen sie zu lösen oder auch demjenigen "nen batch Kurs geben".
Eure anfragen nach speziefischen Lösungen wie Ordnerstruktur Umbenennen, Dateien Ordnerübergreifend umbenennen ? (Batch) oder batch-datei zur datenübersicht? gehören natürlich weiterhin in eigene threads denn für vieles gibt es super Programme oder sonstige tricks sowas zu lösen.

Bei beidem, den Tips und der Hilfe hoffe ich natürlich auch auf den Rest vom Board. Postet die Kniffe und Timesaver die ihr kennt und Helft mit.

----- 22.08.05
Forschleife hier im Thread

delims und tokens in Forschleifen hier im Thread
-----
übersichtliche For Schleifen
Ich mache for Schleifen eigentlich (wenn über 2-3 Befehle) immer so:
Code:
FOR %%f .... IN (..) do call :for1 "%%f"
GOTO for1ende
	:for1
	set Param=%~1
	echo hier die Befehle
	GOTO :EOF
:for1ende
So hat man es strukturiert, kann es schön einrücken und muss weder mit extra .cmd's noch mit Klammern arbeiten.
NACHTEIL: (danke Flipper)
Zitat:
Zitat von Flipper
haben den Nachteil, daß Dateinamen, die Sonderzeichen wie %, & oder ^ enthalten, nicht fehlerfrei übergeben werden können.
...dafür die traditionelle for-Schleife mit "(xyz )"...Nachteil dieser Methode ist allerdings, daß innerhalb der Klammer, in der die Befehle angegeben werden, der set-Befehl nicht funktioniert.

Echo ohne Zeilenumbruch:
Code:
echo/|set /p=Dein Text hier
eignet sich z.B. um in logs nicht immer ne neue Zeile anzufangen oder so schöne sich aufbauende Punkte am screen als "Vortschrittsbalken" zu verwenden.

Parameter Parsing von jsiinc.com
Code:
%1  	 The normal parameter.
als Übergabe an eine cmd oder  in einer Forschleife mit call :Sprungmarke (siehe oben)   Bsp. C:\MyApps\MyProg.exe[/I]
%~f1  	 expands %1 to a fully qualified path name. 
%~d1  	 expands %1 to a drive letter only.
Bsp. C:
%~p1  	 expands %1 to a path only.
Bsp. \MyApps\MyProg.exe
%~n1  	 expands %1 to a file name only (prefix)
Bsp. MyProg
%~x1  	 expands %1 to a file extension only.
Bsp. .exe
%~s1  	 changes the meaning of n and x options to reference the short name. 
%~z1  	 Returns the size of the file, if %1 is a file.
%~a1  	 Returns the attributes of the %1 object. 
%~t1  	 Returns the date and time that a file was modified, if %1 is a file. 
You can use some of these modifiers in combination:
%~dp1  	 expands %1 to a drive letter and path only.
Bsp. C:\MyApps\
%~nx1  	 expands %1 to a file name and extension only.
Bsp. MyProg.exe
funktioniert auch mit %%f von Forschleifen!
Gutes Beispiel: %0 ist der Gesammte Pfad der batch selbst C:\lala\xyz.cmd man sieht dann oft %0\..\reg.exe was die reg.exe im selben Pfad wie die .cmd aufrufen soll. das ist zwar auch NT4 kompatibel aber finde ich unschön und sowas lässt sich selten als parameter für programme verwenden.
daher nimmt man einfach %~dp0 (achtung "\" am ende!) %~dp0reg.exe

Stingmanipulation und Stringhandling
kaum etwas ist so schwer und ätzend in batch wie das.
Man hat einen string, z.B. aus der Ausgabe eines Programms
REG QUERY hklm\SOFTWARE\MICROSOFT\WINDOWS\currentVersion\Run /v "DAEMON Tools-1033"
Ergebniss:
Code:
! REG.EXE VERSION 3.0

HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS\currentVersion\Run
    DAEMON Tools-1033   REG_SZ  "C:\Programme\D-Tools\daemon.exe"  -lang 1033
man möchte aber eigentlich nur "C:\Programme\D-Tools\daemon.exe" -lang 1033
was nun?
erstmal muss man den Output auf nur die eine Zeile einschränken.
REG QUERY xxxxx /v "DAEMON Tools-1033"|find /I "DAEMON Tools-1033"
denn wir wissen ganz genau dass der String im Output sein soll. (Erfolg/Misserfolg über Errorlevel 0/1 prüfen)
nun müssen wir das in eine Variable kriegen um uns den benötigten String rauszuschneiden. daher hinten >"%temp%\My.tmp" anhängen und der Output geht in die Datei.
set /p DTools=<"%temp%\My.tmp" (liest die erste Zeile ein)
Jetzt haben wir aber immernoch den ganzen Anfang vornedrann stehen und müssen leider zu recht unschönen Mitteln greifen.
Stringmanipulation über set
wir zählen ab wann "C:\... beginnt und entfernen alles vorher
set DTools2=%DTools:~29%

weitere Stringmanipulation über set (set /? für Infos)
:~ hat noch mehrere Möglichkeiten
set lala=CC-CB_Rulez
echo %lala:~2,4% ab dem 2ten Zeichen 4 die nächsten 4 Zeichen
Ergebniss:-CB_
echo %date:~-4%.%date:~3,2%.%date:~0,2% die letzen 4, 2 ab dem 3ten, die ersten beiden
Ergebniss: 2005.08.20 gut für logfilenamen

Mit :x=y lassen sich auch strings Ersetzen
echo %lala:CC-CB=Batch%
Ergebniss: Batch_Rulez

Da Batch für fast alles zusatztools benötigt, abschliessend noch eine Liste unersetzbarer Batch Tools.
Nicht die robocopy's und reg.exe's die besondere Aufgaben erfüllen, die Liste würde zu lang, sondern welche die generell in batches benötigt werden.
WBat - GUI in einer DOS Box (durch Webjunkies alten Patcher drauf gestossen)
UnixUtils - grep, sed etc für bessere/kompizierte Stringhandlings etc.
Ragnar ist offline   Mit Zitat antworten
Alt 21.08.2005, 09:58   #2
spider-man
Oldie
 
Benutzerbild von spider-man
 
Registriert seit: 07.06.2002
Beiträge: 821
Standard

Tolle Idee Ragnar !

Deine Tipps sind mir leider (noch) zu kompliziert.
In einer ruhigen Stunde werde ich sie mir aber etwas genauer ansehen und mal versuchen sie nachzuvollziehen.

Was ich schon immer mal lernen wollte - und vielleicht kannst du das mal hier etwas genauer erklären - sind diese FOR-Sachen.

Aufbau, Funktion und wann lohnt es sich FOR-Schleifen zu verwenden ?

Ausserdem würde Ich persönlich beispielsweise Folgendes benötigten:

Ich habe einen Order mit sagen wir mal mit ein parr hundert Dateien.
Diese Dateien sollen jetz in 5 Dateihäppchen in eine Ordnerstruktur einsortiert werden nach folgendem Schema:

-001
datei001.xxx
datei002.xxx
datei003.xxx
datei004.xxx
datei005.xxx

-002
datei006.xxx
datei007.xxx
datei008.xxx
datei009.xxx
datei010.xxx

-003
....
....
....

usw, usw....


Geht sowas ?
__________________
Schöne Grüsse
spider-man
spider-man.2000@gmx.de
spider-man ist offline   Mit Zitat antworten
Alt 21.08.2005, 12:34   #3
Ragnar
Oldie
 
Registriert seit: 15.05.2003
Beiträge: 1.490
Standard

ja geht
Code:
@echo off
set ActDir=C:\temp\sort
set i=0
FOR %%f in (%ActDir%\*.*) do call :for1 "%%f"
GOTO for1end
:for1
	set FileName=%~1
	echo %FileName%
	set /a count=%i%/5
	echo %count%
	set /a FolderNumber=%count%+1
	echo %FolderNumber% 
	set ZeroPrefix=00
	IF %FolderNumber% GTR 9 set ZeroPrefix=0
	IF %FolderNumber% GTR 99 set ZeroPrefix=
	IF NOT EXIST "%ActDir%\%ZeroPrefix%%FolderNumber%" md "%ActDir%\%ZeroPrefix%%FolderNumber%"
	move "%FileName%" "%ActDir%\%ZeroPrefix%%FolderNumber%"
	set /a i=%i%+1
	GOTO :EOF
:for1end
pause
Beim rauskopieren auf die leerzeichen am ende achten.
Ragnar ist offline   Mit Zitat antworten
Alt 21.08.2005, 13:17   #4
Ragnar
Oldie
 
Registriert seit: 15.05.2003
Beiträge: 1.490
Standard

jetzt zur Forschleife:
Also auf jedenfall mal die Beschreibung der Windows Hilfe dazu lesen! ist echt gut.

Eine For Schleifen benutzt man wenn mehrmals etwas ausgeführt werden soll.
Beispiele: 100mal, oder man hat 10 Ordner für die das gleiche gemacht werden soll, etc.

Selbst eine Liste angeben:
FOR %%f in (Lisa Helmut Thomas) do echo Name=%%f (in dos boxen nur %f, %%f ist für Batchdateien)

von 1 bis 10 in einserschritten
FOR /L %%f in (1,1,10) do echo Zahl=%%f

für jede Zeile einer Datei. hier gibts mit delims, tokens etc sehr viele Möglichkeiten.
FOR /F %%f in (C:\temp\input.txt) do echo Zeile=%%f

man kann auch den Output eines Programms nehmen.
FOR /F %%f in ('dir /S /B C:\temp') do echo File=%%f

So, das war "für was" die Schleifen ausgeführt werden soll.
jetzt muss noch was sinnvolleres als das echo damit gemacht werden und dafür braucht man oft mehr als nur eine Zeile.

Code:
FOR /L %%f in (1,1,10) do call :for1 %%f
GOTO for1end
	:for1
	set input=%~1
	IF %input% GTR 5 echo %input% ist groesser als 5!!
	GOTO :EOF
:for1end
mit call ruft man ja gewöhnlich andere bat oder cmd dateien auf und nachdem sie abgearbeitet sind wird in der nächsten zeile weitergemacht.

Hier callen wir einen Sprungpunkt als wäre es eine andere batch und übergeben das %%f aus der Forschleife welches dort zu %1 wird.

jetzt wird der inhalt der Schleife ausgeführt,am GOTO :EOF ist sie vorbei und es kommt der nächste Schleifendurchlauf. Bis wir bei 10 sind denn hier ist vorbei und es geht in die nächste Zeile "GOTO for1ende" und somit springen wir an der Schleifen vorbei und es wird mit was auch immer danach kommt weitergemacht.
Ragnar ist offline   Mit Zitat antworten
Alt 22.08.2005, 11:23   #5
spider-man
Oldie
 
Benutzerbild von spider-man
 
Registriert seit: 07.06.2002
Beiträge: 821
Standard

Hi Rangar

Danke für deine Mühe !
Deine Batchdatei zum Verschieben funktioniert einwandfrei.

Trotzdem: wirklich durchblicken tue ich da nicht.
Speziell die Sache mit dem Zähler schnalle ich absolut nicht.

Und nochwas:
Wie kann mant mit move alle Dateien aus diversen Unterordnern in den nächstübergeordeten Ordner verschieben ?

Hintergrund:
Bei der Batch die du mir oben geschrieben hast, müssen die Dateien in einem Ordner liegen. (Hatte ich ja auch so angegeben)

Jetzt möchte ich in diversen Unterordnern verteilte Dateien in den nächstübergeordneten Ordner verschieben und von dort aus mittels deiner Batch weiter verteilen.

BTW:
In der Batch von dir, darf im ActDir kein Leerzeichen sein.
Lässt sich das ändern ?
spider-man ist offline   Mit Zitat antworten
Alt 22.08.2005, 12:48   #6
Ragnar
Oldie
 
Registriert seit: 15.05.2003
Beiträge: 1.490
Standard

FOR %%f in ("%ActDir%\*.*") do call :for1 "%%f"
dann gehts


Sobalds mehr zu verschieben gibt reicht move nicht mehr, würde dann robocopy.exe nehmen.

Das mit dem Zähler in der Batch für dich funktionier folgendermassen.
Du willst immer 5 Dateien in einen Unterordner dessen name hochgezählt werden soll.
Ich nehme einfach einen Zähler der sich bei jedem Durchlauf der Schleife um eins erhöht.
set /a i=%i%+1
Nr. 0-4 sollen in Ordner 001, 5-9 in 002 etc.
Jetzt teile ich einfach den Zähler durch 5
set /a count=%i%/5
bei 0-4 ergibt das abgerundet 0 bei 5-9 gibts 1
diese zahl erhöhe ich um eins und schon hab ich die richtigen Ordner in die ich es verschieben muss.
set /a FolderNumber=%count%+1

damit die Zahl immer dreistellig ist prüfe ich wieviele Nullen ich davorhängen muss
set ZeroPrefix=00
IF %FolderNumber% GTR 9 set ZeroPrefix=0
IF %FolderNumber% GTR 99 set ZeroPrefix=
Ragnar ist offline   Mit Zitat antworten
Alt 22.08.2005, 13:36   #7
spider-man
Oldie
 
Benutzerbild von spider-man
 
Registriert seit: 07.06.2002
Beiträge: 821
Standard

@Ragnar

Zitat:
FOR %%f in ("%ActDir%\*.*") do call :for1 "%%f"
Jepp - so klappt auch mit Leerzeichen

bezgl. Zähler
Ja - so wie du das erklärst, leuchtet es ein.
Nur, mein Problem ist im Problemfall zu erkennen, welche Lösung angebracht ist und wie ich daran gehen muss. Das von dir erklärte praktisch in der jewiligen Situation anzuwenden.

bzgl. Robocopy
Da gibt es ja die Schalter /MOV und /MOVE
Allerdings konnte ich nicht finden, wie ich alle Dateien aus den Unterverzeichnissen in den naechstuebergeordneten verschieben kann.

In der Regel ja mit /s
Aber wie ist hier die genaue Syntax ?
spider-man ist offline   Mit Zitat antworten
Alt 22.08.2005, 14:47   #8
Ragnar
Oldie
 
Registriert seit: 15.05.2003
Beiträge: 1.490
Standard

aus Unterordner eins höher verschieben:
Code:
set BaseDir=C:\temp\a
FOR /F "delims=;" %%f in ('dir /B /A:D "%BaseDir%"') do robocopy "%BaseDir%\%%f" "%BaseDir%" /MOVE
pause
Bei Kollision wird nicht verschoben, also auch nichts überschrieben.
Ragnar ist offline   Mit Zitat antworten
Alt 22.08.2005, 14:59   #9
spider-man
Oldie
 
Benutzerbild von spider-man
 
Registriert seit: 07.06.2002
Beiträge: 821
Standard

@Rangar
Code:
FOR /F "delims=;" %%f in ('dir /B /A:D "%BaseDir%"') do robocopy "%BaseDir%\%%f" "%BaseDir%" /MOVE
Ich bekomme
Datei nicht gefunden

//EDIT

Funktioniert doch !
Es lag wieder an so einem verflixten Leerzeichen (Copy&Paste aus dem Thread).

Sorry und Danke !!!


Siehst du, das meinte ich oben, als ich sagte: ich weiss nicht wann was anzuwenden ist. Ich wäre nie auf die Idee gekommen, das so zu lösen.

BTW: was ist delims ?
spider-man ist offline   Mit Zitat antworten
Alt 22.08.2005, 15:00   #10
annelie
Team (Userverw.)
 
Benutzerbild von annelie
 
Registriert seit: 21.04.2001
Beiträge: 17.748
Standard

werde diesen Thread später ins TopTopic verschieben, damit er nicht untergeht
annelie ist gerade online   Mit Zitat antworten
Alt 22.08.2005, 17:35   #11
Ragnar
Oldie
 
Registriert seit: 15.05.2003
Beiträge: 1.490
Standard

delims und tokens in Forschleifen

"delims" ist das Trennzeichen
Standard ist Leerzeichen (und glaube TAB)

zusammen mit "tokens" kann es einzellne Variablen aus der "FOR eingabe filtern"

Beispiel Eingabedatei mit Format: Name, Mutter, Vater
Helmut;Britta;Juergen
-jetzt wollen wir nur den Namen der Mutter auslesen
FOR /F "delims=; tokens=2" %%f in (lala.txt) do echo %%f
durch das trennzeichen wird aufgeteilt und über den token sagen wir dass wir nur das 2te haben wollen.
-jetzt wollen wir alles:
FOR /F "tokens=1,3,2 delims=;" %%f in (lala.txt) do echo %%f %%g %%h
durch die tokens können wir auch die Reihenfolge verändern
da ich vorne %%f nehme macht er im Alphabet einfach weiter
Weiteres in der Windows Hilfe.

Zum erkennen wann es passt kann ich dir leider keine tips geben.

Danke annelie
Ragnar ist offline   Mit Zitat antworten
Alt 22.08.2005, 18:52   #12
mig
Oldie
 
Benutzerbild von mig
 
Registriert seit: 24.04.2001
Beiträge: 5.741
Standard

Schoener Thread.

Kann man per batch files splitten?
Zusammenfuegen geht ja mit copy /b.

gruss mig
mig ist offline   Mit Zitat antworten
Alt 23.08.2005, 10:33   #13
Ragnar
Oldie
 
Registriert seit: 15.05.2003
Beiträge: 1.490
Standard

also mit batch selbst wär mir das nicht bekannt. Man braucht dann halt ein kommandozeilen FileSplit tool.

eventuell mittels "more Zeile x bis y" oder sowas, wobei sowas ja eher für ASCII gedacht ist und für Binärfiles sicher mit vorsicht zu betrachten ist. aber wer weiss....
Ragnar ist offline   Mit Zitat antworten
Alt 23.08.2005, 16:09   #14
Flipper
Oldie
 
Benutzerbild von Flipper
 
Registriert seit: 02.06.2002
Beiträge: 1.041
Standard

Hi,

for-Schleifen nach dem Prinzip

Code:
FOR %%f IN (*.*) do call :for1 "%%f"
GOTO for1ende
   :for1
   echo "%~1"
   GOTO :EOF
:for1ende
haben den Nachteil, daß Dateinamen, die Sonderzeichen wie %, & oder ^ enthalten, nicht fehlerfrei übergeben werden können. Wer das testen möchte, kann die obige Batchdatei mit den Dateien

Code:
Datei 1 & 2.txt
Datei 1^2.txt
Datei 100%.txt
ja mal in ein Verzeichnis packen und dann aufrufen.

Ist mit Dateinamen mit Sonderzeichen zu rechnen, sollte man die traditionelle for-Schleife favorisieren:

Code:
FOR %%f IN (*.*) do (
 echo %%f
 )
Nachteil dieser Methode ist allerdings, daß innerhalb der Klammer, in der die Befehle angegeben werden, der set-Befehl nicht funktioniert. (Dazu müßte man die standardmäßig deaktivierte verzögerte Erweiterung von Variablen aktivieren, allerdings kann man dann woanders wieder Probleme kriegen).

Allein schon aufgrund dieser Unzulänglichkeiten bin ich vor einigen Monaten auf eine sh-kompatible Shell umgestiegen. Die sh-Shell, auch Bourne Shell genannt, ist das Äquivalent von cmd.exe bzw command.com unter Unix/Linux. Sie ist der Vorläufer und quasi die Basis bekannter Shells wie der Bourne Again Shell (Bash) oder der Almquist Shell (ash). Unter Windows sind Bash und ash mittels Cygwin ( www.cygwin.com ) verfügbar.

Die einfachere Variante ist ash. Für letztere muß man nur zwei Dateien auf seinem Rechner haben (ash.exe und cygwin1.dll) und nicht - was einige abschrecken könnte - eine umfangreiche Cygwin-Installation.

Der Vorteil von bash/ash liegt darin, daß man:
- nicht die oben genannten Unzulänglichkeiten hat wie bei der Windows-Shell
- man meiner Meinung nach komfortabler und einfacher umfangreichere Batch-Skripte schreiben kann
- die Batch-Skripte sowohl auf Unix/Linux als auch Windows laufen
- man sich nebenbei mit dem Standard für Unix/Linux unter Windows vertraut machen kann und somit bei einem späteren Wechsel zu Unix/Linux nicht wie der Ochs vorm Berg steht
- es umfangreiche Sammlungen nützlicher Hilfsprogramme gibt (z.B. die GNU Core-utils), mit Hilfe derer man praktisch jede Aufgabe lösen kann

Übrigens:
Code:
"delims" ist das Trennzeichen
Standard ist Leerzeichen (und glaube TAB)
Ich nehme ; da es in Pfaden nicht vorkommen darf.
Das Semikolon darf in Pfaden vorkommen.

MfG
Flipper
Flipper ist offline   Mit Zitat antworten
Alt 23.08.2005, 19:30   #15
Ragnar
Oldie
 
Registriert seit: 15.05.2003
Beiträge: 1.490
Standard

danke Flipper
hab deine Infos oben mit aufgenommen.
Ragnar ist offline   Mit Zitat antworten
Alt 25.08.2005, 12:12   #16
annelie
Team (Userverw.)
 
Benutzerbild von annelie
 
Registriert seit: 21.04.2001
Beiträge: 17.748
Standard

werde jetzt verschieben,
annelie ist gerade online   Mit Zitat antworten
Alt 08.09.2005, 20:01   #17
Plymouth
Oldie
 
Registriert seit: 25.04.2001
Beiträge: 603
Standard

Hallo,

ich habe da ein Problem, vielleicht könnte man das auch mit einer Batch lösen.

Zitat:
...
08.09.2005 12:01:41 [highlight=red:6ee20a3c52]0002[/highlight:6ee20a3c52] S24474 U1408092005[highlight=red:6ee20a3c52]14[/highlight:6ee20a3c52]0039 T0 I9148700000200002001 B0001000000200
08.09.2005 12:02:38 0001 S24475 U1408092005 140136 T0 I3670300000200002001 B0001000000200
08.09.2005 12:02:59 0001 S24476 U1408092005 150157 T0 I9243700000200002001 B0001000000200
08.09.2005 12:03:31 [highlight=red:6ee20a3c52]0002[/highlight:6ee20a3c52] S24477 U1408092005[highlight=red:6ee20a3c52]15[/highlight:6ee20a3c52]0429 T0 I8948000000200002001 B0001000000200
...
Ich möchte/muss bei alle Zeilen einer Datei, wo vorne die 0002 steht den zweiten markierten Wert (hier z.B. die 14 und 15 - der Versatz der Zahlen kommt hier durch die Markierung) um 2 subtrahieren. Ist das irgendwie machbar?

Vielen Dank!!


cu

Plymouth
Plymouth ist offline   Mit Zitat antworten
Alt 08.09.2005, 21:54   #18
Ragnar
Oldie
 
Registriert seit: 15.05.2003
Beiträge: 1.490
Standard

Also die Sonderzeichen könnten da ein problem werden.
aber sonst müsste das machbar sein.

es muss sich nur etwa so formulieren lassen:
In Zeilen wo "<Lerrschritt>0002<Lerrschritt>" vorkommt. (muss sichergestellt sein dass es nicht irgendwo in den "daten" auch vorkommt.
sollen das 43te und das 44te Zeichen ausgelesen werden und dann mit 2 subtrahiert werden.

Wenn alles mit einer fixen breite ist also 0002 von zeichen A bis B und die Zahl von X bis Y kannst es auch über excel probieren und beim import auf feste breite stellen.

wenns nix geheimes ist schickt mal die datei an ragnar.rulez@gmx.de
Ragnar ist offline   Mit Zitat antworten
Alt 08.09.2005, 22:57   #19
dr_tommi
alter Oldie
 
Benutzerbild von dr_tommi
 
Registriert seit: 26.04.2001
Ort: Berlin
Beiträge: 3.252
Standard

Wie soll eigentlich das Ergebnis aussehen?
Willst du nur den verminderten Wert oder die ganze Zeile mit dem neuen Wert an der entsprechenden Position?
Für die Ausgabe der gesamten Datei mit den bearbeiteten Werten könnte das so aussehen:

Zitat:
@echo off

FOR /F "tokens=1,2,3,4,5,6,7,8,9* delims= " %%i in (test1.txt) do call :for1 %%i %%j %%k %%l %%m %%n %%o %%p %%q
GOTO for1end
:for1

if %~3 == 0002 call :schleife1 %1 %2 %3 %4 %5 %6 %7 %8 %9

::Ausgabe der unbearbeiteten Zeile
if not %~3 == 0002 echo %1 %2 %3 %4 %5 %6 %7 %8 %9

goto for1end

:schleife1
:: Speichern des gewünschten Wertes
set /a z = %6
:: Rest nach den beiden ersten Zeichen speichern
set z1=%z:~2%
:: nur die beiden ersten Zeichen speichern
set /a z = %z:~0,2%
:: um 2 vermindern
set /a z -= 2
::Ausgabe der bearbeiteten Zeile
echo %1 %2 %3 %4 %5 %z%%z1% %7 %8 %9

GOTO :EOF
:for1end


so wird aus:


Zitat:
08.09.2005 12:01:41 0002 S24474 U1408092005 140039 T0 I9148700000200002001 B0001000000200
08.09.2005 12:02:38 0001 S24475 U1408092005 140136 T0 I3670300000200002001 B0001000000200
08.09.2005 12:02:59 0001 S24476 U1408092005 150157 T0 I9243700000200002001 B0001000000200
08.09.2005 12:03:31 0002 S24477 U1408092005 150429 T0 I8948000000200002001 B0001000000200
nach der Bearbeitung

Zitat:
08.09.2005 12:01:41 0002 S24474 U1408092005 120039 T0 I9148700000200002001 B0001000000200
08.09.2005 12:02:38 0001 S24475 U1408092005 140136 T0 I3670300000200002001 B0001000000200
08.09.2005 12:02:59 0001 S24476 U1408092005 150157 T0 I9243700000200002001 B0001000000200
08.09.2005 12:03:31 0002 S24477 U1408092005 130429 T0 I8948000000200002001 B0001000000200
dr_tommi ist offline   Mit Zitat antworten
Alt 09.09.2005, 00:02   #20
dr_tommi
alter Oldie
 
Benutzerbild von dr_tommi
 
Registriert seit: 26.04.2001
Ort: Berlin
Beiträge: 3.252
Standard

Und bei der Gelegenheit gleich noch eine weitere Anwendung der wunderschönen FOR-Schleife.

Diese kann man auch schön zum Auslesen der Registry verwenden:

Auslesen der ProduktID:
Zitat:
:: delims is a TAB followed by a space
for /f "tokens=2* delims= " %%A in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Currentversion" /v ProductId') do set ProductId=%%B
echo ProductId: %ProductId%
Auslesen der Ländereinstellung:
Zitat:
:: delims is a TAB followed by a space
FOR /F "tokens=2* delims= " %%A IN ('REG QUERY "HKCU\Control Panel\International" /v sCountry') DO SET Country=%%B
ECHO Country=%Country%
dr_tommi ist offline   Mit Zitat antworten
Alt 09.09.2005, 08:16   #21
Plymouth
Oldie
 
Registriert seit: 25.04.2001
Beiträge: 603
Standard Danke

@dr_tommi
Vielen Dank, für die Arbeit die du dir gemacht hast. Leider will es mit den original Daten noch nicht laufen, liegt vielleicht wirklich an den Sonderzeichen. Ich schaue mir das mal an, vielleicht bekomme ich das ja hingebogen.

@Ragnar
Vielen Dank für das Angebot, komme event. darauf zurück .


cu

Plymouth
Plymouth ist offline   Mit Zitat antworten
Alt 09.09.2005, 11:22   #22
Ragnar
Oldie
 
Registriert seit: 15.05.2003
Beiträge: 1.490
Standard

nice work tommi!
Plymouth poste doch mal welche Sonderzeichen enthalten sind.
Ragnar ist offline   Mit Zitat antworten
Alt 09.09.2005, 11:33   #23
Plymouth
Oldie
 
Registriert seit: 25.04.2001
Beiträge: 603
Standard

Zitat:
Zitat von Ragnar
nice work tommi!
Plymouth poste doch mal welche Sonderzeichen enthalten sind.
Werde es heute noch mal von Hand erledigen, weil es eilt, aber der Ansatz von tommi, ist wirklich gut. Soviel kann ich schon mal sagen, die Sonderzeichen werden vom FOR-Befehl wie ein Leerzeichen interpretiert. Dadurch habe ich Probleme bei der Wiederherstellung der Zeilen.

Vielen Dank für Eure Unterstützung!!


cu

Plymouth
Plymouth ist offline   Mit Zitat antworten
Alt 11.09.2005, 09:38   #24
darealzeus
Oldie
 
Registriert seit: 09.09.2005
Ort: Duisburg
Beiträge: 188
Standard

Ich möchte in einer Batch Datei nach dem verzeichnis für ein Programm suchen lassen und dann in einer Variable ablegen lassen um es jedertzeit wieder aufrufen zu können: Folgenden Lösungsansatz habe ich bereits aber er ist nicht korrekt:

FOR %%a in (%PATH%) do if exist %%a\XYZ.EXE set XYZPATH=%%a

Wo ist der Fehler? oder komplett falscher Denkansatz?
darealzeus ist offline   Mit Zitat antworten
Alt 11.09.2005, 12:36   #25
SeanMcHack
Oldie
 
Registriert seit: 28.04.2001
Ort: Milch- und Honigland
Beiträge: 318
Standard

guter Thread, danke ragnar
SeanMcHack ist offline   Mit Zitat antworten
Alt 11.09.2005, 13:55   #26
Ragnar
Oldie
 
Registriert seit: 15.05.2003
Beiträge: 1.490
Standard

Zitat:
Zitat von darealzeus
Ich möchte in einer Batch Datei nach dem verzeichnis für ein Programm suchen lassen und dann in einer Variable ablegen lassen um es jedertzeit wieder aufrufen zu können: Folgenden Lösungsansatz habe ich bereits aber er ist nicht korrekt:

FOR %%a in (%PATH%) do if exist %%a\XYZ.EXE set XYZPATH=%%a

Wo ist der Fehler? oder komplett falscher Denkansatz?
ist eigentlich völlig richtig, nur würden leerzeichen atm als trennzeichen verwendet. aber delims geht wohl nur bei /F.
workaround mit /F :
FOR /F "delims=;" %%a in ('echo %PATH%') do if exist %%a\XYZ.EXE set XYZPATH=%%a
aber das mit den trennzeichen funzt einfach net. er ersetzt die ; durch leerzeichen anstatt es zu trennen.
stehe hier grad aufm schlauch
Ragnar ist offline   Mit Zitat antworten
Alt 11.09.2005, 19:18   #27
dr_tommi
alter Oldie
 
Benutzerbild von dr_tommi
 
Registriert seit: 26.04.2001
Ort: Berlin
Beiträge: 3.252
Standard

Was haltet ihr denn von einer solchen Konstruktion:


Code:
for %%I in (iexplore.exe) do echo %%~dp$path:I
Ergebnis ist das Verzeichnis aus dem Suchpfad, in dem sich die Datei iexplore.exe befindet (bei mir (c:\programme\internet explorer)
Klappt auch prima auch mit Leerzeichen in den Verzeichnissen.

Alternativ könnte man auch die PATH-Variable vorher etwas umformen um ein definiertes Trennzeichen zu erhalten (hier #):

Code:
@echo off
set path1=%path%;c:\programme\Internet Explorer
set path1=%path1:;=#%
FOR /F "tokens=1,2,3,4,5,6,7,8,9 delims==#" %%i in ('set path1') do call :for1 "%%i" "%%j" "%%k" "%%l" "%%m" "%%n" "%%o" "%%p" "%%q" 
GOTO for1end 
:for1 

if exist "%~1\iexplore.exe" set XYZPATH=%~1
shift
if %1=="" goto for1end
goto for1

GOTO :EOF 
:for1end 
echo %XYZPATH%
Beide Varianten kommen bei mir zum selben Ergebnis.
dr_tommi ist offline   Mit Zitat antworten
Alt 12.09.2005, 08:57   #28
darealzeus
Oldie
 
Registriert seit: 09.09.2005
Ort: Duisburg
Beiträge: 188
Standard

Zitat:
for %%I in (iexplore.exe) do echo %%~dp$path:I
Ich will ja nix sagen, aber das geht bei so schon mal nicht. Folgende Meldung(en): echo ist ausgeschaltet (OFF). Das wars. Und bei dem anderen Ansatz kommt die Meldung gleich zweimal.

Vielleicht hier noch einmal die Intention die hinter der Batch stecken soll:
Jeder Anwender installiert seine Programme in unterschiedliche Verzeichnisse und Unterverzeichnisse. Jetzt will ich nach dem Verzeichnis eines bestimmten Programmes suchen lassen (z.B. Vlc, NC, explorer, winamp, usw.) um dieses dann von dort aus zu starten.
darealzeus ist offline   Mit Zitat antworten
Alt 12.09.2005, 14:17   #29
dr_tommi
alter Oldie
 
Benutzerbild von dr_tommi
 
Registriert seit: 26.04.2001
Ort: Berlin
Beiträge: 3.252
Standard

Zitat:
Zitat von darealzeus
Zitat:
for %%I in (iexplore.exe) do echo %%~dp$path:I
Ich will ja nix sagen, aber das geht bei so schon mal nicht. Folgende Meldung(en): echo ist ausgeschaltet (OFF). Das wars. Und bei dem anderen Ansatz kommt die Meldung gleich zweimal.
Doch!!!!
Genauso gehts. Dein Ansatz geht übrigens auch. Natürlich nur, wenn die Datei tatsächlich vorhanden ist und das Verzeichnis auch im Suchpfad.
Kommt immer drauf an, was man sucht und wo.

Zitat:
Zitat von darealzeus
Vielleicht hier noch einmal die Intention die hinter der Batch stecken soll:
Jeder Anwender installiert seine Programme in unterschiedliche Verzeichnisse und Unterverzeichnisse. Jetzt will ich nach dem Verzeichnis eines bestimmten Programmes suchen lassen (z.B. Vlc, NC, explorer, winamp, usw.) um dieses dann von dort aus zu starten.
Falsch formulierte Fragen erzeugen sachlich richtige aber unbrauchbare Antworten.
Hättest du die Frage gleich so gestellt, wäre auch eine für dich nützlichere Antwort gekommen.

Das war nur ein Beispiel. Wenn das Verzeichnis des Internetexplorers in der PATH-Variablen gespeichert ist, findet er es auch.
Auch ging es hierbei um den Inhalt der PATH-Variable.
Da der Ansatz sich aber mit der PATH-Variable beschäftigt hatte, kam diese Antwort.


Um ein bestimmtes Programm suchen zu lassen, das nicht im Suchpfad ist, könnte man das Ergebnis von dir /s entsprechend filtern lassen.
dr_tommi ist offline   Mit Zitat antworten
Alt 12.09.2005, 17:44   #30
dr_tommi
alter Oldie
 
Benutzerbild von dr_tommi
 
Registriert seit: 26.04.2001
Ort: Berlin
Beiträge: 3.252
Standard

/Nachtrag:
Um ab Win2k nach einer Datei zu suchen und das Verzeichnis auszugeben, könnte folgende Konstruktion zum Einsatz kommen.
Hier im Beispiel wird nach der Datei iexplore.exe gesucht


Code:
@echo off
cd %programfiles%
for /F "delims=#" %%I in ('dir /b /s iexplore.exe') do set XYZPATH=%%~dI%%~pI

echo Gefunden in %XYZPATH%
%programfiles% ist dabei der Standardordner für Programminstallationen des Systems ( meistens c:\PROGRAMME), man könnte aber auch nach c:\ wechseln zum durchsuchen der ganzen Platte.
"delims=#" ist nur vorhanden, um die Leerzeichen in den Verzeichnisnamen zu übergehen.
%%~dI enthält den Laufwerksbuchstaben der gefundenen Verzeichnisses
%%~pI enthält den Verzeichnisnamen
dr_tommi ist offline   Mit Zitat antworten
Alt 13.09.2005, 05:54   #31
darealzeus
Oldie
 
Registriert seit: 09.09.2005
Ort: Duisburg
Beiträge: 188
Standard

Zitat:
@echo off
cd %programfiles%
for /F "delims=#" %%I in ('dir /b /s iexplore.exe') do set XYZPATH=%%~dI%%~pI

echo Gefunden in %XYZPATH%
funktioniert soweit super, danke. Ich hab das mal soweit umgeschrieben wie ich das gebraucht habe. Beim durchsuchen der Festplatte braucht er nur etwas länger...

Zitat:
@echo off
C:
cd\
for /F "delims=#" %%I in ('dir /b /s iexplore.exe') do %%~dI%%~pIiexplore.exe
Diese Variante funktioniert leider nicht :confused:
Zitat:
@echo off
cd %programfiles%
for /F "delims=#" %%I in ('dir /b /s iexplore.exe') do set XYZPATH=%%~dI%%~pI
call %XYZPATH%iexplore.exe
darealzeus ist offline   Mit Zitat antworten
Alt 13.09.2005, 10:29   #32
dr_tommi
alter Oldie
 
Benutzerbild von dr_tommi
 
Registriert seit: 26.04.2001
Ort: Berlin
Beiträge: 3.252
Standard

Dann versuche es mal so:

Code:
@echo off 
cd %programfiles% 
for /F "delims=#" %%I in ('dir /b /s iexplore.exe') do set XYZPATH=%%~dI%%~pI

call "%XYZPATH%iexplore.exe"
Und hinter %%~dI%%~pI darf kein Leerzeichen sein, sonst stimmt der Pfad nicht.
dr_tommi ist offline   Mit Zitat antworten
Alt 13.09.2005, 12:02   #33
darealzeus
Oldie
 
Registriert seit: 09.09.2005
Ort: Duisburg
Beiträge: 188
Standard

Ne du, das haut auch nicht ganz hin! Als Fehlermeldung spuckt der mir aus: Der Befehl ""C:\Programme\Inernet Explore\ iexplore.exe"" ist endweder falsch geschrieben oder [...] Die doppelten " sind genau so Absicht wie daas Lehrzeichen vor dem der iexplore.exe. Und jetzt sag bitte nicht ich hätte deins falsch abgeschrieben... STRG+C u. STRG+V sind da viel sicherer...
darealzeus ist offline   Mit Zitat antworten
Alt 13.09.2005, 12:06   #34
darealzeus
Oldie
 
Registriert seit: 09.09.2005
Ort: Duisburg
Beiträge: 188
Standard

Ich hab jetzt mal die Variante probiert und sie geht. Leicht umständlich, deswegen wär mir die andere doch lieber...
Zitat:
@echo off
cd %programfiles%
for /F "delims=#" %%I in ('dir /b /s iexplore.exe') do set XYZPATH=%%~dI%%~pI

cd %XYZPATH
call iexplore.exe
darealzeus ist offline   Mit Zitat antworten
Alt 13.09.2005, 12:23   #35
Ragnar
Oldie
 
Registriert seit: 15.05.2003
Beiträge: 1.490
Standard

Zitat:
Zitat von dr_tommi
%%~dI enthält den Laufwerksbuchstaben der gefundenen Verzeichnisses
%%~pI enthält den Verzeichnisnamen
Du kannst das auch kombinieren und %%~dpI verwenden.

Zitat:
Zitat von dr_tommi
call "%XYZPATH%iexplore.exe"
ich hab schon öfter gesehen dass .exe mit call aufgerufen werden hab bisher aber nicht herrausgefunden dass es einen Unterschied macht ob mit oder ohne.
steckt das was dahinter oder ists eher gewohnheit?
Ragnar ist offline   Mit Zitat antworten
Alt 13.09.2005, 14:25   #36
dr_tommi
alter Oldie
 
Benutzerbild von dr_tommi
 
Registriert seit: 26.04.2001
Ort: Berlin
Beiträge: 3.252
Standard

Zitat:
Zitat von darealzeus
Ne du, das haut auch nicht ganz hin! Als Fehlermeldung spuckt der mir aus: Der Befehl ""C:\Programme\Inernet Explore\ iexplore.exe"" ist endweder falsch geschrieben oder [...] Die doppelten " sind genau so Absicht wie daas Lehrzeichen vor dem der iexplore.exe. Und jetzt sag bitte nicht ich hätte deins falsch abgeschrieben... STRG+C u. STRG+V sind da viel sicherer...
Das Leerzeichen vor der der iexplore.exe kommen eindeutig vom Kopieren hier aus dem Board. STRG+C u. STRG+V erzeugen zusätzliche Leerzeichen am Ende jeder Zeile.
dr_tommi ist offline   Mit Zitat antworten
Alt 14.09.2005, 15:06   #37
darealzeus
Oldie
 
Registriert seit: 09.09.2005
Ort: Duisburg
Beiträge: 188
Standard

wie heißt nochmal der befehll womit ich das augenblickliche verzeichnis abspeichern kann?

Ich hab jetzt folgendes Problem. Nachdem das Programm erfolgreich dach meinem Program gesucht hat befindet sich die Batch nicht mehr im Ausführsverzeichnis, wo sich weiter Files befinden die ausgeführt werden sollen. Daher möchte ich gerne das Verzeichnis indem die Batch ausgeführt wird speichern...

z.B.

set %currentdir%=PROGPATH




UND


geht folgende Konstruktion?

set MERKER1=0
if MERKE1=0 echo MERKER1=0 set MERKER1=1
darealzeus ist offline   Mit Zitat antworten
Alt 14.09.2005, 15:17   #38
dr_tommi
alter Oldie
 
Benutzerbild von dr_tommi
 
Registriert seit: 26.04.2001
Ort: Berlin
Beiträge: 3.252
Standard

Zitat:
Zitat von darealzeus
wie heißt nochmal der befehll womit ich das augenblickliche verzeichnis abspeichern kann?
[highlight=red:94f050e4b9]pushd [/highlight:94f050e4b9]zum abspeichern des aktuellen Verzeichnisses
[highlight=red:94f050e4b9]popd[/highlight:94f050e4b9] zum wechseln in das mit pushd gespeicherte Verzeichnis

Zitat:
Zitat von darealzeus
geht folgende Konstruktion?

set MERKER1=0
if MERKE1=0 echo MERKER1=0 set MERKER1=1
Was willst du damit erreichen?

Vergleiche bei IF werden immer mit == gemacht, = steht für Wertzuweisung.
Alles was hinter echo steht wird angezeigt und nicht ausgeführt.
dr_tommi ist offline   Mit Zitat antworten
Alt 14.09.2005, 16:01   #39
Ragnar
Oldie
 
Registriert seit: 15.05.2003
Beiträge: 1.490
Standard

In deinem Fall musst du eigentlich garnicht erst in das Verzeichniss wechseln.

Einfach voll referenziert im dir angeben:
for /F "delims=#" %%I in ('dir /b /s "%programfiles%\iexplore.exe"') do set XYZPATH=%%~dpI

ansich geht das, nur musst du beim vergleich auch den Inhalt der Variable MERKER1 mit 0 vergleichen (%MERKER1%==0) und nicht das Wort MERKER1 mit 0 vergleichen (MERKER1==0
Wenn die Gefahr besteht dass die Variable leer sein könnte mach z.B. {%MERKER1%}=={0}

set MERKER1=0
if %MERKER1%==0 echo MERKER1=0 set MERKER1=1
Ragnar ist offline   Mit Zitat antworten
Alt 15.09.2005, 06:20   #40
darealzeus
Oldie
 
Registriert seit: 09.09.2005
Ort: Duisburg
Beiträge: 188
Standard

Hallo,

hier eine kurze Übersicht über die Batch die ich schreiben will:

__________________PRUEFUNG (exestiert blablabla)_________________
_________JA_______________________________________NEIN
____tu das und das NUR 1x_____________________tu dies und das NUR 1x
____warte 60sec_________________________________warte 60sec
____gehe zu PRUEFUNG________________________gehe zur PRUEFUNG

Damit der Befehl nur 1x ausgeführt wird auch wenn die Bedingung der Prüfung z.B. immer erfüllt wird habe ich einen ´Merker`in die Batch eingebaut. Einen `YESMERKER´ und einen `NOMERKER´ wo die Aktion nur aufgerufen wird wenn dieser =0 ist. Danach wird der `Merker`dann auf =1 gesetzt, so dass die Aktion nur 1x ausgeführt wird. Sollte die PRUEFUNG postiv sein, setzt diese automatisch den `Nomerker`wieder in den Ausgangszustand (=0) und umgekehrt. Das geht bestimmt auch leichter, oder?

Dann folgendes:

Geht folgende konstruktion wie aus C/C++ bekannt oder gibe es etws vergleichbares:
For (n=0;n<10;n++) do {cout>>n}; ???

z.B.
set a=0
GOTO :SCHLEIFE
:SCHLEIFE
IF %a%<=11 echo %a%
a==a+1
if a>=10 GOTO :SCHLEIFE

UND

Mit %1 %2 usw. kann mann ja Parameter übergeben. Kann man dabei irgendwie abfangen, falls dieser Übergabewert mal leer bleibt oder ein falscher übergeben wird?
darealzeus ist offline   Mit Zitat antworten
Alt 15.09.2005, 12:27   #41
Plymouth
Oldie
 
Registriert seit: 25.04.2001
Beiträge: 603
Standard

Zitat:
Zitat von Plymouth
[...]
Ich möchte/muss bei alle Zeilen einer Datei, wo vorne die 0002 steht den zweiten markierten Wert (hier z.B. die 14 und 15 - der Versatz der Zahlen kommt hier durch die Markierung) um 2 subtrahieren. Ist das irgendwie machbar?

Vielen Dank!!


cu

Plymouth
Hallo,

ich möchte mich nur noch mal für eure Hilfe bedanken. Besonders bei dr_tommi für produktive Hilfe. Ich habe seine Batch nur noch etwas anpassen müssen. Hier nur zur Vollständigkeit die überarbeitet Batchdatei:

Code:
@echo off

FOR /F "tokens=1,2,3,4,5,6,7,8* delims= " %%i in (BUFBOOK-Date.LOG) do call :for1 %%i %%j %%k %%l %%m %%n %%o %%p
GOTO for1end
:for1

if %~3 == 0002 call :schleife1 %1 %2 %3 %4 %5 %6 %7 %8

::Ausgabe der Datensätze von Terminal 1 ohne Änderung
if not %~3 == 0002 echo %1 %2 %3 %4%5%6%7%8>> bk0101.tp3

goto for1end

:schleife1
:: Speichern des gewünschten Bereichs
set z=%5
:: Die ersten Zeichen speichern
set za=%z:~0,11%
:: Die hinteren Zeichen speichern
set ze=%z:~13,4%
:: Die zu ändernen Stunden speichern...
set /a zz=%z:~11,2%
:: und 2 Std. abziehen
set /a zz=zz-2
::Ausgabe der bearbeiteten Datensätze von Terminal 2
echo %1 %2 %3 %4%za%%zz%%ze%%6%7%8>> bk0102.tp3


GOTO :EOF
:for1end

cu

Plymouth
Plymouth ist offline   Mit Zitat antworten
Alt 15.09.2005, 15:24   #42
dr_tommi
alter Oldie
 
Benutzerbild von dr_tommi
 
Registriert seit: 26.04.2001
Ort: Berlin
Beiträge: 3.252
Standard

Zitat:
Zitat von darealzeus
Hallo,

hier eine kurze Übersicht über die Batch die ich schreiben will:

__________________PRUEFUNG (exestiert blablabla)_________________
_________JA_______________________________________NEIN
____tu das und das NUR 1x_____________________tu dies und das NUR 1x
____warte 60sec_________________________________warte 60sec
____gehe zu PRUEFUNG________________________gehe zur PRUEFUNG

Damit der Befehl nur 1x ausgeführt wird auch wenn die Bedingung der Prüfung z.B. immer erfüllt wird habe ich einen ´Merker`in die Batch eingebaut. Einen `YESMERKER´ und einen `NOMERKER´ wo die Aktion nur aufgerufen wird wenn dieser =0 ist. Danach wird der `Merker`dann auf =1 gesetzt, so dass die Aktion nur 1x ausgeführt wird. Sollte die PRUEFUNG postiv sein, setzt diese automatisch den `Nomerker`wieder in den Ausgangszustand (=0) und umgekehrt. Das geht bestimmt auch leichter, oder?
Da verstehe ich den Sinn dieser Abfrage nicht. Da soll eine Batchdatei immer im Hintergrund für 2 Sekunden was tun und dann 60 Sekunden warten und dann den Spaß von vorne? Gibt es da nicht was eleganteres. Geplante Tasks oder so.
Vielleicht solltest du etwas konkreter werden, was du mit der Batch bezwecken willst.


Zitat:
Zitat von darealzeus
Dann folgendes:

Geht folgende konstruktion wie aus C/C++ bekannt oder gibe es etws vergleichbares:
For (n=0;n<10;n++) do {cout>>n}; ???

z.B.
set a=0
GOTO :SCHLEIFE
:SCHLEIFE
IF %a%<=11 echo %a%
a==a+1
if a>=10 GOTO :SCHLEIFE
So gehts auch

Code:
FOR /L %Variable IN (Start,Schritt,Ende) DO Befehl [Parameter]

    Der Satz ist eine Folge von Zahlen von Start bis Ende und der
    angegebenen Schrittweite. So erzeugt (1,1,5) die Folge 1 2 3 4 5 und
    (5,-1,1) erzeugt die Folge (5 4 3 2 1).

Zitat:
Zitat von darealzeus
UND

Mit %1 %2 usw. kann mann ja Parameter übergeben. Kann man dabei irgendwie abfangen, falls dieser Übergabewert mal leer bleibt oder ein falscher übergeben wird?
Man kann testen, ob der Übergabewert leer ist. Oder auch ob der Wert größer oder kleiner einer bestimmten Grenze ist
z.B.
Code:
if "%1"=="" goto error
dr_tommi ist offline   Mit Zitat antworten
Alt 15.09.2005, 16:44   #43
darealzeus
Oldie
 
Registriert seit: 09.09.2005
Ort: Duisburg
Beiträge: 188
Standard

Okay, also: Ich habe Probleme mit meinem WLAN. Die Funkverbindung zum Router bricht einfach ab ohne sich wieder neu aufzubauen. Da das leider keine Einstellungssache ist habe ich mir folgendes überlegt:

Zitat:
ping IP-Adresse Router -n 1 >NUL
IF ERRORLEVEL 0 IF NOT ERRORLEVEL 1 GOTO :CON
IF ERRORLEVEL 1 GOTO :NOCON
Damit soll regelmässig (1x/min) überprüft werden, ob eine Verbindung zum Router besteht. Bei jedem wechsel zwischen Verbindung/keine Verbindung einen Eintrag mit Datum und Uhrzeit in eine log.txt zum spätere nachvollziehen. Bei NOCON kommt allerdings noch folgendes hinzu: 2 Modis zwischen denen man wechseln kann [shadow=red:0d7044b9d5]mit dem choice gibt es hier noch Probleme, läuft daher momentan mit Übergabeparametern[/shadow:0d7044b9d5]
ModiA (Tagbetrieb): Hier soll parallel zum Hauptprogramm augenblicklich der Winamp startet um akkustisch bemerkbar zu machen das die Verbindung abgerisssen ist
ModiB (Nachbetrieb): Hier soll parallel zum Hauptprogramm ein Timer gestartet werde. Sollte sich die Verbindung nicht innerhalb von 5min wiederherstellen sollen alle Programme beenden und der Computer heruntergefahren werden.

Folgendes ist immer zu beachten:
Läuft der Winamp wegen dem NOCON und kommt doch wieder eine Verbindung zu stande soll der Winamp wieder enden
Der Winamp soll nicht jede Minute neustarten sondern die Playlist soll schon durchlaufen
Die Pruefung (der ping) sorgt trotz bestehender Internetverbindung häufig zu einem errorlevel 1. Deswegen soll die Prüfung im NOCON-Fall 3x mal wiederholt werden und sollte sie jedes mal negativ sein soll erst der entsprechende DAY/NIGHT Mode gestartet werden.

So, ich hoffe du steigst da durch, sonst bitte einfach fragen!

Momentan steh ich hier:

Ich starte z.B. übder die Batch den Winamp. das Problem ist aber das die Batch nicht weiter druchläuft solange der Winamp nicht beendet ist. Dazu Frage a) kann man das umgehen b) gibt es einen Befehl einzelne Programme, z.B. Winam gezielt zu beenden?
darealzeus ist offline   Mit Zitat antworten
Alt 24.09.2005, 21:44   #44
schwaller
Oldie
 
Registriert seit: 01.06.2001
Beiträge: 340
Standard

hallo - kann mir mal wer helfen?

gegeben:
eine ascii datei mit einer länge von ca.: 5-10k
in einer bestimmten zeile kommt ein schluesseltext nennen wir ihn einfach "keytext" vor.
nun soll die datei ab der zeile, wo der keytext vorkommt bis zum ende kopiert werden.

kann mir da einer von euch was basteln?

meine erste idee war, mittels "find /n "keytext" datei.asc die zeilennummer herauszufinden, in der der keytext steht.

dann zeile für zeile bis zum gefundenen wert nach nul und danach dann in die ausgabedatei zu kopieren.

nur irgendwie hapert es da bei mir mit der umsetzung

ps.: sollte das mit einer reienn batch nicht klappen, dann hilft mir auch ein kleines perl-script
schwaller ist offline   Mit Zitat antworten
Alt 16.10.2005, 14:55   #45
tangente
Oldie
 
Benutzerbild von tangente
 
Registriert seit: 22.04.2001
Ort: t(x)
Beiträge: 1.065
Standard

Ist es moelich, das Vorhandensein einer Partition abzufragen und bei - da oder nicht da - eine Aktion auszufuehren ?

Also beispielsweise
if exist \Device\Harddisk4\Partition1 goto Blabla

Es geht nicht darum ein Laufwerk abzufragen, sondern eine ungemountete Partition.
tangente ist offline   Mit Zitat antworten
Alt 16.10.2005, 17:47   #46
Ragnar
Oldie
 
Registriert seit: 15.05.2003
Beiträge: 1.490
Standard

probier mal diskpart ausm reskit (oder support tools)
damit hab ich schon sowas gescriptet
Ragnar ist offline   Mit Zitat antworten
Alt 16.10.2005, 19:44   #47
tangente
Oldie
 
Benutzerbild von tangente
 
Registriert seit: 22.04.2001
Ort: t(x)
Beiträge: 1.065
Standard

Danke fuer die Antwort Rangar !

Ich habe mir diskpart mal angesehen - kommt aber irgendwie nicht in Frage, mal davon abgesehen das ich nicht verstehe wie man das Volume per Batch abfragt. :confused:

Das es - glaube ich - nicht in Frage kommt liegt daran, das es die Partition nicht anzeigt. (list volume)

Es zeigt nur NTFS und FAT-Partitionen an. Meine Partition ist aber eine mit TrueCrypt gecryptete Partition. Die wird nicht angezeigt. Auch nicht wenn sie gemountet ist.
tangente ist offline   Mit Zitat antworten
Alt 16.10.2005, 23:56   #48
Ragnar
Oldie
 
Registriert seit: 15.05.2003
Beiträge: 1.490
Standard

jep das scheint nur mit "echten" Disks zu gehen. sehe mein bestcrypt LW auch nicht.

vielleicht kannst es ja anhand eines regkeys erkennen. probier mal Regmon während dem Verbinden mitlaufen zu lassen.
Ragnar ist offline   Mit Zitat antworten
Alt 17.10.2005, 10:34   #49
tangente
Oldie
 
Benutzerbild von tangente
 
Registriert seit: 22.04.2001
Ort: t(x)
Beiträge: 1.065
Standard

Ich habe eine Loesung gefunden:

Ich lasse TrueCrypt mit einem falschem Passwort versuchen die Platte zu mounten.

TrueCrypt liefert dann einen Errorlevel.

Wenn der 1 ist soll die Batch beendet werden sonst soll sie weiterlaufen.

Zitat:
LW:\Pfad\TrueCrypt.exe /v \Device\Harddisk4\Partition1 /lu /a /cn /hn /q /p xxxx
if errorlevel=1 goto EOF
if not exist U:\NUL LW:\Pfad\TC\TrueCrypt.exe /v \Device\Harddisk4\Partition1 /lu /a /cn /hn /q


...
...
:EOF
tangente ist offline   Mit Zitat antworten
Alt 17.10.2005, 10:42   #50
Ragnar
Oldie
 
Registriert seit: 15.05.2003
Beiträge: 1.490
Standard

Wenn der errorlevel 1 ist weisst du das sie schon verbunden ist?
Also gibts nen Unterschied zwischen "flasches PW noch nicht gemountet" und "falsches PW bereits gemountet"?

Das ist dann natürlich ne schöne Lösung

achja schwaller sorry du scheinst hier völlig übersehen worden zu sein. besteht das problem noch?
Ragnar ist offline   Mit Zitat antworten
Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:47 Uhr.


vBulletin® Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.