mschaedler1982
Goto Top

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.

 
#  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!!!

Content-ID: 240840

Url: https://administrator.de/contentid/240840

Ausgedruckt am: 25.11.2024 um 23:11 Uhr

mschaedler1982
mschaedler1982 13.06.2014 um 14:21:35 Uhr
Goto Top
Das Ziel Verzeichnis lautet. C:\catiawork\NdfWork\67227_NdfWork\ wobei "67227" eine variable ist.
colinardo
colinardo 13.06.2014 aktualisiert um 22:36:19 Uhr
Goto Top
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:
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 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:
Das Ziel Verzeichnis lautet. C:\catiawork\NdfWork\67227_NdfWork\ wobei "67227" eine variable ist.
woher bekomme ich diese "Variable" ?

Grüße Uwe
mschaedler1982
mschaedler1982 13.06.2014 um 20:04:44 Uhr
Goto Top
Hallo Uwe.

Zunächst mal Danke für deine Benühungen!

Die Variable ist eine Projektnummer und kommt aus unserem PDM System, die quasi dieses Verzeichnis temporär 67227_NdfWork erstellt. Nach Konvertierung wird dieses Verzeichnis wieder gelöscht.

Ich habe jetzt mal dein Skript getestet. Ich laufe hier immer auf Fehler. Meines erachtens läuft das Powershell Skript viel zu schnell durch es wartet keine 300 Sekunden. Es erscheint gleich Konvertierung abgeschlossen, obwohl noch keine STP Datei erzeugt worden ist.

Was & Wie habe ich getestet:

1. Dein Skript: In der Batch Datei sleep aktiv gelassen -> Fehler
2. Dein Skript: In der Batch Datei sleep auskommentiert -> Fehler
3. Original Powershell: In der Batch Datei sleep aktiv gelassen -> Fehler
4. Original Powershell: In der Batch Datei Sleep auskommentiert - > Fehler
5. Original Powershell: In der Batch Datei Sleep von 30 auf 120 Sekunden erhöht. -> Erfolgreich

Wo hast du denn in dem Powershelll Skript definiert das er auf die STP Datei warten soll bzw prüft ob die STP nun vorhanden ist?
colinardo
colinardo 13.06.2014 aktualisiert um 20:21:27 Uhr
Goto Top
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
colinardo
colinardo 13.06.2014 aktualisiert um 21:17:38 Uhr
Goto Top
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 face-smile Wenn ich weiß wie der Hase läuft bekommst du auch was funktionierendes, denn normalerweise poste ich nur getesteten Code.
mschaedler1982
mschaedler1982 13.06.2014 um 21:20:26 Uhr
Goto Top
Hallo Uwe.

Die C:\coretechnologie2013\evolution64\evolution.exe" läuft im Hintergrund weiter und erstellt eine STP Datei. Das Powershell stößt diesen Konvertierungsprozess an und im Hintergrund wird weiter konvertiert. (das nehm ich stark an, generell geht es ja)

Das seh ich daran das die Batch Datei bereits den Sleep einleitet. Und nach 30 Sekunden schließt sich die Batch Datei und sollte nicht innerhalb dieser 30 Sekunden die STP Datei erzeugt worden sein. Läuft mein Monitor auf Fehler "Fehler des Konvertierungsprozess" hier hab ich dann die Möglichkeit den sleep zu erhöhen. Je nach Baugruppengröße kann der Konvertierungsprozess länger dauern. Also folgendermaßen die STP Datei wird erzeugt und bevor sie in das Verzeichnis geschrieben wird, wird sie noch repariert. Das findet alles hier statt. ->

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

Deine letzte Frage habe ich nicht genau verstanden. Im Vordergrund ist nur die Batch Datei, eine Eingabe ist nicht möglich.
mschaedler1982
mschaedler1982 13.06.2014 um 21:23:54 Uhr
Goto Top
Wenn die 30 Sekunden nachdem sleep rum sind wird, das erzeugte Verzeichnis gelöscht. (Zahl_NdfWork)

Ist die STP Datei erzeugt wird sie ins PDM System geladen.
colinardo
Lösung colinardo 13.06.2014, aktualisiert am 16.06.2014 um 09:38:52 Uhr
Goto Top
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:
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
mschaedler1982
mschaedler1982 15.06.2014 aktualisiert um 23:34:34 Uhr
Goto Top
Hallo Uwe.

Danke für die Überarbeitung! Ich habe nun beide Skripte getestet. Es geht bei beiden nicht. Die evolution.exe läuft solange bis die Konvertierung & Reparatur durchgelaufen sind. Sprich Skript 1 kommt nur noch in Frage oder?

Was mir auffällt wenn ich Skript 1 teste dann ist die evolution.exe nur ganz kurz in den Prozessen zu finden. Wenn ich das Original Skript verwende dann ist die evolution.exe solange unter den Prozessen zu finden bis er fertig ist.

Bei Skript 1 erscheint folgende Fehlermeldung:
C:\catiawork\NdfWork\67308_NdfWork>powershell C:\ProgramData\procad\NDF_Batch\cr
eateSTP.ps1 "C:\catiawork\NdfWork\67308_NdfWork\15815-003_CAM-COVER-ASY_00511833  
.CGR" "C:\catiawork\NdfWork\67308_NdfWork\15815-003_CAM-COVER-ASY_00511833.stp"  
.CATproduct
System.IO.FileInfo]$fi : Die Benennung "System.IO.FileInfo]$fi" wurde nicht  
als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines
ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens,
oder ob der Pfad korrekt ist (sofern enthalten), und wiederholen Sie den
Vorgang.
In C:\ProgramData\procad\NDF_Batch\createSTP.ps1:7 Zeichen:1
+ System.IO.FileInfo]$fi = New-Object System.IO.FileInfo($Sourcefile)
+ ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (System.IO.FileInfo]$fi:String)
   , CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Join-Path : Das Argument kann nicht an den Parameter "Path" gebunden werden,  
da es NULL ist.
In C:\ProgramData\procad\NDF_Batch\createSTP.ps1:9 Zeichen:30
+ $newFileFullname = Join-Path $fi.DirectoryName $newfilename
+                              ~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Join-Path], ParameterBindingVa
   lidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,M
   icrosoft.PowerShell.Commands.JoinPathCommand

STP File wurde nicht erzeugt!.

Das Skript wartet keine 300 Sekunden, ist wahrscheinlich durch den Fehler. Welche Informationen brauchst du noch von mir?
Kurz zur erläuterung was ich sehe: Powershell Skript startet. Die Uhrzeit läuft vlt 2 Sekunden runter, in der Zeit ist auch die evolution.exe unter den Prozessen zu finden und dann folgt die Fehlermeldung.

Danke & gruss

mschaedler1982
colinardo
colinardo 16.06.2014 aktualisiert um 09:16:07 Uhr
Goto Top
ach da fehlte nur die einleitende eckige Klammer [ für den Typ der Variablen in Zeile 7, sorry.
mschaedler1982
mschaedler1982 16.06.2014 um 09:38:38 Uhr
Goto Top
Nun funktioniert es! Danke, danke Uwe!!