TS Remuxer - Batchverarbeitung mit der Powershell

Begonnen von Mindwarp, Februar 04, 2016, 16:46:23

« vorheriges - nächstes »

ErichV

Zitat von: Mam am Februar 08, 2016, 13:32:41
Es ist also (ausnahmsweise   :P) nicht ein lokales Ösi Problem, sondern betrifft alle.

Und mit irgendeinem Update wird sie wahrscheinlich genauso still und heimlich verduften, wie sie vor ein paar Monaten aufgetaucht ist.

Das beruhigt mich.  ;)
Ja, ich glaube auch, dass hier noch mit Updates nachgebessert wird.


Zitat von: Mindwarp am Februar 08, 2016, 16:16:32
@Erich
Schon mal probiert ein Leeres *.ps1 File zu erstellen und den Sourcecode umzukopieren?

Das hat leider auch nicht weitergeholfen, ich werde es schon noch zum Laufen bringen, da bin ich mir sicher.  :)
Danke für die Überarbeitung des Tools!
1 x Humax ESD-160S, 1x TechniSat TechniBox S4, 2x TechniSat Skystar USB 2 HD CI, Nvidia Shield TV Media Streaming Player, TS Doctor 4.0.37, DVBViewer Pro 7.2.5.0 mit DVBViewer Media Server 3.2.5.0

micha

Das neue Skript habe ich jetzt noch nicht ausprobiert. Aber das alte Skript funktioniert tatsächlich, wenn ich es auf 20s erhöhe. 10s reichen nicht.

Der MKVMerger nimmt sich Gedenksekunden, warum auch immer. Und ja. Dann wird tatsächlich mittem im Muxen eine TSDoctor[1] Instanz gestartet, die dann vor dem O.K. Klick zum Starten nicht weiter kommt. $Process.CloseMainWindow() liefert dann tatsächlich TRUE, obwohl der TSD2 noch offen ist.

Kann man das nicht irgendwie übers Handle lösen. Z. B. schauen, wenn MKVMerge nicht mehr auf die zu muxende Datei rumnudelt?

Mindwarp

Das neue Skript prüft jetzt ab, ob das Fenster und der TS-Doctor Prozess beendet ist.
Das dürfte die MKVMerge Prüfung überflüssig machen.
Ich empfehle aber, bei den ersten Tests die Vollständigkeit der neuen Datei zu prüfen.
Eventuell fehlt durch das vorzeitige Close etwas von der Videodatei.
Hatte ich zwar bisher nicht, aber besser auf Nummer sicher gehen.

Mam

#18
Zitat von: micha am Februar 09, 2016, 20:41:06
Das neue Skript habe ich jetzt noch nicht ausprobiert. Aber das alte Skript funktioniert tatsächlich, wenn ich es auf 20s erhöhe. 10s reichen nicht.

