Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Powershell + Batch Skript kombiniert

Frage Entwicklung Batch & Shell

Mitglied: mschaedler1982

mschaedler1982 (Level 1) - Jetzt verbinden

13.06.2014, aktualisiert 16.06.2014, 2398 Aufrufe, 11 Kommentare, 2 Danke

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.

01.
  
02.
#  Script name:    CreateSTP.ps1  
03.
#  Purpose:        Create an NDF file  
04.
#  Security:       Admin has to input "Set-ExecutionPolicy Unrestricted" after opening the shell  
05.
 
06.
#####################Main block starts here######################## 
07.
 
08.
######################################################################################################### 
09.
# Begin of section for configuration 
10.
######################################################################################################### 
11.
 
12.
param( 
13.
[string]$Sourcefile,    # Quelldatei mit Pfad und falscher Extension!!! 
14.
[string]$Targetfile,    # Zieldatei mit Pfad 
15.
[string]$Type  )        # .CATpart, .CATproduct 
16.
 
17.
Write-Host (">>>PowerShellVersion:" + $Host.Version )  
18.
 
19.
## Verzeichnisse prüfen... 
20.
 
21.
 
22.
Write-Host  
23.
Write-Host (">>>>>>>>>>>>>>>>>>>>>>> ");  
24.
 
25.
 
26.
 
27.
[System.IO.FileInfo]$fi = New-Object  System.IO.FileInfo($Sourcefile); 
28.
#$fi.FullName 
29.
 
30.
$newfilename = $fi.BaseName + $Type; 
31.
 
32.
$newFileFullname = Join-Path  $fi.DirectoryName $newfilename 
33.
 
34.
Write-Host $newFileFullname 
35.
 
36.
#& '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 
37.
 
38.
C:\coretechnologie2013\evolution64\evolution.exe -batch C:\coretechnologie2013\evolution64\scripts\convert.scp $newFileFullname ProEngineer Step $Targetfile C:\catiawork\3D_Evolution\test1.log 
39.
#notepad $newFileFullname 
40.
 
41.
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!!!

