PowerShell / Regex: In Textdatei suchen und ersetzen

Holgip

Lt. Commander
Registriert
Dez. 2012
Beiträge
1.779
Hallo zusammen,

ich habe eine Textdatei, in der ich bestimmte Strings ersetzen will. Die Datei wird über ein PS Script erstellt und ich möchte damit abfragen, wer auf meinen PC zugreift und welches Laufwerk angesprochen wird. Die Auswertung erfolgt durch ein PHP-Script.
Ihr findet die Datei im Anhang, da der Spoiler hier die Leerzeichen ignoriert.

Der String, der gelöscht werden soll, ist ".loca...", damit nur der Name ausgewertet wird, wobei da aber auch, je nach Laune? des Scripts ".loc..." oder ".local..." stehen kann.

Im Internet habe ich schon ein wenig recherchiert, aber ich komme mit PowerShell nicht so zurecht, vor allem mit den Regular Expressions.
Gefunden habe ich ein PS-Script, das mir aber die ganze Zeile löscht, und somit nur noch die Überschriften "Path" und "Computer" stehen bleiben:
Code:
(gc 'd:\offen.txt' | ?{$_ -notmatch '^\s*$|.loc...|.loca...|.local...'}) -replace '^\s+','' | set-content 'd:\offen.txt''

Wie bekomme ich das Script dazu, nur die gesuchten Strings zu löschen?
 

Anhänge

Würde ich mit einem simplen Aneinanderhängen von replace machen wenn es wirklich nur die 3 Strings sind:

PowerShell:
(Get-Content offen.txt).replace('.loca...', '').replace('.loc...', '').replace('local...', '') | Set-Content offen2.txt
Ergänzung ()

Wenn es ein regex sein soll:

PowerShell:
(Get-Content offen.txt) -replace '\.loca?l?\.\.\.', '' | Set-Content offen.txt
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Raijin
Wow, so einfach und es funktioniert.

Vielen Dank!
 
  • Gefällt mir
Reaktionen: Bitopium
Was spricht eigentlich dagegen, bereits im Script, das die Datei erstellt, die fraglichen Strings zu löschen, also gar nicht erst in die Datei zu schreiben? Für mich klingt es nämlich nach einer Krücke, das im Nachhinein in einem separaten Schritt zu erledigen.
 
  • Gefällt mir
Reaktionen: Bitopium und NotNerdNotDau
Es spricht dagegen, dass ich das erzeugende Script überhaupt nicht verstehe. Wenn du eine Möglichkeit siehst, das zu erledigen, wäre das natürlich besser.
Script Zugriff.ps1:
Code:
# Scriptteil für Adminrechte
$id=[System.Security.Principal.WindowsIdentity]::GetCurrent()
$principal=New-Object System.Security.Principal.WindowsPrincipal($id)
if(!$principal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)) {
 $powershell=[System.Diagnostics.Process]::GetCurrentProcess()
 $psi=New-Object System.Diagnostics.ProcessStartInfo $powershell.Path
 $script=$MyInvocation.MyCommand.Path
 $prm=$script
 foreach($a in $args) {
  $prm+=' '+$a
 }
 $psi.Arguments=$prm
 $psi.Verb="runas"
 [System.Diagnostics.Process]::Start($psi) | Out-Null
 return;
}

# Das eigentliche Script
    $Select = @(
        'Path'
        @{ n = 'Computer' ; e = { $HostEntry = [System.Net.Dns]::gethostentry($_.ClientComputerName)
                    "$($HostEntry.Hostname)`n$( -join "`n")" } }
    )

    Do {
        $OpenFile = Get-SmbOpenFile | select $Select | Sort Path | out-file D:\offen.txt -encoding ASCII

       If ($OpenFile -eq $null) { Return }
       $CloseFile | Close-SmbOpenFile
    } Until (1 -eq 2)

Das Script ist nicht von mir, ich kann mich beim besten Willen aber nicht mehr erinnern, wo ich das her habe.
 
Ja gut, könntest auch in Zeile 26 mit rein basteln in der die Text Datei geschrieben wird...
 
  • Gefällt mir
Reaktionen: PHuV und Raijin
Holgip schrieb:
Es spricht dagegen, dass ich das erzeugende Script überhaupt nicht verstehe.
Aber die Lösung "hinterher" hast du doch auch nicht verstanden?!? Lies dir mal bitte den Link zum XY-Problem in meiner Signatur durch. Das nächste Mal fragst du nach der Lösung für das eigentliche Problem - Skript spuckt unerwünschten Inhalt aus - anstelle dir einen eigenen Lösungsansatz auszudenken, den du aber ebensowenig verstehst und dann aber darauf eine Antwort im Forum suchst. Klassisches XY-Problem ;)

Entweder du änderst die Ausgabe des Skripts direkt - .local müsste Teil des Hostnames in Zeile 22 sein und mittels .replace() ersetzt/gelöscht werden - oder du lässt das Skript die Datei so schreiben, um sie dann direkt danach mit dem Befehl von @Bitopium noch in Skript wieder zu ändern.

Wenn du das Skript nicht verstehst bzw die einzelnen Variablen nicht kennst, muss man eben Stück für Stück am skript rumbasteln, um zB den besagten Hostnamen mal separat auszugeben. Dort wird man dann merken wo das .local tatsächlich herkommt und kann sich dann überlegen an welcher Stelle das .replace hinkommt.
 
  • Gefällt mir
Reaktionen: PHuV
Genau so habe ich versucht, das Skript zu verstehen. Die einzige Variable darin ist $Select und in der steht der Hostname und der Pfad nicht so drin, wie später in der Datei. Das wird wohl erst im Get-SmbOpenFile gemacht. Und genau da blicke ich nicht durch. Meine Programmiererfahrung erschöpft sich in Basic und das ist auch schon fast 40Jahre her. Seitdem habe ich mich nur wenig mit Programmieren beschäftigt und im Alter ist man halt auch weniger flexibel im Hirn.
Habe jetzt auch versucht, die Ersetzungsroutine in das Skript mit einzubauen, aber ohne Erfolg.
Ich werde es also so lassen, wie @Bitopium beschrieben hat, so funktioniert es wie gewünscht.

Danke nochmal an euch für eure Antworten. :)

Wenn es nicht mehr so heiß ist, werde ich mich nochmal mit PS beschäftigen. Vielleicht bekomme ich es noch heraus, wie man die Änderungen direkt im Erstellungsskript einträgt.
 
  • Gefällt mir
Reaktionen: Raijin
Hier, bitteschön:
PowerShell:
(Get-Content offen.txt) -replace "\.loca?l?.+","" | Set-Content offen.txt
 
Zurück
Oben