Jump to content

BOfH_666

Expert Member
  • Gesamte Inhalte

    2.046
  • Registriert seit

  • Letzter Besuch

Beiträge erstellt von BOfH_666

  1. Was für ein nachlässig geschriebener PowerShell-Code ....  :aha2:

     

    "dir" ist ein PowerShell-Alias für Get-ChildItem. der Parameter -Directory teilt Get-ChildItem mit, dass es ausschließlich Verzeichnisse auflisten soll. Wenn Du auch Dateien angezeigt haben möchtest, musst Du den also weglassen. Haben wirklich einzelne Dateien separat gepflegte Berechtigungen?

  2. vor 47 Minuten schrieb andrew:

    Aber die Tendenz ist schon so, dass viele Dienste, Infrastruktur und vieles mehr vermehrt in die Cloud abwandert.

     

    ... was ja aber nicht heißt, dass es wie von Zauberhand auf Zuruf funktioniert und es kein Fachwissen mehr braucht, um es einzurichten und zu betreuen. Und spätestens, wenn die Hardware im eigenen Serverraum eingerichtet ist und so lange sie ohne Fehler läuft, ist der Unterschied zwischen der Administration von Cloud-Ressourcen zu lokalen Ressourcen nicht sooo wahnsinnig groß.

    • Like 1
  3. vor 5 Minuten schrieb RealUnreal:

    Ich bin nur etwas verunsichert, weil ich jetzt testweise die Batch Datei 3x gestartet habe.

     

    Was verunsichert Dich denn daran?  ... dass der Computer das macht, was Du ihm gesagt hast?  :aetsch2:  ... wie schon gesagt, wird dieser Fall im "Regelbetrieb" ja kaum auftreten. Diese Einstellung ist eher für Jobs gedacht, die lange genug laufen, um sich quasi mit der nächsten Ausführung zu überlappen. Und dafür hat man dann zur Not noch die Optionen, zu lange laufende Jobs abzubrechen.

    • Haha 1
  4. vor 23 Minuten schrieb CoNtAcT2000:

    Das Umwandeln in String musste allerdings sein.

    Und eben das zweifle ich nach wie vor an. Wenn Du Dir mal mit Get-Member die Eigenschaften dieser Property anschaust, wirst Du feststellen, dass es bereits ein String ist.  ;-)  

    $User = Get-ADUser -Identity 'IrgendEinADUser' -Properties Department
    $User.Department | Get-Member

     

  5. vor einer Stunde schrieb newbi2009:

    MUSS ich den Umweg gehen, den Inhalt der Variable zuerst in eine Datei zu speichern, nur um diese danach wieder einzulesen?

    Das muss doch auch ohne gehen.... Aber wie?

     

    Nein, Du musst keine Datei zwischenspeichern. ABER ... wenn Deine Input-Daten keine validen CSV-Daten sind, werden die Ergebnisse auch wieder fehlerhalft sein. Du musst also z.B. sicherstellen, dass jede Zeile die gleiche Anzahl an Feldern hat und dass, wenn Du ein Delimiterzeichen in einem Feld hast, dieses auch mit Gänsefüßchen umschlossen ist. Es genügt Deinen Input-Content in einer Variablen zu speichern und dann mit dieser weiterzuarbeiten ... so ungefähr ... 

     

    $RawInput =
    @'
    Zeile 01
    "Zeile 02
    Zeile 03
    Zeile 04
    Zeile 05
    Schmitz;Harald;Schmitz@zuHause.de;123456;
    ;Heiner;;234567;
    Müller;;Mueller@zuHause.de;;
    Maier;Susanne;;456789;
    '@ -split "\r\n"
    
    $WithoutFirst5Rows = 
        $RawInput | 
            Select-Object -Skip 5
    $WithoutFirst5Rows | 
        ConvertFrom-Csv -Header "Nachname", "Vorname", "Email", "PersonalNummer"  -Delimiter ";"

     

  6.  

    OK.... also prinzipiell bin ich absolut bei Nils. Wir haben hier schon öfters an Lösung von hinten durch die Brust ins Auge gebaut, die aber für die eigentlich zu lösende Aufgabe völlig unnötig waren.

     

    Davon unabhängig:

    vor 26 Minuten schrieb newbi2009:

    Allerdings bringt mir das cmdlet Import-Csv nicht so viel. Ich habe ja eine Variable ($xyz) in die ich meinen selbstgebauten Header und die nötigen "Daten-Zeilen" aus der ursprünglichen csv Datei gelegt habe....... 

     

    Du kannst Dir doch das ganze Geraffel sparen, wenn Du die aus Deiner Excel-Datei erzeugte CSV-Datei, die ja keine Header hat, ganz normal mit Import-CSV einliest, dabei mit dem Parameter -Header, die gewünschten Header dazupackst und mit einem Select-Object -Skip 5, die ersten 5 Zeilen auslässt.

  7. vor einer Stunde schrieb newbi2009:

    erstellt aus einer Excel Arbeitsmappe

    Es gibt ein Modul, mit dem Du Excel-Dateien direkt verarbeiten kannst: ImportExcel. Das macht die Sache eventuell leichter.

     

    vor einer Stunde schrieb newbi2009:

    Da diese Datei keinen brauchbaren Header hat, will ich mir den selber erstellen .

    Dafür gibt es beim cmdlet Import-Csv den Parameter -Header, mit dem man eigene Header hinzufügen kann.

     

    vor einer Stunde schrieb newbi2009:

    Mein Problem ist, dass ich es mir sparen möchte, den Inhalt von $xyz als csv abzuspeichern und neu einzulesen. Aber jeder Versuch, das zu umgehen scheitert irgendwie kläglich.

    Hat da jemand eine Idee, wie ich da vorgehen muss?

    Ja ... quasi oben alles beantwortet ...   ;-)

     

    Ach übrigens, wenn Du Code postest, diesen am Besten auch als Code formatieren (das ist der Button "</>" oben im Editor) 

  8.  

     

    So ... ich hab's nochmal gründlich durchdacht und glaube den (Denk)-Fehler gefunden zu haben. Du möchtest gar nicht $Group.FullName haben. Das wären ja auch wieder alle Dateien einer Gruppe. Du wolltest ja nur die Aktuellste, richtig?

    Also brauchen wir das Ergebnis der "Gruppen-Auswertung" ... also statt ... 

     

    foreach ($Group in $SeparatedGroupList) {
        $Group.Group | 
            Sort-Object -Property VersionInt | 
                Select-Object -Last 1 -Property PartlyFileName, DocumentKey, VersionInt, FullName
    }

     

    besser das hier:

    foreach ($Group in $SeparatedGroupList) {
        $LastVersionInt =
        $Group.Group | 
            Sort-Object -Property VersionInt | 
                Select-Object -Last 1 -Property PartlyFileName, DocumentKey, VersionInt, FullName
        $LastVersionInt.FullName
    }

     

    Besser so?  ;-) 

    • Like 1
  9. vor 9 Minuten schrieb dormi98:

     ... sondern lediglich darum den Fehlerfaktor Mensch zu verkleinern. 

     

    Das hat meiner Meinung nach wenig Sinn, wenn der "Fehlerfaktor" legitim in den Verzeichnissen arbeiten soll. Nur weil nochmal eine Nachfrage "Bist Du sicher?" kommt, heißt das ja nicht, dass keine Fehler mehr passieren - dafür kennen wir alle mehr als ausreichend Beispiele. ;-) 

    Für zu veröffentlichende Daten könnte ein "Vier-Augen-Prinzip" eine gewisse Sicherheit liefern. Es wird also erst veröffentlicht, wenn mindestens zwei verschiedene "Fehlerfaktoren" zugestimmt haben. ;-) 

    • Danke 1
  10. vor 3 Stunden schrieb cartis:

    Trotz der tollen Erklärung von BOfH_666 weiß ich dennoch leider immer noch nicht

     

    Na, so toll war sie dann wohl offenbar nicht ...  :aha2:

     

    vor 3 Stunden schrieb cartis:

    wie ich zB. den Pfad in der Spalte "FullName" als Variable speichern kann

     

    Das ist üblicherweise nicht nötig. Wenn man's doch unbedingt möchte, dann ganz normal mit "$MeineNeueSupiVariable = $Group.FullName".  ;-) 

     

    vor 3 Stunden schrieb cartis:

    bzw. den Wert als Source für "copy-item" verwenden kann.

     

    Da es fast immer darum geht, mehrere gleichartige Operationen an gleichartigen Objekten auszuführen und wir dabei entweder die Pipeline-Laufvariable $_ oder $PSItem oder bei einer foreach-Schleife die jeweilige definierte Schleifenvariable zur Verfügung haben, können wir diese bereits existierenden Variablen mit all ihren Properties benutzen.

     

    vor 3 Stunden schrieb cartis:

    Wenn ich wie in diesem Beispiel vewendet die Variable $SeparatedGroupList mit der "Dot-Notation" anspreche, dann komme ich mit FullName nicht weiter, anscheinend mache ich da was grundlegend falsch.

     

    Wir würden normalerweise nicht das Array mit allen Elementen ($SeparatedGroupList) benutzen, sondern die Schleifenvariable - in dem Beispiel wäre das also $Group. Demzufolge wäre dann $Group.FullName der Quell-Pfad der in der Schleife aktuell bearbeiteten Datei.

     

    Häufig hilft es, wenn man sich die jeweiligen Objekte und Properties einfach auf der Konsole ausgibt. Im Zweifel mit ein bissl "Eye-Candy" drumrum. 

     

    Beispiel:

    Get-ChildItem -Path "$env:SystemRoot\system32" -Filter *.dll | 
        Select-Object -Skip 10 -First 5 |
            ForEach-Object {
                "Der BaseName der aktuellen Datei ist '$($_.BaseName)', die Produktversion ist '$($PSItem.VersionInfo.ProductVersion)' und die Größe beträgt '$($_.Length)' Bytes"
            }

     

    Ich habe mir angewöhnt, bei solchen Ausgaben, den eigentlichen Inhalt der Variablen in einfache Gänsefüßchen einzuschließen. So würde man führende oder folgende Leerzeichen bemerken, falls das relevant ist. Und man sieht auch, wenn die Variable im Zweifel leer ist, weil dann ein doppeltes einfaches Gänsefüßchen ausgegeben wird. ;-) 

    • Like 1
  11. vor 7 Minuten schrieb cartis:

    Niemals in den nächsten Monaten hätte ich es soweit geschafft.

    Was hoffentlich heißt, dass Du trotzdem weitermachst ....  :achtung: :aha2:

     

    vor 8 Minuten schrieb cartis:

    Wie kann ich denn jetzt einen Wert ansprechen?

     

    Da gibt's generell zwei Ansätze:

    1. Indem Du die Funktion oder den Code ausführst, die oder der den Wert gewünschten ausgibt. Das ist normalerweise der Weg, wenn man einen Wert nur einmal braucht.

    2. Indem Du den gewünschten Wert in einer Variablen speicherst und diese statt des Wertes verwendest. Das ist der Weg, wenn man einen Wert mehrfach braucht.

     

    In PowerShell arbeiten wir mit Objekten und deren Eigenschaften. Wenn Du also einen Befehl ausführst und das Ergebnis-Objekt in der Variable $Objekt speicherst, kannst Du auf die Eigenschaft1 mit der sogenannten "Dot-Notation" $Objekt.Eigenschaft1 darauf zugreifen. Sollte das Ergebnis-Objekt mehr als eine Instanz enthalten, kann man mit einem Index die einzelnen Elemente adressieren - also z.B. $Objekt[0].Eigenschaft1.

     

    So, den Rest der Grundlagen holst Du Dir aber bitte aus einem Buch oder Tutorial oder Erklärvideo auf Youtube oder so. Es gibt im Netz zum Thema PowerShell mehr als ausreichend Material. Sehr viele Fragen - auch Anfängerfragen - werden z.B. auf StackOverflow beantwortet. Dort findest Du also schon vieles inklusive Beispielen erklärt.

×
×
  • Neu erstellen...