PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : WinXP - Programme per Batch gleichzeitig ausführen?


Peterxy
2016-07-05, 17:02:37
Habe zwei Batch Dateien, die beim runter wie rauffahren über die Gruppenrichtlinen ausgeführt wird und Teile des Ramdrives spiegeln, die eine sieht so aus :

mkdir R:\XTEMP
C:\Programme\7-Zip\7z.exe x g:\XP-TEMP\cache.7z -oR:\ -wr:\ -mmt6
xcopy E:\XP-TEMP R:\XTEMP /H /Y

Dummerweise arbeitet Windows die Programme (7zip+xcopy) aber der Reihe nach ab. Ich möchte aber das die beiden Kopiervorgänge gleichzeitig gestartet werden. Mehrere Programme gleichzeitig starten geht normallerweise ja mittels Batch so:
start "" "Program2xy.xe"
start "" "Program1xy.xe"

Problem:
Dieser Start Befehl funktioniert zwar per Batch im Windows selbst, aber irgendwie nicht wenn die Batch über die Gruppenrichtlinien beim rauf/runterfahren eingebunden werden. :confused:

Fragen:
1.) wie bewege ich Windows dazu 2 Programme gleichzeitig mittels Batch beim rauf/runterfahren auszuführen?
2.) 6Treads habe ich in die 7zip Commandline eingetragen, aber wie kriegt man 7zip dazu mehr als 1-2Kerne zu nutzen? Falls 7Zip das nicht kann, welcher (Freeare) Zipper kann 6Kerne auslasten?

Lokadamus
2016-07-05, 18:50:04
1.) Hätte ich auch so gemacht. Ist UAC aktiv? Dadurch kann es sein, dass durch den Anmeldevorgang nicht mehrere Batches parallel ausgeführt werden dürfen.
2.) Der Parameter mt sollte das Problem lösen.

Korfox
2016-07-05, 19:35:46
Wo liegt die Batch?
Hast du Leerzeichen im Dateinamen?
Startest du das Skript per UNC, so es auf einem Netzlaufwerk liegt?
Führst du Batch-Files sichtbar aus?
Funktionieren andere Batch-Files?

Tech_FREAK_2000|GS
2016-07-05, 20:16:12
[...]
Fragen:
[...]
2.) 6Treads habe ich in die 7zip Commandline eingetragen, aber wie kriegt man 7zip dazu mehr als 1-2Kerne zu nutzen? Falls 7Zip das nicht kann, welcher (Freeare) Zipper kann 6Kerne auslasten?

7Zip nutzt automatisch Multithreading, sofern es der Kompressionsalgorhytmus hergibt.
oder falls du es erzwingen möchtest (-mmt bestimmt die Anzahl der Threads, -mmt14 für 14 Threads):
7z a -t7z -mx=9 -m0=LZMA2 -mmt14 "Target.7z" "Source\*.*


bei .7Z Containern kommt präferiert LZMA/(2) zum Einsatz.
LZMA soll nicht umbedingt Multithreading tauglich sein, LZMA2 ist da etwas besser.

Quelle: 7Zip chm Hilfedatei 7-Zip 15.05 beta.

[...]
LZMA2 uses: 1 thread for each chunk in x1 and x3 modes; and 2 threads for each chunk in x5, x7 and x9 modes. If LZMA2 is set to use only such number of threads required for one chunk, it doesn't split stream to chunks. So you can get different compression ratio for different number of threads. You can get the best compression ratio, when you use 1 or 2 threads.
[...]

Peterxy
2016-07-05, 20:28:35
hi,

2.) Der Parameter mt sollte das Problem lösen.
Wie genau müßte der aussehen für 6Kerne?

Ist UAC aktiv?
Nicht das ich wüßte, imo gibts das auch gar nicht im XP (sondern ab Vista, win7 oder so?)

Wo liegt die Batch?
Hast du Leerzeichen im Dateinamen?
die batch liegt auf c:\ und ist wie gesagt über die Gruppenrichtlinien eingebunden. D.h.: --->gpedit.msc -->Computerkonfiguration-->WindowsEinstellungen-->Scripts