Aaarghhhh! da rollen sich einem ja die Fußnägel auf beim Lesen  >:(

Schmeiß den Sch#"$%&&/ schnell weg und mach es richtig!

Richtig gehts mit:

* Starte Prozess / Task / Thread
* waitforinputidle();
* schick Deine Messages raus.

Waitforinputidle() überprüft, ob die Messagequeue des gewünschten Prozesses leer ist. Also das Hauptfenster aufgebaut und die Initialisierungen abgeschlossen. In dem Zustand kann man dann beruhigt Nachrichten in der Queue ablegen und sie werden auch erhört. Genausogut kannst Du damit das Ende der Abarbeitung abwarten, schickst Du dem Doc also "erzeuge neue Datei-KLICK!" wird waitforinputidle() erst wieder zurückkommen, wenn die Datei fertig ist und der Doc auf OK wartet.

Dazu braucht man keine Sleeps usw, die sowieso nicht funktionieren, da sie bei jedem Rechner und Lastzustand ganz andere Werte haben müssen.

Ja, ist mir klar, Du möchtest das Ganze bitte mundgerecht für die Powershell, null Problemo:



''' Remember that PowerShell can access .Net objects. The Start-Sleep as suggested by Blair Conrad can be replaced by a call to WaitForInputIdle of the server process so you know when the server is ready before starting the client.

$sp = get-process server-application
$sp.WaitForInputIdle()

''' You could also use Process.Start to start the process and have it return the exact Process. Then you don't need the get-process.

$sp = [diagnostics.process]::start("server-application", "params")
$sp.WaitForInputIdle()

$cp = [diagnostics.process]::start("client-application", "params")
$cp.WaitForInputIdle()




Mindwarp

Danke für die Info.
Werde ich bei Gelegenheit ausprobieren.

Mindwarp

Hatte jetzt Gelegenheit mit mit WaitForInputIdle() zu experimentierten.
1. Versuch:

   $TsDoctor = 'C:\Program Files (x86)\Cypheros\TSDoctor2\TSDoctor.exe'
   $Process = Start-Process $TsDoctor -PassThru
   $Process.WaitForInputIdle()
   [System.Windows.Forms.SendKeys]::SendWait("%wer")

crasht. Fehlermeldung:

Zugriffsverletzung bei Adresse 00897AD7 in Modul 'TSDoctor.exe'. Lesen von Adresse 000003C4.


Also scheint der TS-Doctor Prozess noch nicht gestartet zu sein.
2. Versuch

   $TsDoctor = 'C:\Program Files (x86)\Cypheros\TSDoctor2\TSDoctor.exe'
   $Process = Start-Process $TsDoctor -PassThru
   Start-Sleep -Seconds 10
   $Process.WaitForInputIdle()
   [System.Windows.Forms.SendKeys]::SendWait("%wer")
   $Process.WaitForInputIdle()
   [System.Windows.Forms.SendKeys]::SendWait('R:\Video\MKVOut\Test.ts')

Es wird beim öffnen Dialog der Laufwerksbuchstabe nicht eingegeben.
:\Video\MKVOut\Test.ts
3. Versuch:
Nochmals den Prozess einlesen.

   $TsDoctor = 'C:\Program Files (x86)\Cypheros\TSDoctor2\TSDoctor.exe'
   $Process = Start-Process $TsDoctor -PassThru
   Start-Sleep -Seconds 10
   $Process.WaitForInputIdle()
   [System.Windows.Forms.SendKeys]::SendWait("%wer")
   $TSD_Process = get-process TSDoctor
   $TSD_Process.WaitForInputIdle()
   [System.Windows.Forms.SendKeys]::SendWait('R:\Video\MKVOut\Test.ts')

Ergebnis ist das Gleiche wie beim 2. Versuch.
Scheinbar kann WaitForInputIdle() beim Doctor nicht erkennen, ob noch etwas zu tun ist.

Ich habe auch mit WaitForInputIdle(100), experimentiert.
Eine Schleife um WaitForInputIdle() gebaut und gewartet bis true zurückgegeben wird.
$Process.Refresh() hat auch nichts gebracht.
Statt Start-Process habe ich  [diagnostics.process]::start probiert.

Was mache ich falsch?

Mam

ich vermute, Du bearbeitest den falschen Prozess.
Dieser neue "Dialog" ist keiner mehr, sondern ein eigenständiges Programm.
Du wirst es wohl nicht über den Doc erreichen können, sondern must es selber aus der Prozessliste raussuchen.

Mindwarp

Habe einmal Get-Process mit TS-Doctor und mit "TS-Doctor mit Öffnen Dialog" ausgeführt (als Admin).
Die Ausgaben von Get-Process sind indentisch - habe ProcessName verglichen.

Habe keine Ahnung wie das mit Subprozessen und/oder SubWindows funktioniert.

Mindwarp

Subprozesse kann man wohl so ermitteln:

Get-WmiObject -Class Win32_Process -Filter "ParentProcessID=5188"

Damit erhalte ich aber kein Ergebniss.

micha

Zugriffsverletzung bei Adresse XYZ gibt es seit TSD2 eh häufiger. Eine solche Fehlermeldung in Verbindung mit dem Skript erscheint z. B. jedes mal, wenn man das Skript im Betrieb abbricht sowie die dazugehörigen TSD/MKVMerger Prozesse tötet.

So verbleiben natürlich unweigerlich Dateireste im TSD2 TEMP Arbeitsverzeichnis. Die kann man auch ohne Probleme selber löschen. Auch Unlocker.exe meldet folglich, dass es keine offenen Handles mehr gibt auf die Dateien. Lässt man soche Reste aber beim Start durch den TSD2 durch dessen Abfrage löschen, kommt es jedes Mal zur Zugriffsverletzungmeldung.

masterflai

Das Script funktioniert noch immer einwandfrei. Allerdings habe ich ein Problem bei Dateinamen, welche runde Klammern enthalten.

Konkret geht es um die Variable $EinVideodatei.

Wenn der Film: Neuer Film (2016).ts heißt, dann findet sich zunächst der richtige Wert in der Variable, da vor der Übergabe an den TS Doctor die Zeile Write-Host '   Start ' $EinVideodatei zeigt, dass dort noch die runden Klammern enthalten sind.

Anschließend erfolgt die Übergabe an den Öffnen Dialog

[System.Windows.Forms.SendKeys]::SendWait($EinVideodatei)

SendKeys hat die Angewohnheit, dass runde Klammern eine Bedeutung haben und demnach werden diese interpretiert.

Wie schaffe ich es, dass der Parameter als String betrachtet wird und runde Klammern entsprechend entwertet werden?

Moko

#26
Zitat von: masterflai am Dezember 17, 2016, 20:46:38

Anschließend erfolgt die Übergabe an den Öffnen Dialog

[System.Windows.Forms.SendKeys]::SendWait($EinVideodatei)

SendKeys hat die Angewohnheit, dass runde Klammern eine Bedeutung haben und demnach werden diese interpretiert.

Wie schaffe ich es, dass der Parameter als String betrachtet wird und runde Klammern entsprechend entwertet werden?

versuche es mal damit:

   $EinVideodatei=$EinVideodatei.Replace("(","{(}")
   $EinVideodatei=$EinVideodatei.Replace(")","{)}")
   [System.Windows.Forms.SendKeys]::SendWait($EinVideodatei)



funktioniert zumindest im dem mal schnell abgeänderten Script:

  $EinVideodatei="test (2016).ts"
   $notepad= 'C:\Windows\System32\notepad.exe'
   $Process = Start-Process $notepad -PassThru
   WarteAufProcessStart $Process.Id
   [Microsoft.VisualBasic.Interaction]::AppActivate($Process.Id)
   $EinVideodatei=$EinVideodatei.Replace("(","{(}")
   $EinVideodatei=$EinVideodatei.Replace(")","{)}")
   [System.Windows.Forms.SendKeys]::SendWait($EinVideodatei)


Ausgabe im notepad: "test (2016).ts" (natürlich ohne die ")

Edith sagt: Tippfehler verbessert

Mindwarp

Mit TSD Version 3.2.9 haben sich die Shortcuts geändert.

Das Skript muss angepasst werden von
[System.Windows.Forms.SendKeys]::SendWait("%wer")
auf
[System.Windows.Forms.SendKeys]::SendWait("%wxr")


www.cypheros.de