none
Mit Powershell einen bestimmten Text suchen RRS feed

  • Frage

  • Hallo, ich habe auf einem Windows XP mit dem vbs Script prnmngr.vbs eine Datei erzeugt in dem alle Drucker stehen die auf dem System installiert sind. Zusätzlich habe ich in die Datei den default Printer schreiben lassen. Am Ende des Datei steht dann ein Eintrag wie:

    -------------------------------------------------------------------

    [default]
    Microsoft (R) Windows Script Host Version 5.7
    Copyright (C) Microsoft Corporation. All rights reserved.

    The default printer is \\Server\Druckername

    -------------------------------------------------------------------

    Jetzt möchte ich auf einem anderen Rechner mit dem selben VBS Script einen Drucker anlegen. Dazu brauche ich die Angaben die hinter "The default printer is " stehen. Wie kann ich das am besten auslesen und in eine Variable kopieren?

    Alternativ wäre es auch schön alle Textstellen auszulesen die mit \\ anfangen. So hätte ich dann alle eingerichteten Netzwerkdrucker.

    Ich freue mich über jede Anregung


    IT Berater

    Freitag, 8. Februar 2013 08:35

Antworten

  •  

    Aber falls wir dich falsch verstanden haben und du mit POWERSHELL(!) deinen (vom VB-Script erzeugten) Text auswerten möchtest, ginge das so:

    $file = "D:\tmp\file1.txt"
    $results = Get-Content $file |  Select-String -AllMatches "\\\\\S*\\\S*"  | Select-Object -ExpandProperty matches | Select-Object -ExpandProperty value | % { $_.replace("[default]","")}
    $results
     

    Der Code liest alle Textteile die mit dem Schema "\\abc\abc\abc...." und löscht am Ende ggfls das [default]. Die Ergebnisse befinden sich dann in dem Array namens $results.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".


    Freitag, 8. Februar 2013 11:35
    Moderator
  • Ach so schmal ist der Grad gar nicht. :) Hier im Forum darfs ruhig etwas ausführlicher sein.

    Zu deiner Frage:

    - doppelte Einträge entfernst du, in dem du an das letzte select (-object) den "-unique"-Parameter anhängst

    - Den Default-Drucker erhältst du, in dem du die Ergebnisse des Vergleiches jeweils vorfilterst. Das bedeutet (siehe auch unten): die erste Filterzeile lässt nur Zeilen durch, bei denen kein "default" im Text enthalten ist. Die zweite macht fast das Gleiche, nur umgekehrt.

     

    $content =  Get-Content  "D:\tmp\file1.txt"
    
    $allButDefault = $content | ? { $_ -notlike "*default*" } |  Select-String -AllMatches "\\\\\S*\\\S*"  | Select -Expand matches | Select -Expand value  -Unique
    $OnlyDefault =  $content | ? { $_ -like "*default*" } |  Select-String -Pattern "\\\\\S*\\\S*"  | Select -Expand matches | Select -Expand value
    
    $allButDefault ; $OnlyDefault
     

    Beim zweiten Vergleich steht nun übrigens der Parameter "-pattern" statt "-allmatches". Dieser liefert nur den ersten Treffer zurück. Das passt hier besser, da nur ein Treffer zu erwarten ist. Das Vergleichspattern ist übrigens REGEX, bischen tricky aber sehr mächtig. Lohnt sich damit zu beschäftigen.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Montag, 11. Februar 2013 12:56
    Moderator