Die Batch funktioniert + kopiert alles einwandfrei beim rauf/runterfahren, sofern ich den start Befehl weglasse (d.h. wie eingangs gepostet die kleine Beispielbatch).
Setze ich hingegen den start Befehl mit in eine Batch = passiert nichts.
Ob mit oder ohne Namen zwischen "" macht keinen Unterschied, denn an einem Syntaxfehler liegt das nicht weil wenn Windows komplett geladen ist und ich dann die Batch manuell aufrufe = dann gehen auch Batches mit Start Befehl.

Peterxy
2016-07-05, 20:47:00
7Zip nutzt automatisch Multithreading, sofern es der Kompressionsalgorhytmus hergibt.
oder falls du es erzwingen möchtest (-mmt bestimmt die Anzahl der Threads, -mmt14 für 14 Threads):
7z a -t7z -mx=9 -m0=LZMA2 -mmt14 "Target.7z" "Source\*.*

bei .7Z Containern kommt präferiert LZMA/(2) zum Einsatz. LZMA soll nicht umbedingt Multithreading tauglich sein, LZMA2 ist da etwas besser.

Also müßte ich -m0=LZMA2 hinzufügen?
Um das mal kurz zu sondieren:
Auf dem Ramdrive liegen viele kleine Dateien und ein normalles umkopieren per xcopy auf HDD würde endlos dauern. Daher pack ich mit 7z alle Dateien (noch im Ramdrive selbst) in 1 (unkompremierte) Zip Datei und die 1zip Datei wird dann anschließend auf die HDD kopiert. Grundsätzlich ist das so eingestellt, das 7Z dabei einen Abgleich macht welche Dateien auf der HDD im Zip schon vorliegen und das zip ggf. nur aktualisiert (was natürlich schneller geht als hunderte Einzeldateien komlett jedesmal verschieben)

Bei dem ganzen wird seitens 7z allerdings nur 1Kern zu 100% ausgelastet (werde das von dir erwähnte aber nachher gleich mal ausprobieren)

Falls sich weiterhin nichts an der Kern Nutzung ändern sollte, gibt es eine andere Alternative als 7zip, die zügig Datein in 1 unkomprimiertes Zip schieben und den Inhalt abgleichen kann?

Pinoccio
2016-07-05, 21:38:31
Auf dem Ramdrive liegen viele kleine Dateien und ein normalles umkopieren per xcopy auf HDD würde endlos dauern. Daher pack ich mit 7z alle Dateien (noch im Ramdrive selbst) in 1 (unkompremierte) Zip Datei und die 1zip Datei wird dann anschließend auf die HDD kopiert. Grundsätzlich ist das so eingestellt, das 7Z dabei einen Abgleich macht welche Dateien auf der HDD im Zip schon vorliegen und das zip ggf. nur aktualisiert (was natürlich schneller geht als hunderte Einzeldateien komlett jedesmal verschieben)

Bei dem ganzen wird seitens 7z allerdings nur 1Kern zu 100% ausgelastet (werde das von dir erwähnte aber nachher gleich mal ausprobieren)Wenn du gar nicht komprimierst, wie soll dann mehr als 1 Kern sinnvoll durch die Kompression ausgelastet werden?

mfg

=Floi=
2016-07-05, 22:51:19
was machst du eigentlich mit einem 6 kerner und winXP?
ich dachte das unterstützt nur zwei kerne?!

Peterxy
2016-07-05, 22:55:17
Wenn du gar nicht komprimierst, wie soll dann mehr als 1 Kern sinnvoll durch die Kompression ausgelastet werden?
Wieso sollte dafür nicht mehr als 1Kern genutzt werden? Die Auslastung des 1Kern beträgt immerhin 100%, was mir wiederum sagt das das überhaupt nicht effektiv sein kann!
Denn kopiert man diegleichen Dateien innerhalb des Ramdrives hin/her ist das ne Sache von 1-2Sekunden. 7zip hingegen braucht (nur um alles in ein Zip zu schieben) selbst innerhalb eines Ramdrives echt lang und die Frage ist berechtigt, wieso 7z dafür solang braucht. (an mangelnder Übertragunsrate liegt das an einem Ramdrive bekanntlich nicht)
Und das ich gar nicht komprimiere hat ja den logischen Hintergrund, weil 7z bei mir ebend nur 1-2Kerne nutzt und mit den paar Kernen komprimieren dauert das ja endlos.


