none
String-Variable Verarbeitung / Partitionierung unter Windows 10 RRS feed

  • Frage

  • Hallo zusammen,

     

    bin gerade dabei ein Skript zur Inventarisierung von PC und den angeschlossenen Monitoren.

            $MonitorInfo = Get-WmiObject WmiMonitorId -Namespace root\wmi
             $MonitorObj = [PSCUstomObject]@{
                #Auslesen der Seriennummer(n)
                Seriennummer_Monitor = ($MonitorInfo.SerialNumberID|ForEach-Object {[char]$_}) -join ""
                #Auslesen der Product ID(s)
                Produktname_Monitor = ($MonitorInfo.UserFriendlyName | ForEach-Object {[char]$_}) -join ""
                #Auslesen des Herstellers
                Hersteller_Monitor = ($MonitorInfo.ManufacturerName|ForEach-Object {[char]$_}) -join ""
                #Auslesen des Produktionsjahres
                YearOfManufacture = $MonitorInfo.YearOfManufacture
                #Auslesen des Angeschlossenen Computers
                Computername_Monitor = $MonitorInfo.PSComputerName
    

    Das Problem ist jetzt, dass das Ergebnis von Seriennummer, Produktname und Hersteller mit vielen Leerzeichen zwischen den Ergebnissen stehen (Bsp.: XXXXXXXXXX     XXXXXXXXXX).

    Bei jedem der drei ist es eine unterschiedliche Zahl an Leerzeichen die ich gerne durch ein Komma ersetzten will.

    Am liebsten wäre mir wenn man die einzelnen Werte in wie in einem Array abrufen könnte mit $MonitorObj.Seriennummer_Monitor[1]. Ist dies möglich bzw. gibt es bessere Möglichkeiten?

     

    Außerdem würde ich diese Ergebnisse auf einem anderen Rechner gerne weiter verarbeiten. Hab es schon mit New-PSSession bzw. Enter-PSSession versucht aber dies hat nicht so funktioniert wie ich es mir vorgestellt habe.

    Ist es überhaupt möglich sich Variablen zu „teilen“?

    Eine dritte und letzte Frage noch. Dabei geht es um Resize-Partition.

        [int] $disk_counter = 0
        $Disk = Get-Disk
        $Disk | Where-Object OperationalStatus -eq "Online" | ForEach-Object {$disk_counter++}
    
        #Festplattengröße wird bestimmt
        $Disk_Size = $Disk | ForEach{$_.FriendlyName,[math]::truncate($_.size / 1GB)}
    
    Resize-Partition -DriveLetter c -Size ($Disk_Size[1]-3)GB


    Resize-Partition wird ja normalerweise so angegeben:

    Resize-Partition -DriveLetter c -Size 29GB

    Somit bleibt Partition C: 29 GB groß und der Rest wird frei. Da ich es aber variabel setzten möchte für unterschiedliche Szenarien wird eine Variable benötigt. Das GB bereitet mir Sorgen, da Size normal in UInt64 angegeben wird und somit die Variable auf von diesem Typ sein muss. Bei festlegen der Variable wie zb so:

    $test = ($disk_size[1]-3)GB


    Wird natürlich ein Fehler ausgegeben. Hatte einer das Problem auch schon mal und kann dabei behilflilch sein?



    Ist es in Ordnung mehrere Fragen zusammenzufassen oder ist es besser für jede einen neuen Thread zu eröffnen?

    Vielen Dank schonmal für eure Antworten.

    Viele Grüße,

    Dominik


    Donnerstag, 11. April 2019 13:37

Antworten

  • zu 1)

    seriennummer_Monitor = ($MonitorInfo.SerialNumberID|ForEach-Object {([char]$_).Trim()}) -join ","

    Analog auch mit den anderen Join's.

    zu 2)
    Die Frage verstehe ich nicht. Variablen kann man nicht teilen sondern nur als Parameter an den nächstenAufruf/Job weitergeben.

    zu 3)
    Warum rechnest du erst in GB um? Weise den Wert doch erst mal einer Variablen zu und rechne est bei einer tatsächlichehnAusgabe in GB um.


    • Bearbeitet bfuerchau Donnerstag, 11. April 2019 15:59
    • Als Antwort markiert Dominik Hartl Donnerstag, 18. April 2019 08:00
    Donnerstag, 11. April 2019 15:58
  • Hallo,

    bei deiner Lösung ist es eine zusammenhänge Zeichenkette und das ist für die Weiterverarbeitung kompliziert. Habe jetzt selbst an einer komplizierteren und nicht so schönen Lösung gebastelt, aber das Ergebnis ist so wie ich es mir vorgestellt habe.

    $counter = 0
    $vorgänger = ""
    ForEach($i in $MonitorInfo.SerialNumberID){
       If($i -ne 0){
                        if($counter -eq 0){
                        $Seriennummer1 = $Seriennummer1,[char] $i -join ""
                        $vorgänger = $i
                        }
                        elseIf($counter -eq 1){
                        $Seriennummer2 = $Seriennummer2, [char] $i -join ""
                        $vorgänger = $i
                        }
                    }
                    elseIf(($i -eq 0) -and($vorgänger -ne 0))
                        {$counter++;$vorgänger = $i} 
                } 
    [Array] $Seriennummer_Monitor = @($Seriennummer1,$Seriennummer2)

    Danke an alle die sich die Mühe gemacht haben mir zu helfen.

    • Als Antwort markiert Dominik Hartl Donnerstag, 18. April 2019 08:01
    Donnerstag, 18. April 2019 07:37
  • Vereinfachung:

     $Seriennummer1 = $Seriennummer1 + $i.ToString() 

    • Als Antwort markiert Dominik Hartl Donnerstag, 25. April 2019 14:15
    Donnerstag, 18. April 2019 14:12

