Jump to content

BOfH_666

Expert Member
  • Gesamte Inhalte

    2.035
  • Registriert seit

  • Letzter Besuch

Alle erstellten Inhalte von BOfH_666

  1. Lass doch mal bitte das Write-Host weg und teste es mit einem (oder mehreren) Test-User.
  2. Also bei mir funktioniert das hier : $users = Get-ADUser -SearchBase "OU=x,OU=y,DC=DOMAIN,DC=LOCAL" -Filter * -Properties Department foreach ($user in $users) { Set-ADUser -Identity $user.SamAccountName -Add @{extensionAttribute1 = "$($User.Department)" } }
  3. Was soll diese Zeile denn bewirken? Write-Host Set-ADUser -Identity $user.SamAccountName -Add @{extensionAttribute1="$String"} Ich würde das "Write-Host" an dieser Stelle entfernen.
  4. Warum? Und warum remote? Und warum machst Du es dann nicht einfach?
  5. 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. ... hatte ich aber doch schon ergänzt!? ... also zumindest vor Deiner Nachricht
  7. Bitte den Code so ausführen, wie ich ihn gepostet hatte!!!! Und das Ergebnis Array ist dann natürlich $ergebnis[3] ... usw ...
  8. Vielleicht isses einfacher, wenn Du es als Code siehst: $ergebnis = Import-Csv -Path C:\temp\Test.csv -Header 'Nachname','Vorname','Email','PersonalNummer' -Delimiter ';' | Select-Object -Skip 5 Aber nochmal: .... Nils Ansatz wäre der um Welten professionellere!!
  9. 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: 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.
  10. Es gibt ein Modul, mit dem Du Excel-Dateien direkt verarbeiten kannst: ImportExcel. Das macht die Sache eventuell leichter. Dafür gibt es beim cmdlet Import-Csv den Parameter -Header, mit dem man eigene Header hinzufügen kann. 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)
  11. 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?
  12. 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.
  13. Na, so toll war sie dann wohl offenbar nicht ... Das ist üblicherweise nicht nötig. Wenn man's doch unbedingt möchte, dann ganz normal mit "$MeineNeueSupiVariable = $Group.FullName". 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. 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.
  14. Wie wäre es, die Zugriffsrechte entsprechend zu gestallten, sodass nur Personen schreibenden Zugriff auf das Verzeichnis haben, die wissen was sie tun?
  15. Was hoffentlich heißt, dass Du trotzdem weitermachst .... 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.
  16. Es gibt einen Dokumentenschlüssel? Diese Information ist neu. Es sieht für mich so aus, als würde es am Ende immer wieder darauf hinauslaufen, dass Du die Dateien abhängig von ihrer Namensstruktur behandeln willst. Du hast also einen Ordner mit einem Haufen Dateien, die zum Teil ähnliche Namen haben und sich nur anhand der Versionsnummer unterscheiden. Diese Grüppchen sammelst Du mit der bereits erarbeiteten Logik zusammen. Wenn man das richtig macht, hat man bereits alle Infos separiert, die man für die weiteren Schritte braucht. In jeder dieser Gruppen hast Du jetzt als Elemente den Basis-Namen (den Dokumentenschlüssel arbeiten wir auch gleich mit ein) und die angehängte Versionierung. Die Angehängte Versionierung liegt aber noch nicht als "Zahl" sondern als "String" vor. Um sie zuverlässig sortieren zu können, müssen wir sie in eine Zahl wandeln und dann können wir die "Letzte" ermitteln. So hast Du die Datei ermittelt, die Du dann schließlich kopieren willst. (Achja, ich hab mal "meinen" Test-Pfad drin gelassen - so passt die Ausgabe zum Code ) $Path = 'D:\sample\Work' $Filter = '*UDE_Q_*.pdf' $FileList = Get-ChildItem -Path $Path -Filter $Filter | Select-Object -Property *, @{Name = 'PartlyFileName'; Expression = { ($_.BaseName -split '_')[0..3] -join '_' } }, @{Name = 'VersionINT' ; Expression = { [int]($_.BaseName -split '_')[4] } }, @{Name = 'DocumentKey' ; Expression = { ($_.BaseName -split '_')[2] } } $SeparatedGroupList = $FileList | Group-Object -Property PartlyFileName Hiermit hast Du alles eingesammelt, was Du brauchst. Jetzt geht's ans Sortieren: foreach ($Group in $SeparatedGroupList) { $Group.Group | Sort-Object -Property VersionInt | Select-Object -Last 1 -Property PartlyFileName, DocumentKey, VersionInt, FullName } Der Schnipsel ist quasi nur zur visuellen Kontrolle. Mit meinen Beispiel-Dateinamen sieht die Ausgabe so aus: PartlyFileName DocumentKey VersionINT FullName -------------- ----------- ---------- -------- UDE_Q_AF0001_Testdokument AF0001 4 D:\sample\Work\UDE_Q_AF0001_Testdokument_04.pdf UDE_Q_AF0002_Testdokument AF0002 3 D:\sample\Work\UDE_Q_AF0002_Testdokument_03.pdf UDE_Q_AF0003_Testdokument AF0003 1 D:\sample\Work\UDE_Q_AF0003_Testdokument_01.pdf UDE_Q_FA0001_Testdokument FA0001 2 D:\sample\Work\UDE_Q_FA0001_Testdokument_02.pdf UDE_Q_FA0002_Testdokument FA0002 4 D:\sample\Work\UDE_Q_FA0002_Testdokument_04.pdf UDE_Q_FA0003_Testdokument FA0003 1 D:\sample\Work\UDE_Q_FA0003_Testdokument_01.pdf Du hast jetzt also die jeweils "letzte" Datei aus jeder Gruppe, deren kompletten Pfad, welchen Du fürs Kopieren brauchst, den PartlyFileName, welchen Du als Ziel-DateiName benutzen kannst, und den Dokumentenschlüssel, welchen Du für die Entscheidung benutzen kannst, wohin die Datei kopiert werden soll. Also statt der Ausgabe auf der Konsole, baust Du an der Stelle eine Bedingung ein, die das Kopier-Ziel anhand des Dokumentenschlüssels festlegt, baust den gewünschten Ziel-Pfad mittels Join-Path zusammen und Kopierst die Datei ans Ziel ..... fertig. Wenn Du Dir das Leben sogar noch etwas einfacher machen möchtest, kannst Du die Zielpfade für die verschiedenen Dokumentenschlüssel im letzten Pfadelement quasi gleich dem Dokumentenschlüssel machen. Dann könntest Du Dir die Abfrage der Bedingung sparen und einfach den Dokumentenschlüssel als Bestandteil des Zielpfades benutzen.
  17. Supi. Sieht dufte aus. ... aber das ist ja nur die halbe Miete, oder? Wenn ich mir nochmal den gepimpten Screenshot angucke, den Du vorher gepostet hattest, willst Du ja nicht nur einen Ordner beackern, sondern 4 oder 5. Und ging es Dir bei der Prüfung der Dateien wirklich um das "Datei-Alter" oder eher um die angehängte Versionierung? Wenn es um das Alter geht, was passiert mit gleichnamigen Dateien, die aber unterschiedliche Änderungsdaten haben?
  18. ... is ja nich so, als gäbe es sowas gar nicht mehr ... https://www.nokia.com/phones/en_int/nokia-150 Falls Interesse besteht ... gibt's bei Amazon für unter 50 Euronen ... vielleicht spricht man dann auch wieder öfters miteinander ...
  19. Na, Du wolltest doch die verschiedenen Versionen, abhängig von der angehängten Versionsnummer in verschiedene Ordner kopieren/verschieben, oder? Das ist jetzt die Stelle dafür. Und dafür wäre jetzt vielleicht ...
  20. OMG ... jetzt geht die übliche REGEX-Haarspalterei los ... .. .eigentlich haben wir dafür zu wenig Info von Dirk. Also denn ... angenommen der Dateiname ist länger und komplexer ... $BaseName = 'BlaKeksDateiG1234undsoweiterg12349876Ende' $BaseName -match '(?<Prefix>.*)(?<GNumber>G\d+)(?<Suffix>.*)' $Matches ... liefert ... Name Value ---- ----- Suffix Ende GNumber g12349876 Prefix BlaKeksDateiG1234undsoweiter 0 BlaKeksDateiG1234undsoweiterg12349876Ende Die gewünschten Bestandteile sind enthalten, Prefix und GNumber liefern aber nicht die Ergebnisse, die laut Frage erwartet werden.
  21. Genau. Darum geht es Dir ja schließlich. Du hast jetzt die Dateien, die sich nur in der Versionsnummer unterschieden jeweils in einer eigenen Gruppe. Von da aus kannst Du - gemäß Deinem Ablaufplan - weitermachen.
  22. Keine Angst .... an der Stelle waren wir alle mal ... Wie Nils schon angeregt hatte, ist es - gerade bei etwas komplexeren Aufgabenstellungen - hilfreich, wenn man sich das Ganze mal aufschreibt/visualisiert. Am bestem mit einem Ablaufdiagramm/Entscheidungsbaum. Das ist sehr praktisch. Nicht immer sind die Tipps, die man bekommt, auch wirklich hilfreich. Auch wir können mal falsch liegen. Am Ende entscheidest Du, welche Hilfe Dich weiterbringt und welche Tipps zu benutzen möchtest oder nicht. Die Möglichkeit, die Dateinamen an den Unterstrichen aufzutrennen, heißt ja nicht zwingend, dass das genau so auch hilfreich ist. In Deinem Fall willst Du ja vermutlich nur den variablen Teil abtrennen. Dafür kann man auch andere Methoden benutzen, wenn man damit besser zurechtkommt. Ich bin jetzt mal von den im ersten Beitrag geposteten Dateinamen ausgegangen (UDE_Q_AF0001_Testdokument.docx) und davon, dass die Versionierung auch durch einen Unterstrich vom Rest des Dateinamens abgetrennt ist. Hier mal meine Idee: $Path = 'C:\Test\Dokumenten_Container' $Filter = '*_AF0*.pdf' $FileList = Get-ChildItem -Path $Path -Filter $Filter | Select-Object -Property *, @{Name = 'PartlyFileName'; Expression = {($_.BaseName -split '_')[0..3] -join '_'}} $FileList | Group-Object -Property PartlyFileName Das Ergebnis sollte dann ungefähr so aussehen: Count Name Group ----- ---- ----- 5 UDE_Q_AF0001_Testdokument {@{PSPath=Microsoft.PowerShell.Core\FileSystem::C:\Test\Dokumenten_Container\UDE_Q_AF0001_Testdokument_00.pdf;... 3 UDE_Q_AF0002_Testdokument {@{PSPath=Microsoft.PowerShell.Core\FileSystem::C:\Test\Dokumenten_Container\UDE_Q_AF0002_Testdokument_02.pdf;... 2 UDE_Q_AF0003_Testdokument {@{PSPath=Microsoft.PowerShell.Core\FileSystem::C:\Test\Dokumenten_Container\UDE_Q_AF0003_Testdokument_00.pdf;...
  23. Wenn es hier um Scripting geht und Code, ist es keine gute Idee, Sachen nur zu beschreiben. Du gehst ja auch nicht zur KFZ-Werkstatt und beschreibst das Problem, das Du mit Deinem Auto hast - Du bringst das Auto mit. Also poste doch einfach den Code, den Du benutzt, eventuelle Fehlermeldungen, die Du bekommst und eine kurze Erklärung, was Deiner Meinung nach nicht funktioniert wie erwartet. Ich hatte Dir weiter oben eine Doku verlinkt, die den Operator "-split" erklärt. Da sind auch immer Beispiele dabei. Probier ruhig das ein oder andere und "spiel ein bissl rum" mit den Befehlen. Man lernt eine komplexe Technologie wie PowerShell nicht in 2 Stunden. 'Das_hier_ist_ein_Beispiel' -split '_'
  24. Na das hättest Du auch gleich sagen können. $BaseName = 'DateiG1234' $BaseName -match '(?<FesterTeil>Datei)(?<VariablerTeil>G\d{4})' $NewBaseName = $Matches.VariablerTeil + $Matches.FesterTeil | Out-Null $NewBaseName
  25. ... ich war mir da nicht ganz sicher ... deshalb frug ich lieber nochmal nach. Ich konnte mir nicht erklären, warum man das an dieser Stelle auf diese Weise abkürzen sollte.
×
×
  • Neu erstellen...