Alle Antworten

  • Also ich würde die Printer mit WMI auslesen. Hierfür gibt es die WMI Class Win32_Printer. Hier erhälst Du die Eigenschaft Default (boolean). Das Ergebnis mit Export-csv in eine csv exportieren. Auf dem anderen Rechner dann mit Import-Csv die Eigenschaft Default auswerten und den entsprechenden Drucker als Standard defenieren.
    Freitag, 8. Februar 2013 10:09
  • Hallo NBC von 2009!
    Du bist hier im PowerShell Forum gelandet, wir sprechen hier kein VBS! Was ist den das ;-)) ?
    Erschwerend kommt hinzu das die prnmngr.vbs nur bei Windows XP vorhanden ist nicht bei Vista win7 + win8 !

    Mit PowerShell geht das so : (du kannst WMI auch in der Konsole mit DOS Batches nutzen)

    # alle drucker auflisten
    Get-WmiObject -Query "Select * From Win32_Printer"
    
    # Default Drucker ausgeben
    $Default =Get-WmiObject -Query "Select * From Win32_Printer Where Default = TRUE"
    $Default
    
    #Pfad des Default Drucker ausgeben
    Join-Path $Default.SystemName $Default.ShareName
    # Default Drucker ausgeben
    $Default =Get-WmiObject -Query "Select * From Win32_Printer Where Default = TRUE"
    $Default
    
    #Pfad des Default Drucker in die Datei c:\temp\defaultdrucker.txt
    Join-Path $Default.SystemName $Default.ShareName  | Out-File c:\temp\defaultdrucker.txt 
    
    # Alle Pfade von allen druckern ausgeben die auf einem Server (Unc Pfad \\) liegen
    # Dies wird in die Datei c:\temp\drucker
    $AlleDrucker = Get-WmiObject -Query "Select * From Win32_Printer"
    ForEach($Drucker in $AlleDrucker) {
        If($Drucker.SystemName -Like "\\*") {
            Join-Path $Drucker.SystemName $Drucker.ShareName | Out-File c:\temp\drucker.txt -append
        }
    }



    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!



    Freitag, 8. Februar 2013 10:26
  •  

    Aber falls wir dich falsch verstanden haben und du mit POWERSHELL(!) deinen (vom VB-Script erzeugten) Text auswerten möchtest, ginge das so:

    $file = "D:\tmp\file1.txt"
    $results = Get-Content $file |  Select-String -AllMatches "\\\\\S*\\\S*"  | Select-Object -ExpandProperty matches | Select-Object -ExpandProperty value | % { $_.replace("[default]","")}
    $results
     

    Der Code liest alle Textteile die mit dem Schema "\\abc\abc\abc...." und löscht am Ende ggfls das [default]. Die Ergebnisse befinden sich dann in dem Array namens $results.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".


    Freitag, 8. Februar 2013 11:35
    Moderator
  • Hallo Denniver,

    vielen Dank für deine Antworten.

    Es ist immer ein schmaler Grad auf dem man sich im Forum bewegt. Wieviel schreibe ich an Infos und was vielleicht besser nicht. Super finde ich es wenn die Frage gelesen und auch beantwortet wird. Ab und an denken sich die Menschen ja auch etwas dabei wieso sie eine bestimmte Frage stellen.

    Kurze Info zum Hintergrund meiner Frage. Wir stellen gerade von Windows XP auf Windows 7 um. Auf den alten Systemen habe ich nur normale Userrechte. Mit diesen Rechten muss ich Benutzerdaten und Einstellungen sichern. Powershell WMI Abfragen laufen dort wegen fehldender Rechte nicht. Es bleibt mir also nur die mit Windows ausgelieferten VB Scripte. Auf den neuen Systemen läuft zum Glück PS und so kopiere ich dann die Daten wieder zurück und möchte entsprechend auch wieder die Netzwerkdrucker einrichten.

    Deine Zeilen aus dem letzten Beitrag funktionieren schon mal prima. Jetzt wäre noch hilfreich den Text hinter "The default printer "The default printer is " auszulesen. Somit kann ich am Ende auch den default Drucker wieder setzen.

    Perfekt wäre es noch, wenn ich die Suchergebnisse so auswerten kann, dass dort keine doppelten Einträge sind.

    IT Berater

    Montag, 11. Februar 2013 11:21
  • Ach so schmal ist der Grad gar nicht. :) Hier im Forum darfs ruhig etwas ausführlicher sein.

    Zu deiner Frage:

    - doppelte Einträge entfernst du, in dem du an das letzte select (-object) den "-unique"-Parameter anhängst

    - Den Default-Drucker erhältst du, in dem du die Ergebnisse des Vergleiches jeweils vorfilterst. Das bedeutet (siehe auch unten): die erste Filterzeile lässt nur Zeilen durch, bei denen kein "default" im Text enthalten ist. Die zweite macht fast das Gleiche, nur umgekehrt.

     

    $content =  Get-Content  "D:\tmp\file1.txt"
    
    $allButDefault = $content | ? { $_ -notlike "*default*" } |  Select-String -AllMatches "\\\\\S*\\\S*"  | Select -Expand matches | Select -Expand value  -Unique
    $OnlyDefault =  $content | ? { $_ -like "*default*" } |  Select-String -Pattern "\\\\\S*\\\S*"  | Select -Expand matches | Select -Expand value
    
    $allButDefault ; $OnlyDefault
     

    Beim zweiten Vergleich steht nun übrigens der Parameter "-pattern" statt "-allmatches". Dieser liefert nur den ersten Treffer zurück. Das passt hier besser, da nur ein Treffer zu erwarten ist. Das Vergleichspattern ist übrigens REGEX, bischen tricky aber sehr mächtig. Lohnt sich damit zu beschäftigen.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Montag, 11. Februar 2013 12:56
    Moderator
  • Wenn deine Fragen alle beantwortet sind, markiere bitte die Antworten und hilfreichen Beiträge. Danke!.

    Grüße,Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Samstag, 16. Februar 2013 18:30
    Moderator