Powershell + Batch Skript kombiniert
Hallo zusammen.
Ich habe hier zwei Skripte (Powershell + Batch Skript)
Die Batch Datei: (Zu dieser Datei muss ich nicht viel sagen, die Batch Datei ruft das unten aufgeführte Powershell Skript auf)
powershell C:\ProgramData\procad\NDF_Batch\createSTP.ps1 %1 %2 .CATpart
start /wait C:\ProgramData\procad\NDF_Batch\sleep.exe 30
Hier das funktionierende Powershell Skript.
Erklärung: Dieses Skript konvertiert Catia native Daten in eine STP Datei. Je nach Größe der Baugruppe / Part dauert der Konvertierungsprozess länger oder mal weniger lang. Erfahrungsgemäß kommen wir ganz gut
hin mit den 30 Sekunden sleep in der Batch Datei. In der Regel dauert es aber nicht so lange.
Was ich nun gerne hätte: Dieses Sleep in der Batch Datei hätte ich gerne im Powershell integriert. Das bedeutet das Skript sollte prüfen ob im Zielpfad eine *.STP Datei vorhanden ist. Wenn nicht soll er das jede weitere Sekunde testen und das maximal 300 Sekunden lang. Ist bis zu diesem Zeitpunkt keine STP Datei vorhanden soll der Konvertierungsprozess abgebrochen werden. Kann das hier umgesetzt werden?
Danke!!!
Ich habe hier zwei Skripte (Powershell + Batch Skript)
Die Batch Datei: (Zu dieser Datei muss ich nicht viel sagen, die Batch Datei ruft das unten aufgeführte Powershell Skript auf)
powershell C:\ProgramData\procad\NDF_Batch\createSTP.ps1 %1 %2 .CATpart
start /wait C:\ProgramData\procad\NDF_Batch\sleep.exe 30
Hier das funktionierende Powershell Skript.
# Script name: CreateSTP.ps1
# Purpose: Create an NDF file
# Security: Admin has to input "Set-ExecutionPolicy Unrestricted" after opening the shell
#####################Main block starts here########################
#########################################################################################################
# Begin of section for configuration
#########################################################################################################
param(
[string]$Sourcefile, # Quelldatei mit Pfad und falscher Extension!!!
[string]$Targetfile, # Zieldatei mit Pfad
[string]$Type ) # .CATpart, .CATproduct
Write-Host (">>>PowerShellVersion:" + $Host.Version )
## Verzeichnisse prüfen...
Write-Host
Write-Host (">>>>>>>>>>>>>>>>>>>>>>> ");
[System.IO.FileInfo]$fi = New-Object System.IO.FileInfo($Sourcefile);
#$fi.FullName
$newfilename = $fi.BaseName + $Type;
$newFileFullname = Join-Path $fi.DirectoryName $newfilename
Write-Host $newFileFullname
#& 'C:\Program Files (x86)\dmstools AG\dmstools Printer for PRO.FILE\dmsSpoolManager.exe' /creator /port ".Creator (PDF/A)" /n /q! /v /o $args[1] /j ".PDF/A (Creator)" $newFileFullname
C:\coretechnologie2013\evolution64\evolution.exe -batch C:\coretechnologie2013\evolution64\scripts\convert.scp $newFileFullname ProEngineer Step $Targetfile C:\catiawork\3D_Evolution\test1.log
#notepad $newFileFullname
Write-Host (">>>>>>>>bye..>>>>>>>>>>>>>>>> ");
Erklärung: Dieses Skript konvertiert Catia native Daten in eine STP Datei. Je nach Größe der Baugruppe / Part dauert der Konvertierungsprozess länger oder mal weniger lang. Erfahrungsgemäß kommen wir ganz gut
hin mit den 30 Sekunden sleep in der Batch Datei. In der Regel dauert es aber nicht so lange.
Was ich nun gerne hätte: Dieses Sleep in der Batch Datei hätte ich gerne im Powershell integriert. Das bedeutet das Skript sollte prüfen ob im Zielpfad eine *.STP Datei vorhanden ist. Wenn nicht soll er das jede weitere Sekunde testen und das maximal 300 Sekunden lang. Ist bis zu diesem Zeitpunkt keine STP Datei vorhanden soll der Konvertierungsprozess abgebrochen werden. Kann das hier umgesetzt werden?
Danke!!!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 240840
Url: https://administrator.de/contentid/240840
Ausgedruckt am: 25.11.2024 um 23:11 Uhr
11 Kommentare
Neuester Kommentar
Hallo mschaedler1982,
bitte benutze Code-Tags zum Posten deines Powershell-Codes ansonsten gehen hier wichtige Sonderzeichen verloren und wir können dir nicht ordentlich helfen. Merci.
Insgesamt könnte das dann Beispielsweise so aussehen:
Das Beispiel geht jetzt davon aus das ein File erzeugt wurde wenn der Prozess sich ordentlich beendet hat, ohne prüfen auf Vorhandensein des Files, das musst du noch näher spezifizieren:
Grüße Uwe
bitte benutze Code-Tags zum Posten deines Powershell-Codes ansonsten gehen hier wichtige Sonderzeichen verloren und wir können dir nicht ordentlich helfen. Merci.
Insgesamt könnte das dann Beispielsweise so aussehen:
param(
[string]$Sourcefile, # Quelldatei mit Pfad und falscher Extension!!!
[string]$Targetfile, # Zieldatei mit Pfad
[string]$Type # .CATpart, .CATproduct
)
$myjob = [Powershell]::Create().AddScript({
param(
[string]$Sourcefile,
[string]$Targetfile,
[string]$Type
)
System.IO.FileInfo]$fi = New-Object System.IO.FileInfo($Sourcefile)
$newfilename = $fi.BaseName + $Type
$newFileFullname = Join-Path $fi.DirectoryName $newfilename
start-process "C:\coretechnologie2013\evolution64\evolution.exe" -ArgumentList "-batch C:\coretechnologie2013\evolution64\scripts\convert.scp $newFileFullname ProEngineer Step $Targetfile C:\catiawork\3D_Evolution\test1.log" -Wait
}).AddParameters(@($sourceFile,$TargetFile,$Type))
$myjob.BeginInvoke()| out-null
[int]$maxwaittime = 300
[int]$cTime = $maxwaittime
while($myjob.InvocationStateInfo.State -eq "Running"){
if($cTime -gt 0){
Write-Progress -Activity "Konvertierung läuft..." -Status "Bitte warten." -CurrentOperation "(Nach einer maximalen Wartezeit von 5 Minuten wird der Vorgang automatisch abgebrochen)" -SecondsRemaining $cTime -PercentComplete ([Math]::Round((($maxwaittime-$cTime)/$maxwaittime)*100))
sleep(1)
$cTime--
}else{
$myjob.Stop()
write-host "Konvertierung wegen Timeout von 5 Minuten abgebrochen." -ForegroundColor Red
exit 1
}
}
if ((dir "C:\catiawork\NdfWork\*_NdfWork\*.stp")){
write-host "Konvertierung wurde erfolgreich abgeschlossen." -ForegroundColor Green
}else{
write-host "STP File wurde nicht erzeugt!." -ForegroundColor Red
}
Das Ziel Verzeichnis lautet. C:\catiawork\NdfWork\67227_NdfWork\ wobei "67227" eine variable ist.
woher bekomme ich diese "Variable" ?Grüße Uwe
hatte noch einen Fehler beim Aufruf der exe drin, jetzt müsste es laufen, kann es aber gerade nicht testen, da ich auf dem Smartphone schreibe.
Die überprüfung ob das File vorhanden ist oder nicht hatte ich noch nicht eingebaut da mir die Infos zum Verzeichnis fehlten, hatte ich ja oben geschrieben.
Das Script geht im Moment davon aus, wenn der Prozess beendet wurde auch ein File erzeugt wurde und wenn der Prozess nicht innerhalb von 5 Min. beendet ist wird der Prozess gestoppt.
baue die morgen noch den Check zusätzlich mit ein...
Schönen Abend
Uwe
Die überprüfung ob das File vorhanden ist oder nicht hatte ich noch nicht eingebaut da mir die Infos zum Verzeichnis fehlten, hatte ich ja oben geschrieben.
Das Script geht im Moment davon aus, wenn der Prozess beendet wurde auch ein File erzeugt wurde und wenn der Prozess nicht innerhalb von 5 Min. beendet ist wird der Prozess gestoppt.
baue die morgen noch den Check zusätzlich mit ein...
Schönen Abend
Uwe
noch eine Info die nicht unwichtig wäre:
Wie ist das Verhalten des Programms, beendet sich das direkt wenn du es in einer Shell startest und läuft die Konvertierung dann durch ein anderes Programm im Hintergrund oder bleibt die Eingabe so lange deaktiviert bis es erfolgreich konvertiert hat ?
Und wie lange liegt das konvertierte File in dem o.g. Ordner, wenn du sagst das es nach Beendigung des Programms sofort wieder gelöscht wird ? Irgenwie ist mir das Verhalten noch nicht so ganz klar, wäre es hier nicht besser den Zielpfad zu überprüfen wo das File letztendlich landet anstatt den temporären Pfad.
Klär mich auf Wenn ich weiß wie der Hase läuft bekommst du auch was funktionierendes, denn normalerweise poste ich nur getesteten Code.
Wie ist das Verhalten des Programms, beendet sich das direkt wenn du es in einer Shell startest und läuft die Konvertierung dann durch ein anderes Programm im Hintergrund oder bleibt die Eingabe so lange deaktiviert bis es erfolgreich konvertiert hat ?
Und wie lange liegt das konvertierte File in dem o.g. Ordner, wenn du sagst das es nach Beendigung des Programms sofort wieder gelöscht wird ? Irgenwie ist mir das Verhalten noch nicht so ganz klar, wäre es hier nicht besser den Zielpfad zu überprüfen wo das File letztendlich landet anstatt den temporären Pfad.
Klär mich auf Wenn ich weiß wie der Hase läuft bekommst du auch was funktionierendes, denn normalerweise poste ich nur getesteten Code.
Also hier mal der Zwischenstatus so wie ich dich verstanden habe (habe es für dich etwas verständlicher in einer einfacheren Variante umgeschrieben):
Variante A: Für den Fall das der Prozess "evolution.exe" selber die Konvertierung durchführt und sich nicht selber sofort beendet ginge diese Variante:
Variante B: Sollte der Prozess sich jedoch sofort beenden (deiner Beschreibung nach vermute ich das) und ein anderer Prozess macht die weitere Konvertierung ginge es hiermit:
(Hier wäre dann noch zu klären, welch anderer Prozess die tatsächliche Konvertierung macht damit dieser entsprechend durch das Script beendet werden kann)
Variante A: Für den Fall das der Prozess "evolution.exe" selber die Konvertierung durchführt und sich nicht selber sofort beendet ginge diese Variante:
param(
[string]$Sourcefile, # Quelldatei mit Pfad und falscher Extension!!!
[string]$Targetfile, # Zieldatei mit Pfad
[string]$Type # .CATpart, .CATproduct
)
[System.IO.FileInfo]$fi = New-Object System.IO.FileInfo($Sourcefile)
$newfilename = $fi.BaseName + $Type
$newFileFullname = Join-Path $fi.DirectoryName $newfilename
# Prozess der Konvertierung starten
$proc = start-process "C:\coretechnologie2013\evolution64\evolution.exe" -ArgumentList "-batch C:\coretechnologie2013\evolution64\scripts\convert.scp $newFileFullname ProEngineer Step $Targetfile C:\catiawork\3D_Evolution\test1.log" -passthru
# Maximale Wartezeit für eine Konvertierung solange der Prozess läuft
[int]$maxwaittime = 300
[int]$cTime = $maxwaittime
# Solange der Konvertierungsprozess noch läuft zeige eine Vortschrittsanzeige
while(!$proc.HasExited){
if($cTime -gt 0){
Write-Progress -Activity "Konvertierung läuft..." -Status "Bitte warten." -CurrentOperation "(Nach einer maximalen Wartezeit von 5 Minuten wird der Vorgang automatisch abgebrochen)" -SecondsRemaining $cTime -PercentComplete ([Math]::Round((($maxwaittime-$cTime)/$maxwaittime)*100))
# warte eine Sekunde bis zur nächsten Prüfung
sleep(1)
$cTime--
}else{
# sollte die maximale Wartezeit erreicht sein und der Prozess noch laufen, beende den Konvertierungsprozess
$proc.Kill()
write-host "Die maximale Wartezeit von $maxwaittime Sekunden wurde erreicht und die Konvertierung abgebrochen." -ForegroundColor Red
# verlasse die Schleife sofort
break
}
}
if ((dir "C:\catiawork\NdfWork\*_NdfWork\*.stp")){
write-host "Konvertierung wurde erfolgreich abgeschlossen." -ForegroundColor Green
}else{
write-host "STP File wurde nicht erzeugt!." -ForegroundColor Red
}
Variante B: Sollte der Prozess sich jedoch sofort beenden (deiner Beschreibung nach vermute ich das) und ein anderer Prozess macht die weitere Konvertierung ginge es hiermit:
(Hier wäre dann noch zu klären, welch anderer Prozess die tatsächliche Konvertierung macht damit dieser entsprechend durch das Script beendet werden kann)
param(
[string]$Sourcefile, # Quelldatei mit Pfad und falscher Extension!!!
[string]$Targetfile, # Zieldatei mit Pfad
[string]$Type # .CATpart, .CATproduct
)
[System.IO.FileInfo]$fi = New-Object System.IO.FileInfo($Sourcefile)
$newfilename = $fi.BaseName + $Type
$newFileFullname = Join-Path $fi.DirectoryName $newfilename
# Prozess der Konvertierung starten
$proc = start-process "C:\coretechnologie2013\evolution64\evolution.exe" -ArgumentList "-batch C:\coretechnologie2013\evolution64\scripts\convert.scp $newFileFullname ProEngineer Step $Targetfile C:\catiawork\3D_Evolution\test1.log" -passthru
# Maximale Wartezeit für eine Konvertierung solange der Prozess läuft
[int]$maxwaittime = 300
[int]$cTime = $maxwaittime
while($cTime -gt 0){
if(!(dir "C:\catiawork\NdfWork\*_NdfWork\*.stp")){
Write-Progress -Activity "Konvertierung läuft..." -Status "Bitte warten." -CurrentOperation "(Nach einer maximalen Wartezeit von $maxwaittime Sekunden wird der Vorgang automatisch abgebrochen)" -SecondsRemaining $cTime -PercentComplete ([Math]::Round((($maxwaittime-$cTime)/$maxwaittime)*100))
# warte eine Sekunde bis zur nächsten Prüfung
sleep(1)
$cTime--
}else{
write-host "Konvertierung wurde erfolgreich abgeschlossen." -ForegroundColor Green
exit 0
}
}
$proc.Kill()
write-host "Die maximale Wartezeit von $maxwaittime Sekunden wurde erreicht und die Konvertierung abgebrochen." -ForegroundColor Red
exit 1