ich dachte das unterstützt nur zwei kerne?!
Nun ja, manche sollen angeblich gar denken, die Welt wäre eine Scheibe. :smile:

lumines
2016-07-05, 23:15:36
Wieso sollte dafür nicht mehr als 1Kern genutzt werden? Die Auslastung des 1Kern beträgt immerhin 100%, was mir wiederum sagt das das überhaupt nicht effektiv sein kann!

Das ist ja keine Frage der Effizienz, sondern ob man die Aufgabe überhaupt parallelisieren kann oder nicht. So genau kenne ich mich damit nicht aus, aber es kann gut sein, dass reines Packen ohne Kompression nicht parallel ablaufen kann. Um die anderen Kerne auslasten zu können, muss es ja erst einmal etwas geben, was man arbeitstechnisch splitten kann.

was machst du eigentlich mit einem 6 kerner und winXP?
ich dachte das unterstützt nur zwei kerne?!

Unterstützen wird es das schon, aber der Scheduler wird im Vergleich mit modernen Betriebssystemen hinterherhinken. Optimal ist das natürlich nicht. Auch die ganzen Libraries werden wahrscheinlich gegen uralte CPU-Architekturen kompiliert sein und keinen Gebrauch von den Instruktionen neuerer CPUs machen. Man lässt damit wahrscheinlich auch so effektiv Leistung auf der Strecke.

EDIT: Unterstützt in der Home-Variante nur zwei CPUs, aber beliebig viele Kerne: http://www.heise.de/ct/hotline/Wie-viele-CPU-Kerne-nutzt-Windows-322384.html

Peterxy
2016-07-05, 23:59:35
Das hat nix mit dem OS zu tuen, denn unter Win7 64bit ist das mit dem spiegeln eines Ramdrive gar noch langsamer.
Tut aber nix zur Sache und wenn der Zipper den Ablauf nicht paralellisieren kann - dann sind wir eben wieder bei der ersten Frage:
Wie bewege ich Windows dazu mehrere Programme in einer Batch gleichzeitig zu starten?

Damit ließe sich das Paralellisierungsproblem schließlich umgehen, indem man dann eben einfach mehrfach 7z startet und statt alles in 1 Zip halt das ganze gleichzeitig auf paar zips verteilt. ;)


EDIT: Wenn ich statt Anzahl der Treads -mmt=on setze, scheint das ganze nun auf alle Kerne verteilt zu werden.
Damit ist das mit 7zip schonmal gelöst, bleibt trotzdem noch die Frage bzgl. des "start" Befehls.

DerRob
2016-07-06, 14:29:26
Damit ist das mit 7zip schonmal gelöst, bleibt trotzdem noch die Frage bzgl. des "start" Befehls.
Batch-Datei und "gleichzeitig", das schließt sich eigentlich gegenseitig aus. Eine Möglichkeit hast du ja mit dem "start"-Befehl schon probiert. Warum das nicht funktioniert, hängt möglicherweise hiermit zusammen:
Wird eine grafische 32-Bit-Anwendung aufgerufen, wartet CMD.EXE nicht auf das Beenden dieser Anwendung, sondern kehrt sofort zur Eingabeauforderung zurück. Das gilt NICHT, wenn diese Anwendung aus einem Befehlsskript heraus aufgerufen wird.
Mir fällt sonst noch ein, statt der Batch-Datei ein VBScript zu verwenden. Das nutze ich z.B. im Autostart, um Netzlaufwerke erst verzögert zu verbinden.

