Jump to content

Zeilen in PowerShell ersetzen


Direkt zur Lösung Gelöst von BOfH_666,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Guten Abend! Ich hoffe mir kann hier jemand helfen. Bin ein absoluter Neuling in Sachen PowerShell. Habe ein Skript geschrieben, welches mir Inhalte ersetzen soll. Die oberen zwei "Replaces" funktionieren. Das dritte leider nicht. Am Ende der Datei sollen folgende vier Zeilen


 

CreateNullOperation("Wegfahrschritt", 2000.0000, 0.0000, 1);
ResetPneumaticHood();
ResetApproachStrategy();
ResetRetractStrategy();


ergänzt werden.


Die PowerShell-Datei sieht folgendermaßen aus:

$original_file = 'C:\Desktop\TEST.xcs'
$destination_file =  'C:\Desktop\TEST.xcs'
(Get-Content $original_file) | Foreach-Object {
    $_ -replace "SetWorkpieceSetupPosition\(0.0000, 0.0000, 0.0, 0.0\);","SetWorkpieceSetupPosition(5.0000, 5.0000, 0.0, 0.0);"
    } | Set-Content $destination_file

(Get-Content $original_file) | Foreach-Object {
    $_ -replace 'TypeOfProcess.Drilling, "-1", "-1", 0, -1, -1','TypeOfProcess.Drilling, "-1", "-1", 0, -1, 2'
    } | Set-Content $destination_file

(Get-Content $original_file) | Foreach-Object {
    $_ -replace
@"
try {
    CreateMacro("PYTHA_PARK_2", "PYTHA_PARK");
}
catch (System.Exception e) { }
"@
,
@"
CreateNullOperation("Wegfahrschritt", 2000.0000, 0.0000, 1);
ResetPneumaticHood();
ResetApproachStrategy();
ResetRetractStrategy();

try {
    CreateMacro("PYTHA_PARK_2", "PYTHA_PARK");
}
catch (System.Exception e) { }
"@
    } | Set-Content $destination_file

Über eine Hilfe würde ich mich sehr freuen!!!

Link zu diesem Kommentar
  • Beste Lösung

Wenn ich Dich nicht falsch verstanden habe, kannst Du Deinen Code deutlich einfacher gestallten

$original_file = 'C:\Desktop\TEST.xcs'
$destination_file = 'C:\Desktop\TEST+.xcs'

$X_Offset = '5'  # value to add to the existing value
$Y_Offset = '5'  # value to add to the existing value
$TypeOfProcessArg5 = '3'  # value to add to the existing value

$ReplacedContent = Get-Content $original_file | Foreach-Object {
    if ($_ -match '(?:SetWorkpieceSetupPosition)\((\d+\.\d+),\s*(\d+\.\d+),\s*.*\);') {
        $X_Offset = ($Matches[1] -as [decimal]) + [decimal]$X_Offset
        $Y_Offset = ($Matches[2] -as [decimal]) + [decimal]$Y_Offset

        $_ -replace 'SetWorkpieceSetupPosition\(.*\);', "SetWorkpieceSetupPosition($X_Offset, $Y_Offset, 0.0, 0.0);"
    }
    elseif ($_ -match '(?<=TypeOfProcess\.Drilling,\s*"-1",\s*"-1",\s*0,\s*-1,\s+)(-*\d+)') {
        $TypeOfProcessArg5 = ($Matches[1] -as [int]) + [int]'3'
        $_ -replace '(?<=TypeOfProcess\.Drilling,\s*"-1",\s*"-1",\s*0,\s*-1,\s+)(-*\d+)', $TypeOfProcessArg5
    }
    else {
        $_
    }
} 

$Ergaenzung = @'
CreateNullOperation("Wegfahrschritt", 2000.0000, 0.0000, 1);
ResetPneumaticHood();
ResetApproachStrategy();
ResetRetractStrategy(); 
'@

$ReplacedContent[0..($ReplacedContent.Length - 6)] + 
    $Ergaenzung + 
    $ReplacedContent[($ReplacedContent.Length - 5)..($ReplacedContent.Length)] | 
        Set-Content -Path $destination_file -Force

Was Du mit den beiden in here-strings versteckten Try-Catch-Blöcken bezwecken möchtest, habe ich nicht verstanden.

 

Achja ... fast hätte ich's vergessen. Wenn Du hier im Forum Code postest, formatier den doch bitte auch als Code. Sonst hast im Zweifel ungewollte Zeilenumbrüche drinne und der Code ist quasi kaputt.

bearbeitet von BOfH_666
Code korrigiert
Link zu diesem Kommentar

Guten Morgen!

Vielen Dank für die schnelle Antwort. Bin wie gesagt noch ein Neuling in Sachen PowerShell, und habe mich mit Hilfe von Google zum Skript durchgeschlungen. Von dem her kann ich Dir die Frage mit den here-strings leider nicht beantworten ;-)

