|
|
#1 | |
|
Oldie
Registriert seit: 15.05.2003
Beiträge: 1.490
|
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 NACHTEIL: (danke Flipper) Zitat:
Echo ohne Zeilenumbruch: Code:
echo/|set /p=Dein Text hier 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 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
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. |
|
|
|
|
|
|
#2 |
|
Oldie
Registriert seit: 07.06.2002
Beiträge: 821
|
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 ? |
|
|
|
|
|
#3 |
|
Oldie
Registriert seit: 15.05.2003
Beiträge: 1.490
|
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 |
|
|
|
|
|
#4 |
|
Oldie
Registriert seit: 15.05.2003
Beiträge: 1.490
|
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 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. |
|
|
|
|
|
#5 |
|
Oldie
Registriert seit: 07.06.2002
Beiträge: 821
|
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 ? |
|
|
|
|
|
#6 |
|
Oldie
Registriert seit: 15.05.2003
Beiträge: 1.490
|
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= |
|
|
|
|
|
#7 | |
|
Oldie
Registriert seit: 07.06.2002
Beiträge: 821
|
@Ragnar
Zitat:
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 ? |
|
|
|
|
|
|
#8 |
|
Oldie
Registriert seit: 15.05.2003
Beiträge: 1.490
|
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
|
|
|
|
|
|
#9 |
|
Oldie
Registriert seit: 07.06.2002
Beiträge: 821
|
@Rangar
Code:
FOR /F "delims=;" %%f in ('dir /B /A:D "%BaseDir%"') do robocopy "%BaseDir%\%%f" "%BaseDir%" /MOVE
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 ? |
|
|
|
|
|
#10 |
|
Team (Userverw.)
Registriert seit: 21.04.2001
Beiträge: 17.748
|
werde diesen Thread später ins TopTopic verschieben, damit er nicht untergeht
|
|
|
|
|
|
#11 |
|
Oldie
Registriert seit: 15.05.2003
Beiträge: 1.490
|
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 |
|
|
|
|
|
#12 |
|
Oldie
Registriert seit: 24.04.2001
Beiträge: 5.741
|
Schoener Thread.
Kann man per batch files splitten? Zusammenfuegen geht ja mit copy /b. gruss mig |
|
|
|
|
|
#13 |
|
Oldie
Registriert seit: 15.05.2003
Beiträge: 1.490
|
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.... |
|
|
|
|
|
#14 |
|
Oldie
Registriert seit: 02.06.2002
Beiträge: 1.041
|
Hi,
for-Schleifen nach dem Prinzip Code:
FOR %%f IN (*.*) do call :for1 "%%f" GOTO for1ende :for1 echo "%~1" GOTO :EOF :for1ende Code:
Datei 1 & 2.txt Datei 1^2.txt Datei 100%.txt Ist mit Dateinamen mit Sonderzeichen zu rechnen, sollte man die traditionelle for-Schleife favorisieren: Code:
FOR %%f IN (*.*) do ( echo %%f ) 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. MfG Flipper |
|
|
|
|
|
#15 |
|
Oldie
Registriert seit: 15.05.2003
Beiträge: 1.490
|
danke Flipper
hab deine Infos oben mit aufgenommen. |
|
|
|
|
|
#16 |
|
Team (Userverw.)
Registriert seit: 21.04.2001
Beiträge: 17.748
|
werde jetzt verschieben,
|
|
|
|
|
|
#17 | |
|
Oldie
Registriert seit: 25.04.2001
Beiträge: 603
|
Hallo,
ich habe da ein Problem, vielleicht könnte man das auch mit einer Batch lösen. Zitat:
Vielen Dank!! cu Plymouth |
|
|
|
|
|
|
#18 |
|
Oldie
Registriert seit: 15.05.2003
Beiträge: 1.490
|
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 |
|
|
|
|
|
#19 | |||
|
alter Oldie
Registriert seit: 26.04.2001
Ort: Berlin
Beiträge: 3.252
|
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:
so wird aus: Zitat:
Zitat:
|
|||
|
|
|
|
|
#20 | ||
|
alter Oldie
Registriert seit: 26.04.2001
Ort: Berlin
Beiträge: 3.252
|
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:
Zitat:
|
||
|
|
|
|
|
#21 |
|
Oldie
Registriert seit: 25.04.2001
Beiträge: 603
|
@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 |
|
|
|
|
|
#22 |
|
Oldie
Registriert seit: 15.05.2003
Beiträge: 1.490
|
nice work tommi!
Plymouth poste doch mal welche Sonderzeichen enthalten sind. |
|
|
|
|
|
#23 | |
|
Oldie
Registriert seit: 25.04.2001
Beiträge: 603
|
Zitat:
Vielen Dank für Eure Unterstützung!! cu Plymouth |
|
|
|
|
|
|
#24 |
|
Oldie
Registriert seit: 09.09.2005
Ort: Duisburg
Beiträge: 188
|
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? |
|
|
|
|
|
#25 |
|
Oldie
Registriert seit: 28.04.2001
Ort: Milch- und Honigland
Beiträge: 318
|
guter Thread, danke ragnar
|
|
|
|
|
|
#26 | |
|
Oldie
Registriert seit: 15.05.2003
Beiträge: 1.490
|
Zitat:
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 |
|
|
|
|
|
|
#27 |
|
alter Oldie
Registriert seit: 26.04.2001
Ort: Berlin
Beiträge: 3.252
|
Was haltet ihr denn von einer solchen Konstruktion:
Code:
for %%I in (iexplore.exe) do echo %%~dp$path:I 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%
|
|
|
|
|
|
#28 | |
|
Oldie
Registriert seit: 09.09.2005
Ort: Duisburg
Beiträge: 188
|
Zitat:
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. |
|
|
|
|
|
|
#29 | |||
|
alter Oldie
Registriert seit: 26.04.2001
Ort: Berlin
Beiträge: 3.252
|
Zitat:
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:
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. |
|||
|
|
|
|
|
#30 |
|
alter Oldie
Registriert seit: 26.04.2001
Ort: Berlin
Beiträge: 3.252
|
/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%
"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 |
|
|
|
|
|
#31 | |||
|
Oldie
Registriert seit: 09.09.2005
Ort: Duisburg
Beiträge: 188
|
Zitat:
Zitat:
Zitat:
|
|||
|
|
|
|
|
#32 |
|
alter Oldie
Registriert seit: 26.04.2001
Ort: Berlin
Beiträge: 3.252
|
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"
|
|
|
|
|
|
#33 |
|
Oldie
Registriert seit: 09.09.2005
Ort: Duisburg
Beiträge: 188
|
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...
|
|
|
|
|
|
#34 | |
|
Oldie
Registriert seit: 09.09.2005
Ort: Duisburg
Beiträge: 188
|
Ich hab jetzt mal die Variante probiert und sie geht. Leicht umständlich, deswegen wär mir die andere doch lieber...
Zitat:
|
|
|
|
|
|
|
#35 | ||
|
Oldie
Registriert seit: 15.05.2003
Beiträge: 1.490
|
Zitat:
Zitat:
steckt das was dahinter oder ists eher gewohnheit? |
||
|
|
|
|
|
#36 | |
|
alter Oldie
Registriert seit: 26.04.2001
Ort: Berlin
Beiträge: 3.252
|
Zitat:
|
|
|
|
|
|
|
#37 |
|
Oldie
Registriert seit: 09.09.2005
Ort: Duisburg
Beiträge: 188
|
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 |
|
|
|
|
|
#38 | ||
|
alter Oldie
Registriert seit: 26.04.2001
Ort: Berlin
Beiträge: 3.252
|
Zitat:
[highlight=red:94f050e4b9]popd[/highlight:94f050e4b9] zum wechseln in das mit pushd gespeicherte Verzeichnis Zitat:
Vergleiche bei IF werden immer mit == gemacht, = steht für Wertzuweisung. Alles was hinter echo steht wird angezeigt und nicht ausgeführt. |
||
|
|
|
|
|
#39 |
|
Oldie
Registriert seit: 15.05.2003
Beiträge: 1.490
|
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 |
|
|
|
|
|
#40 |
|
Oldie
Registriert seit: 09.09.2005
Ort: Duisburg
Beiträge: 188
|
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? |
|
|
|
|
|
#41 | |
|
Oldie
Registriert seit: 25.04.2001
Beiträge: 603
|
Zitat:
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 |
|
|
|
|
|
|
#42 | |||
|
alter Oldie
Registriert seit: 26.04.2001
Ort: Berlin
Beiträge: 3.252
|
Zitat:
Vielleicht solltest du etwas konkreter werden, was du mit der Batch bezwecken willst. Zitat:
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:
z.B. Code:
if "%1"=="" goto error |
|||
|
|
|
|
|
#43 | |
|
Oldie
Registriert seit: 09.09.2005
Ort: Duisburg
Beiträge: 188
|
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:
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? |
|
|
|
|
|
|
#44 |
|
Oldie
Registriert seit: 01.06.2001
Beiträge: 340
|
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 |
|
|
|
|
|
#45 |
|
Oldie
Registriert seit: 22.04.2001
Ort: t(x)
Beiträge: 1.065
|
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. |
|
|
|
|
|
#46 |
|
Oldie
Registriert seit: 15.05.2003
Beiträge: 1.490
|
probier mal diskpart ausm reskit (oder support tools)
damit hab ich schon sowas gescriptet |
|
|
|
|
|
#47 |
|
Oldie
Registriert seit: 22.04.2001
Ort: t(x)
Beiträge: 1.065
|
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. |
|
|
|
|
|
#48 |
|
Oldie
Registriert seit: 15.05.2003
Beiträge: 1.490
|
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. |
|
|
|
|
|
#49 | |
|
Oldie
Registriert seit: 22.04.2001
Ort: t(x)
Beiträge: 1.065
|
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:
|
|
|
|
|
|
|
#50 |
|
Oldie
Registriert seit: 15.05.2003
Beiträge: 1.490
|
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? |
|
|
|
|
| Themen-Optionen | Thema durchsuchen |
| Ansicht | |
|
|