In deinem Fall würde mir z.B. sowas einfallen:
Option Explicit
Dim objShell
On Error resume next
Set objShell=Wscript.CreateObject("Wscript.Shell")

objshell.Run "%COMSPEC% /c ""mkdir R:\XTEMP""", 0
WScript.Sleep 100
objshell.Run "C:\Programme\7-Zip\7z.exe x g:\XP-TEMP\cache.7z -oR:\ -wr:\ -mmt=on", 0
WScript.Sleep 100
objshell.Run "%COMSPEC% /c ""xcopy E:\XP-TEMP R:\XTEMP /H /Y""", 0

Kopieren und mit einem Texteditor als xyz.vbs abspeichern.

http://ss64.com/vb/run.html

Peterxy
2016-07-06, 21:53:54
hi,
danke für den Tip mit dem vbscript, hatte mich mit sowas noch nicht beschäftigt und werds mal damit versuchen. Nur kurz eine Frage dazu, ich vermute mal WScript.Sleep 100 ist wahrscheinlich ein 100Ms Delay oder ähnliches - wofür bzw. welchen Zweck erfüllt das Delay im Script?

Lokadamus
2016-07-06, 22:04:35
Setze ich hingegen den start Befehl mit in eine Batch = passiert nichts.
Ob mit oder ohne Namen zwischen "" macht keinen Unterschied, denn an einem Syntaxfehler liegt das nicht weil wenn Windows komplett geladen ist und ich dann die Batch manuell aufrufe = dann gehen auch Batches mit Start Befehl.Hast du mal geguckt, was passiert, wenn du hinter den Befehlen eine Pause machst und guckst, ob eine Fehlermeldung angezeigt wird?

Es gibt hier und da ein paar Sachen zu berücksichtigen, wenn man Skripte per GPO oder Taskscheduler ausführen lässt.
So lange du sehen kannst, was da passiert, ist der Befehl "pause" ganz praktisch.

DerRob
2016-07-06, 22:05:10
Kannst es eigentlich auch weglassen. Ich habs bloß in meiner Vorlage drin, damit nicht alles absolut gleichzeitig startet und man (z.B. im Autostart) auch eben schnell mal die Zeiten anpassen kann, wenn man ein paar Programme verzögert starten möchte.

Aber evtl. solltest du dem mkdir schon ein paar ms geben, bevor du da was in den Ordner reinkopieren willst. Keine Ahnung, was passiert, wenn du schon was in den Ordner kopierst, während er gerade erst erstellt wird... ;)

Peterxy
2016-07-06, 22:26:09
@Lokadamus
Der Pause Befehl hilft imo nicht weiter, da die Batch ja wie gesagt über die Gruppenrichtlinie ausgeführt wird und man sieht da kein DOS Fenster, sondern nur den normallen Windows rauf/runterfahren Screen wo dann (in letzteren Fall) halt nur steht "Scripte werden ausgeführt"


@Der Rob
Statt des xcopy hab ich mich adhoc für fastcopy entschieden, da das doch schneller kopiert wie ich eben feststellen mußte.
In der Batch sieht der Befehl so aus:
"C:\A-REC\FastCopy211\FastCopy.exe" /cmd=sync /bufsize=32 /speed=8 /error_stop=FALSE /force_close /acl=FALSE "E:\XP-TEMP" /to="R:\X-Photo"

Im vbscript hatte ich nun objshell.Run davorgesetzt, doch irgendwie will das Fastcopy nicht so recht, ich vermute es liegt an den " Gänsefüßchen" die ich irgendwie wohl im vbscript falsch setze, oder? Kannst du mir daher vielleicht noch sagen, wie das mit dem Fastcopy fürs vbscript aussehen müßte? :confused:

Lokadamus
2016-07-06, 22:38:41
@Lokadamus
Der Pause Befehl hilft imo nicht weiter, da die Batch ja wie gesagt über die Gruppenrichtlinie ausgeführt wird und man sieht da kein DOS Fenster, sondern nur den normallen Windows rauf/runterfahren Screen wo dann (in letzteren Fall) halt nur steht "Scripte werden ausgeführt"Da ist die Frage, an welcher Stelle lässt du das Skript ausführen. Bei uns war es unter XP so, dass die Skripte erst zum Ende des Logon ausgeführt wurden.