Mitglied: mschaedler1982
13.06.2014 um 14:21 Uhr
Das Ziel Verzeichnis lautet. C:\catiawork\NdfWork\67227_NdfWork\ wobei "67227" eine variable ist.
Bitte warten ..
Mitglied: colinardo
13.06.2014, aktualisiert um 22:36 Uhr
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:
01.
param( 
02.
    [string]$Sourcefile, # Quelldatei mit Pfad und falscher Extension!!! 
03.
    [string]$Targetfile, # Zieldatei mit Pfad 
04.
    [string]$Type # .CATpart, .CATproduct 
05.
06.
 
07.
$myjob = [Powershell]::Create().AddScript({ 
08.
    param( 
09.
        [string]$Sourcefile, 
10.
        [string]$Targetfile, 
11.
        [string]$Type 
12.
13.
    System.IO.FileInfo]$fi = New-Object System.IO.FileInfo($Sourcefile) 
14.
    $newfilename = $fi.BaseName + $Type 
15.
    $newFileFullname = Join-Path $fi.DirectoryName $newfilename 
16.
    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 
17.
}).AddParameters(@($sourceFile,$TargetFile,$Type)) 
18.
 
19.
$myjob.BeginInvoke()| out-null 
20.
 
21.
[int]$maxwaittime = 300 
22.
[int]$cTime = $maxwaittime 
23.
while($myjob.InvocationStateInfo.State -eq "Running"){ 
24.
    if($cTime -gt 0){ 
25.
        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)) 
26.
        sleep(1) 
27.
        $cTime-- 
28.
    }else{ 
29.
        $myjob.Stop() 
30.
        write-host "Konvertierung wegen Timeout von 5 Minuten abgebrochen." -ForegroundColor Red 
31.
        exit 1 
32.
33.
34.
 
35.
if ((dir "C:\catiawork\NdfWork\*_NdfWork\*.stp")){ 
36.
    write-host "Konvertierung wurde erfolgreich abgeschlossen." -ForegroundColor Green 
37.
}else{ 
38.
    write-host "STP File wurde nicht erzeugt!." -ForegroundColor Red 
39.
}
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
Bitte warten ..
Mitglied: mschaedler1982
13.06.2014 um 20:04 Uhr
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?
Bitte warten ..
Mitglied: colinardo
13.06.2014, aktualisiert um 20:21 Uhr
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
Bitte warten ..
Mitglied: colinardo
13.06.2014, aktualisiert um 21:17 Uhr
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.
Bitte warten ..
Mitglied: mschaedler1982
13.06.2014 um 21:20 Uhr
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.
Bitte warten ..
Mitglied: mschaedler1982
13.06.2014 um 21:23 Uhr
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.
Bitte warten ..
Mitglied: colinardo
LÖSUNG 13.06.2014, aktualisiert 16.06.2014
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:
01.
param( 
02.
    [string]$Sourcefile, # Quelldatei mit Pfad und falscher Extension!!! 
03.
    [string]$Targetfile, # Zieldatei mit Pfad 
04.
    [string]$Type # .CATpart, .CATproduct 
05.
06.
 
07.
[System.IO.FileInfo]$fi = New-Object System.IO.FileInfo($Sourcefile) 
08.
$newfilename = $fi.BaseName + $Type 
09.
$newFileFullname = Join-Path $fi.DirectoryName $newfilename 
10.
# Prozess der Konvertierung starten 
11.
$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 
12.
 
13.
# Maximale Wartezeit für eine Konvertierung solange der Prozess läuft 
14.
[int]$maxwaittime = 300 
15.
[int]$cTime = $maxwaittime 
16.
# Solange der Konvertierungsprozess noch läuft zeige eine Vortschrittsanzeige 
17.
while(!$proc.HasExited){ 
18.
	if($cTime -gt 0){ 
19.
        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)) 
20.
        # warte eine Sekunde bis zur nächsten Prüfung 
21.
        sleep(1) 
22.
        $cTime-- 
23.
    }else{ 
24.
        # sollte die maximale Wartezeit erreicht sein und der Prozess noch laufen, beende den Konvertierungsprozess 
25.
        $proc.Kill() 
26.
        write-host "Die maximale Wartezeit von $maxwaittime Sekunden wurde erreicht und die Konvertierung abgebrochen." -ForegroundColor Red 
27.
        # verlasse die Schleife sofort 
28.
        break 
29.
30.
31.
 
32.
if ((dir "C:\catiawork\NdfWork\*_NdfWork\*.stp")){ 
33.
    write-host "Konvertierung wurde erfolgreich abgeschlossen." -ForegroundColor Green 
34.
}else{ 
35.
    write-host "STP File wurde nicht erzeugt!." -ForegroundColor Red 
36.
}
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)
01.
param( 
02.
    [string]$Sourcefile, # Quelldatei mit Pfad und falscher Extension!!! 
03.
    [string]$Targetfile, # Zieldatei mit Pfad 
04.
    [string]$Type # .CATpart, .CATproduct 
05.
06.
 
07.
[System.IO.FileInfo]$fi = New-Object System.IO.FileInfo($Sourcefile) 
08.
$newfilename = $fi.BaseName + $Type 
09.
$newFileFullname = Join-Path $fi.DirectoryName $newfilename 
10.
# Prozess der Konvertierung starten 
11.
$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 
12.
 
13.
# Maximale Wartezeit für eine Konvertierung solange der Prozess läuft 
14.
[int]$maxwaittime = 300 
15.
[int]$cTime = $maxwaittime 
16.
 
17.
while($cTime -gt 0){ 
18.
    if(!(dir "C:\catiawork\NdfWork\*_NdfWork\*.stp")){ 
19.
        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)) 
20.
        # warte eine Sekunde bis zur nächsten Prüfung 
21.
        sleep(1) 
22.
        $cTime-- 
23.
    }else{ 
24.
        write-host "Konvertierung wurde erfolgreich abgeschlossen." -ForegroundColor Green 
25.
        exit 0 
26.
27.
28.
$proc.Kill() 
29.
write-host "Die maximale Wartezeit von $maxwaittime Sekunden wurde erreicht und die Konvertierung abgebrochen." -ForegroundColor Red 
30.
exit 1
Bitte warten ..
Mitglied: mschaedler1982
15.06.2014, aktualisiert um 23:34 Uhr
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:
01.
C:\catiawork\NdfWork\67308_NdfWork>powershell C:\ProgramData\procad\NDF_Batch\cr 
02.
eateSTP.ps1 "C:\catiawork\NdfWork\67308_NdfWork\15815-003_CAM-COVER-ASY_00511833 
03.
.CGR" "C:\catiawork\NdfWork\67308_NdfWork\15815-003_CAM-COVER-ASY_00511833.stp" 
04.
.CATproduct 
05.
System.IO.FileInfo]$fi : Die Benennung "System.IO.FileInfo]$fi" wurde nicht 
06.
als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines 
07.
ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, 
08.
oder ob der Pfad korrekt ist (sofern enthalten), und wiederholen Sie den 
09.
Vorgang. 
10.
In C:\ProgramData\procad\NDF_Batch\createSTP.ps1:7 Zeichen:1 
11.
+ System.IO.FileInfo]$fi = New-Object System.IO.FileInfo($Sourcefile) 
12.
+ ~~~~~~~~~~~~~~~~~~~~~~ 
13.
    + CategoryInfo          : ObjectNotFound: (System.IO.FileInfo]$fi:String) 
14.
   [], CommandNotFoundException 
15.
    + FullyQualifiedErrorId : CommandNotFoundException 
16.
 
17.
Join-Path : Das Argument kann nicht an den Parameter "Path" gebunden werden, 
18.
da es NULL ist. 
19.
In C:\ProgramData\procad\NDF_Batch\createSTP.ps1:9 Zeichen:30 
20.
+ $newFileFullname = Join-Path $fi.DirectoryName $newfilename 
21.
+                              ~~~~~~~~~~~~~~~~~ 
22.
    + CategoryInfo          : InvalidData: (:) [Join-Path], ParameterBindingVa 
23.
   lidationException 
24.
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,M 
25.
   icrosoft.PowerShell.Commands.JoinPathCommand 
26.
 
27.
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
Bitte warten ..
Mitglied: colinardo
16.06.2014, aktualisiert um 09:16 Uhr
ach da fehlte nur die einleitende eckige Klammer [ für den Typ der Variablen in Zeile 7, sorry.
Bitte warten ..
Mitglied: mschaedler1982
16.06.2014 um 09:38 Uhr
Nun funktioniert es! Danke, danke Uwe!!
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
Powershell CHAT Skript (5)

Frage von xpxy15 zum Thema Batch & Shell ...

Windows 7
gelöst Batch-Skript oder VBS Skript zum Sichern von Office Vorlagen (2)

Frage von Ceejaay zum Thema Windows 7 ...

Batch & Shell
gelöst PowerShell Ordnergröße Skript ignoriert versteckte Dateien (3)

Frage von Giffas zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...