Alle Antworten

  • zu 1)

    seriennummer_Monitor = ($MonitorInfo.SerialNumberID|ForEach-Object {([char]$_).Trim()}) -join ","

    Analog auch mit den anderen Join's.

    zu 2)
    Die Frage verstehe ich nicht. Variablen kann man nicht teilen sondern nur als Parameter an den nächstenAufruf/Job weitergeben.

    zu 3)
    Warum rechnest du erst in GB um? Weise den Wert doch erst mal einer Variablen zu und rechne est bei einer tatsächlichehnAusgabe in GB um.


    • Bearbeitet bfuerchau Donnerstag, 11. April 2019 15:59
    • Als Antwort markiert Dominik Hartl Donnerstag, 18. April 2019 08:00
    Donnerstag, 11. April 2019 15:58
  • Moin,

    zu GB: Eine Zahl mit Quantifizierer wie KB, GB usw. ist in PowerShell einfach eine Zahl, und zwar in der kleinsten Einheit, nämlich in Byte:

    Insofern schreibst Du da einfach ne Variable hin, und siehst zu, dass sie ihre Werte in Bytes bekommt. Du musst also gar nicht umrechnen.


    Evgenij Smirnov

    http://evgenij.smirnov.de

    Donnerstag, 11. April 2019 19:24
  • > Ist es in Ordnung mehrere Fragen zusammenzufassen oder ist es besser für jede einen neuen Thread zu eröffnen?
     
    Sofern Sie das gleiche Thema, die gleichen Daten betreffen: ja, das ist sogar erwünscht. Im Zweifelsfall teile ich aber auch einen Thread wenn er zu umfangreich wird.

    Zu deiner Frage 2) mit den Leerzeichen und Array, mach doch bitte mal ein konkretes Beispiel wie so ein String aussieht und wie du gerne das Ergebnis haben willst.


    Blog: http://www.bytecookie.de

    Powershell Code Manager: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Samstag, 13. April 2019 10:30
    Moderator
  • zu 1)  wenn ich es mit .Trim() kommt folgender Fehler:

    "Fehler beim Aufrufen der Methode, da [System.Char] keine Methode mit dem Namen "Trim" enthält."

    ohne .Trim() auch nicht gerade besser aus:

    "E,A,2,4,5,W,M,i,-,2, , , ,E,A,2,4,5,W,M,i,-,2, , , "

    Im optimal Fall sollte es so wie die Arraywerte von YearOfManufacture "YearOfManufacture    : {2018, 2018}" aussehen

    zu 2) Ich versuche es mal zu erklären. Auf einem Client wird ein Skript ausgeführt mit dem Befehl Get-Process. Das Ergebnis dieses Aufrufes wird in einer Variable $Process gespeichert. Auf einem Server läuft ein Skript zur Verarbeitung dieses Ergebnisses. Jede Stunde läuft ein Check ob neue Daten in einen Array geschrieben wurde, der von allen Clients und Servern bearbeitbar ist. 
    Ich denke jetzt ist klar was ich gemeint habe, aber werde mir was anders ausdenken müssen, da es nicht möglich ist. 

    zu 3) Vielen Dank rechne jetzt mit Bytes und alles ist in Ordnung und läuft.

    Montag, 15. April 2019 12:41
  • Hallo,

    das müsste dann so aussehen, das der Trim funktioniert, aber es wird dir vermutlich nicht weiterhelfen.

    (($MonitorInfo.SerialNumberID|ForEach-Object {[char]$_}) -join "").Trim()

    Bei mir wird die Nummer mit dem Wert 0 aufgefüllt, was nicht darstellbar ist, also wie ein Leerzeichen daher kommt, diese kannst du aber vorher schon wegwerfen, weil sie nicht gebraucht werden.

    z.B.:

    ($MonitorInfo.SerialNumberID| Where-Object {$_ -ne 0} | ForEach-Object {[char]$_}) -join ""

    Beste Gruesse
    brima

    Montag, 15. April 2019 14:30
  • Hallo,

    bei deiner Lösung ist es eine zusammenhänge Zeichenkette und das ist für die Weiterverarbeitung kompliziert. Habe jetzt selbst an einer komplizierteren und nicht so schönen Lösung gebastelt, aber das Ergebnis ist so wie ich es mir vorgestellt habe.

    $counter = 0
    $vorgänger = ""
    ForEach($i in $MonitorInfo.SerialNumberID){
       If($i -ne 0){
                        if($counter -eq 0){
                        $Seriennummer1 = $Seriennummer1,[char] $i -join ""
                        $vorgänger = $i
                        }
                        elseIf($counter -eq 1){
                        $Seriennummer2 = $Seriennummer2, [char] $i -join ""
                        $vorgänger = $i
                        }
                    }
                    elseIf(($i -eq 0) -and($vorgänger -ne 0))
                        {$counter++;$vorgänger = $i} 
                } 
    [Array] $Seriennummer_Monitor = @($Seriennummer1,$Seriennummer2)

    Danke an alle die sich die Mühe gemacht haben mir zu helfen.

    • Als Antwort markiert Dominik Hartl Donnerstag, 18. April 2019 08:01
    Donnerstag, 18. April 2019 07:37
  • Vereinfachung:

     $Seriennummer1 = $Seriennummer1 + $i.ToString() 

    • Als Antwort markiert Dominik Hartl Donnerstag, 25. April 2019 14:15
    Donnerstag, 18. April 2019 14:12