Kannst so noch versuchen die Ausgabe des start- Befehls durch ">>Huhu.txt" am Ende der Zeile zu pipen, um zu sehen, was da passiert. Danach sollte in dem Ordner, wo der Befehl ausgeführt wird, die Datei liegen. Mit Pech liegt sie irgendwo. ;)

DerRob
2016-07-06, 23:32:36
"C:\A-REC\FastCopy211\FastCopy.exe" /cmd=sync /bufsize=32 /speed=8 /error_stop=FALSE /force_close /acl=FALSE "E:\XP-TEMP" /to="R:\X-Photo"

Im vbscript hatte ich nun objshell.Run davorgesetzt, doch irgendwie will das Fastcopy nicht so recht, ich vermute es liegt an den " Gänsefüßchen" die ich irgendwie wohl im vbscript falsch setze, oder? Kannst du mir daher vielleicht noch sagen, wie das mit dem Fastcopy fürs vbscript aussehen müßte? :confused:

Der gesamte Befehl hinter objshell.run muss in Gänsefüsschen eingeschlossen sein. Hast du innerhalb weitere Gänsefüsschen, musst du die doppelt eingeben, ansonsten geht der Run-Befehl davon aus, dass dort Ende ist. Müsste also so aussehen:
objshell.Run """C:\A-REC\FastCopy211\FastCopy.exe"" /cmd=sync /bufsize=32 /speed=8 /error_stop=FALSE /force_close /acl=FALSE ""E:\XP-TEMP"" /to=""R:\X-Photo""", 0
Also einfache " -> doppelte ", und am Anfang und Ende auch noch je ein " zusätzlich.

Wobei du eigentlich keine zusätzlichen " brauchen solltest, solange du keine Leerzeichen in den Pfaden hast, so sollte es auch gehen:
objshell.Run "C:\A-REC\FastCopy211\FastCopy.exe /cmd=sync /bufsize=32 /speed=8 /error_stop=FALSE /force_close /acl=FALSE E:\XP-TEMP /to=R:\X-Photo", 0

Das ", 0" am Ende sorgt übrigens dafür, dass du das Ausgabefenster oder Programm nicht siehst. Möchtest du es z.B. zu Testzwecken doch sehen, setz einfach eine 1 ans Ende.

Peterxy
2016-07-07, 21:25:41
Leider auch mit vbscript dasgleiche, es funktioniert im Windows aber nicht beim rauf/runterfahren.
Da ich von vbscript überhaupt keinerlei Ahnung habe, hatte ich mich daher nun nochmals mit der Batchvariante beschäftigt und ich denke nun auch die Ursache gefunden warum weder Batch mit start Befehl noch das vbscript funktionieren.

Denn setzt man in beides ein 3Sekunden Delay (in der Batch z.b. über @ping -n 3 localhost> nu), dann starten 7zip und fastcopy parallel und 3Sekunden lang werden einzelne Dateien kopiert.
Nur macht ein manuelles Delay setzen natürlich keinen Sinn, da man schon großzügig mehrere Sekunden als zusätzlichen SichheitsPuffer vergeben müßte, um sicherzustellen das wirklich alles kopiert wird.


Zusammengefaßt liegt/lag das Grundproblem also in folgendem:
Der Start Befehl funktionierte zwar, aber die Batch (wie vermutlich auch das vbscript) wird anscheinend seitens Windows direkt geschlossen, sobald parallel die Programme aufgerufen werden. Dieses umgehnde schliessen der Batch, führt wiederum jedoch offensichtlich zum Abbruch sämtlicher Kopiervorgänge. :freak:
Man müßte also irgendwie die Scipts solange offenhalten -bis alle Kopiervorgänge- abgeschlossen sind.