Habe heute Morgen das Skript ausprobiert. Folgendes ist mir aufgefallen: In der xcs-Datei wird nun jede Zeile doppelt ausgegeben, was nicht Sinn der Sache ist... Was ebenso noch sein sollte: Die Ergänzung sollte nicht ganz ans Ende geschrieben werden, sondern beginnend mit der fünftletzten Zeile. Geht so etwas? Ich hoffe sehr. Es handelt sich um eine Datei, welche aus unserem CAD-Programm umgewurstelt bzw. ergänzt wird und dann CNC-tauglich ist, ohne nochmals das CAM-System zu öffnen.

Natürlich werde ich in Zukunft die Skripte als Code formatieren!

Link zu diesem Kommentar
vor 6 Stunden schrieb wethlo:

Bin wie gesagt noch ein Neuling in Sachen PowerShell, und habe mich mit Hilfe von Google zum Skript durchgeschlungen. Von dem her kann ich Dir die Frage mit den here-strings leider nicht beantworten ;-)

Vielleicht nimmst Du Dir ein bissl Zeit und schaffst Dir erstmal die Grundlagen von Powershell drauf. Da gibt es zahlreiche gute Bücher oder  - im Moment noch verfügbar - den kostenlosen und sehr empfehlenswerten Video-Kurs in der Microsoft Virtual Academy - Getting Started with Powershell.  Das erspart Dir bestimmt eine Menge Frustration und verschwendete Zeit. Ich glaube, man kann eine hinreichend komplexe Technologie nicht vernünftig lernen indem man sich ein paar Zeilen Code zusammengoogled.  ;-)

Zitat

In der xcs-Datei wird nun jede Zeile doppelt ausgegeben, was nicht Sinn der Sache ist...

Oooops ...   mein Fehler ... ist korrigiert ...  Ich hab auch nochmal die ersten beiden Ersetzungen kontrolliert, von denen Du geschrieben hattest, dass sie funktionierten. Eigentlich sollten sie das mit Deinem Code gar nicht tun. Der -replace Operator arbeitet mit Regulären Ausdrücken und bei denen haben bestimmte Zeichen bestimmte Bedeutungen. Deshalb muß man sie, will man diese speziellen Zeichen tatsächlich finden, "escape'n". Ich hab das im Code auch mal korrigiert

Zitat

Die Ergänzung sollte nicht ganz ans Ende geschrieben werden, sondern beginnend mit der fünftletzten Zeile.

Hmmm ... 'bin mir nicht sicher, daß ich das jetzt verstehe. Du hattest ursprünglich geschrieben "Am Ende der Datei sollen folgende vier Zeilen". Soll danach noch eine Leerzeile kommen, oder wie meinst Du das?

 

Hinweis: ich habe den Code in meiner obigen Antwort korrigiert. Zusätzlich habe ich noch die Ausgabedatei mit einem "+" Zeichen vershehen. Dann kannst Du das Script mehrfach laufen lassen, ohne jedes Mal die Dateien hin und her kopieren zu müssen.  ;-)

 

bearbeitet von BOfH_666
Hinweis ergänzt
Link zu diesem Kommentar

In meinem ersten Post stehen nach den besagten vier Zeilen, die am Schluss eingefügt werden müssen noch fünf weitere Zeilen, die da stehen bleiben müssen, sonst kapiert das CAM-Program die XCS-Datei nicht. Gibt es eine Möglichkeit, immer diese vier zeilen in die fünftletzte Zeile zu setzen?

Das Skript funktioniert jetzt, bis darauf, dass jeweils 0.000 und 0.000 nach SetWorkpieceSetupPosition nicht durch 5.000 und 5.000 ersetzt wird.

Besten Dank schon mal für deine Bemühungen!

Link zu diesem Kommentar

Wie wird die Ausgangs-Datei denn erzeugt? Sieht die immer exakt gleich aus? Steht nach den 4 einzufügenden Zeilen immer das Gleiche?

 

Du solltest Dich auch damit beschäftigen, wie man Scripte debugged. Dieses Forum hier ist für Profis - da wird erwartet, dass man selber auch mitarbeitet.  :aha2:

 

... und nur noch aus Neugier: Like'st Du hier Deine eigenen Beiträge?

bearbeitet von BOfH_666
Link zu diesem Kommentar
vor 7 Minuten schrieb wethlo:

Wusste nicht, dass es sich hier um ein Forum nur für Profis handelt.

Ich glaube nicht das er das so gemeint hat. Man kann ja keine Musterlösung erwarten aus einem Forum. Manchmal braucht es einfach einen kleinen Anstoß in die richtige Richtung, damit der Fragensteller sich die Lösung erarbeiten kann. Das hilft beiden Seiten.

Link zu diesem Kommentar
vor 45 Minuten schrieb wethlo:

Wie gesagt. Es handelt sich um unser CNC-Programm, welches Programme auswirft die mit den beschriebenen Inhalten ergänzt werden müssen.

Hmmm ... sehen die zu ersetzenden Strings immer exakt gleich aus, oder können die sich auch unterscheiden?

Ich habe die Suchmuster (Patterns) und zu ersetzenden Strings (Replace) mal als Variablen rausgezogen. So kannst Du einfacher mit verschiedenen Versionen spielen und ein bissl rumprobieren.

Wenn keine sensiblen Informationen drin sind und die Dinger nicht zu groß sind, könntest Du hier mal eine der Dateien posten? ... oder einen Ausschnitt mit de relevanten Informationen. (das dann bitte auch als Code formattiert um ungewollte Zeilenumbrüche zu vermeiden)

Zitat

Wusste nicht, dass es sich hier um ein Forum nur für Profis handelt.

Damit meinte ich nur, dass hier auch Nicht-Profis geholfen wird, wenn sie sich wie Profis verhalten und ein bissl mitarbeiten;-)   ... und wenn man sich mit CNC-Programmen beschäftigt, ist man auch als Hobby-ist quasi Profi ehrenhalber.  ;-):D

 

Zitat

Nach den vier einzufügenden Zeilen stehen immer die selben Zeilen. Sprich: Wenn diese dort eingefügt werden, wäre es perfekt.

hmmm  ...  das CNC-Programm is wohl ne kleine Diva?!  ... möchte die Sachen auch noch in der richtigen reihenfolge haben ...  ;-)  ... nagut ... ich hab den Code nochmal korrigiert - probier mal so. Wenn das mit den Zeilennummern noch nicht richtig passt, kannst Du das selbst entsprechend anpassen.

bearbeitet von BOfH_666
Link zu diesem Kommentar

Vielen Dank für deine Bemühungen! Habe mal mit dem geänderten Skript rumprobiert... Wirft mir so leider Fehlermeldungen aus. Ich lade gleich mal eine XCS-Datei (Format, welches unser CAD-Programm ausspuckt) hoch, da kannst du Dir das mal anschauen. Die Dateien sehen quasi am Kopf und Fuß immer gleich aus. Da wird das Werkstück mit der Größe angegeben. Hierbei soll der Ursprung in x und y jeweils um 5 mm verschoben werden. Der String in dem das drin steht sieht immer gleich aus.

Die vier Zeilen kurz vor dem Ende bewirken an der CNC, dass der Bumper um 2000 mm nach rechts fährt und das Werkstück wieder vom Tisch genommen werden kann. Diese Einstellungen kann man leider in der Software nicht einstellen.

TEST01.txt

Link zu diesem Kommentar
vor 4 Minuten schrieb wethlo:

... Wirft mir so leider Fehlermeldungen aus.

Fehlermeldungen sind wichtig und gehören mit hierher. Die helfen uns, die Fehler zu beseitigen. Ansonsten müssten wir ja raten. ;-)  Wenn Du Fehlermeldungen postest, die bitte auch als Code formattieren!

vor 4 Minuten schrieb wethlo:

Ich lade gleich mal eine XCS-Datei (Format, welches unser CAD-Programm ausspuckt) hoch, da kannst du Dir das mal anschauen.

Ich schau gleich mal ....  diesen Super-Sorglos-Service gibt's hier aber nur ausnahmsweise ... beim nächsten Mal musst Du dann selbst ran.  ;-):D

Link zu diesem Kommentar
vor 28 Minuten schrieb wethlo:

Selbstverständlich!  Mach ich natürlich gerne! Vielleicht kann ich Dich mal unterstützen ein cnc-Programm zu schreiben;-)

Hey hey ... gute Idee ... meine letzte Begegnung mit einer CNC-Maschine ist ca 35 Jahre her ... ich vermute mal, da hat sich inzwischen ein bissl was getan.  ;-)   ... manche von den Dingern waren noch nicht mal CNC - die waren nur NC-Maschinen.  :aetsch2::shock2:

 

So ... ich hab das Script noch mal etwas umgebaut ... diesmal mit einem kleinen Extra-Dreh.  Du brauchst jetzt nur noch den numerischen Offset angeben, den Du zu den Werten addieren möchtest, die vom CNC-Programm nicht die gewünschten Werte mitbekommen haben. Wenn in der Original-Datei z.B. "SetWorkpieceSetupPosition(0.0000, 0.0000, 0.0, 0.0);" steht, dann brauchst Du nur 4,5 und 6.7 für X und Y angeben, dann erhältst Du in der Ausgabe-Datei "SetWorkpieceSetupPosition(4.5000, 6.7000, 0.0, 0.0);"  ... das gleiche für den Wert des 5. Arguments von "TypeOfProcess.Drilling".

Viel Spaß!

Link zu diesem Kommentar
vor 4 Stunden schrieb BOfH_666:

diesen Super-Sorglos-Service gibt's hier aber nur ausnahmsweise ... beim nächsten Mal musst Du dann selbst ran.  ;-):D

Du lügst doch... Du kannst gar nicht anders :-) Ich war auch schon drauf und dran, wollte aber noch abwarten bis mehr Infos zur Eingabedatei und dem Ziel da sind - so wie jetzt. Und Du hattest natürlich schon wieder früher Zeit :-)

@wethlo Es hilft immer ungemein, wenn das tatsächliche Ziel und die tatsächliche Ausgangslage bekannt sind.  Wenn Du Deinen ersten Post anschaust, wirst Du verstehen, was ich damit meine.

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...