Da es aber wohl kein waitfor o.ä. gibt, habe ich nun an den letzten Start "" Programmaufruf ein / wait drangehangen.
Hoffe das alles so künftig zuverlässig kopiert wird, denn naheliegender wäre ja das /wait an alle Programmaufrufe dranzuhängen, leider führt dies aber nur dazu das wie bei einem normallen call nur der Reihe nach (und nicht parallel) alles abgearbeitet wird.

Tech_FREAK_2000|GS
2016-07-07, 22:28:15
Hm,

Bin eben in diesem Thread auf superuser.com gestoßen:
http://superuser.com/a/405108

Ggf ist | eine Option für uns, damit wird die aufrufende Shell nicht geschlossen bis nicht alle parallel gestarteten Prozesse beendet wurden.

e.g Befehl 1 | Befehl 2 | Befehl 3


kann das hier nur auf die Schnelle unter Windows 10 Testen.

Und im Schnelltest kam auch nur 3x Notepad zum Einsatz... Wie es sich mit komplizierteren Befehlszeilen aussieht kann ich nicht sagen.
Ob Windows Aliase kennt oder ob ein auslagern der Befehle in separate Batch Dateien sinnvoll wäre, habe ich jetzt nicht gesucht.

littlejam
2016-07-08, 20:47:14
1.) wie bewege ich Windows dazu 2 Programme gleichzeitig mittels Batch beim rauf/runterfahren auszuführen?

Wenn die 2 Programme eh voneinander unabhängig sind, warum startest du nicht 2 Batchdateien per GPO oder Scheduled Task?
Also statt einer Batch, die ja anscheinend funktioniert, einfach eine 2. schreiben für den 2. Befehl.

Gruß

minos5000
2016-07-08, 23:04:48
Wenn das VBScript nicht beim Autostart tut, dann vielleicht ein AutoIT Script?
Die Syntax ist sehr simpel und das kannst du in eine EXE kompilieren und vielleicht wird die dann beim Autostart klaglos ausgeführt.

Lokadamus
2016-07-08, 23:19:49
Wenn das VBScript nicht beim Autostart tut, dann vielleicht ein AutoIT Script?
Die Syntax ist sehr simpel und das kannst du in eine EXE kompilieren und vielleicht wird die dann beim Autostart klaglos ausgeführt.Wenn dies der Fall ist, crasht dir aber etwas von Windows entgegen. Dabei wird es meisten UAC sein. ;)

Peterxy
2016-07-09, 09:40:49
Über mehrere Batch war mit dem start Befehl dasgleiche Resultat.
Den Threadlink auf superuser.com hab ich mir auch mal angesehen, verstehe allerdings nicht was die da meinem mit process1 / process2. Ist damit ein Befehl gemeint und gibts den überhaupt im XP?

Rooter
2016-07-09, 12:16:56
Mit mehreren Batch brauchst du doch keinen Start-Befehl mehr. Statt, dass Batch B per Start von Batch A gestartet wird, jeweils einen Scheduler-Eintrag für Skript A und einen für Skript B mit den selben Bedingungen erstellen.

MfG
Rooter

littlejam
2016-07-09, 14:14:46
Mit mehreren Batch brauchst du doch keinen Start-Befehl mehr. Statt, dass Batch B per Start von Batch A gestartet wird, jeweils einen Scheduler-Eintrag für Skript A und einen für Skript B mit den selben Bedingungen erstellen.

MfG
Rooter
Jopp, das meinte ich.

Grüße

minos5000
2016-07-09, 20:17:29
Wenn dies der Fall ist, crasht dir aber etwas von Windows entgegen. Dabei wird es meisten UAC sein. ;)
Nicht, wenn man wie der TE Windows XP einsetzt ;)

Lokadamus
2016-07-10, 15:40:42
Nicht, wenn man wie der TE Windows XP einsetzt ;)Naja, eine Fehlermeldung wirft XP auch raus, wenn beim Autostart etwas nicht ausgeführt wird. Im schlimmsten Fall wird es gar nicht erst ausgeführt, aber dann gibt es dafür einen Grund. ;)

UAC scheidet als Ursache aus, das stimmt.