Jump to content

BOfH_666

Expert Member
  • Gesamte Inhalte

    2.036
  • Registriert seit

  • Letzter Besuch

Alle erstellten Inhalte von BOfH_666

  1. Wenn ich Dir was empfehlen dürfte: Tu Dir selbst einen Gefallen und schaff Dir die Grundlagen von Powershell mit einem Buch oder Kurs oder Online-Tutorial drauf - jedenfalls irgendwie geordnet und didaktisch aufbereitet. Mit ein bisschen rumspielen entgehen Dir vermutlich ein paar grundlegende Verfahren und Methoden und das führt eher zu Missverständnissen, Fehlern und Frustration. Ich hatte ja oben schon den MVA-Einstiegs-Kurs verlinkt - hier in diesem Thread findest Du noch ein paar mehr gute Quellen, um mit Powershell anzufangen: Beginner Sites and Tutorials.
  2. OK, dann stellen wir das Ganze wieder etwas um und nutzen Dukels Vorschlag … der hatte ja funktioniert … $QuellPfad = 'der Pfad den Du beackern möchtest' $ErsteBeliebigeCSVDatei = Get-ChildItem -Path $QuellPfad -Filter *.csv -File | Select-Object -First 1 | Select-Object -ExpandProperty FullName $Datum = (Get-Content -Path $ErsteBeliebigeCSVDatei)[1].split(';')[16] $ZipDatei = Join-Path -Path 'Pfad zum Verzeichnis in dem die Zip-Datei landen soll' -ChildPath ($Datum + '.zip') Start-Process -FilePath zip.exe -ArgumentList "$ZipDatei $QuellPfad\*.csv $QuellPfad\*.pdf" Get-Date | Out-File -FilePath 'Log-Datei incl. Pfad' -Append -Encoding utf8 Start-Process -FilePath outlook.exe -ArgumentList "/a $ZipDatei"
  3. Da Du nicht spezifiziert hast, aus welcher CSV-Datei das Datum ausgelesen werden soll, hab ich einfach mal den jetzigen Status Quo als Vorlage benutzt. Ich empfinde Powershell-Code immer viel weniger kryptisch als batch und für Leute mit Basis-Englisch-Kentnissen ansatzweise intuitiv. Es könnte also so aussehen: $DatumHeute = Get-Date -Format 'yyyyMMdd' $QuellPfad = 'der Pfad den Du beackern möchtest' $ZipDatei = Join-Path -Path 'Pfad zum Verzeichnis in dem die Zip-Datei landen soll' -ChildPath ($DatumHeute + '.zip') Start-Process -FilePath zip.exe -ArgumentList "$ZipDatei $QuellPfad\*.csv $QuellPfad\*.pdf" Get-Date | Out-File -FilePath 'Log-Datei incl. Pfad' -Append -Encoding utf8 Start-Process -FilePath outlook.exe -ArgumentList "/a $ZipDatei" Mit aktuellem Windows und Powershell (W10 und PS 5) könntest Du Dir das Zip-Tool auch noch sparen. Diese Funktionalität ist inzwischen eingebaut. Es wäre auch möglich die Zip-Datei aus der Powershell heraus zu versenden. Dann kannst Du das Alles per Aufgabenplanung starten und brauchst Dich in Zukunft nicht mehr manuell drum kümmern. Edit: Achja … ganz vergessen: Welche CSV-Datei soll denn dann als Quelle für Dein Datum dienen? … die Erste? … die Letzte? … die Kleinste? … die Größte? .. die Jüngste? … die Älteste? … usw. ;-) Achso … auch noch als zusätzliche Erklärung: Ich bin jetzt mal davon ausgegangen, dass die Zip-Datei auch gleich im Zielverzeichnis erstellt werden kann. Falls das nicht möglich ist, kann man das natürlich auch noch anpassen.
  4. Für Powershell gibt es so irrsinnig viele Quellen im Internet.... , kauf Dir doch einfach ein gutes Buch oder mach einen Online-Kurs. Wenn Du erst mal die Grundlagen drauf hast, erschließt sich der Rest quasi von ganz allein. Ein sehr guter und kostenloser Einstieg könnte das hier sein: https://mva.microsoft.com/en-US/training-courses/getting-started-with-microsoft-powershell-8276 ... und wenn Du mit irgendetwas nicht weiterkommst, hast Du immernoch dieses Forum hier .. und auch noch andere
  5. Da Powershell sowieso die neuere, modernere, mächtigere und von Microsoft auch in Zukunft noch unterstützte Technologie ist, würde ich auch empfehlen, Batch endlich in Rente zu schicken und es in reinem Powershell umzusetzen.
  6. Wenn es sowieso keine Header gibt, kannst Du auch einfach die erste Zeile einlesen, die entsprechende Stelle mittels SubString Methode rausfräsen und das einer Variable zuweisen. Also so ungefähr: $DatumsString = (Get-Content -Path 'voller Pfad zu Deiner CSV-Datei' | Select-Object -First 1 ).SubString(37,8)
  7. Was hast Du denn schon? Steht das Datum immer an der gleichen Stelle? Steht es wirklich in der 1. Zeile, also der Header-Zeile?
  8. Wenn Du das Ergebnis einer Variable zuweist, z.B. $Result, dann kannst Du mittels Subexpressions auf die einzelenen Properties zugreifen - also $Result.Name oder $Result.MacAddresses
  9. Ich glaub das geht einfacher: $OU = Choose-ADOrganizationalUnit $SCCMSource = Get-CimInstance -Namespace Root\SMS\Site_XXX -ClassName SMS_R_System -ComputerName XXXXXXX | Select-Object -Property Name,MacAddresses $ADSource = Get-ADComputer -Filter * -SearchBase $Ou.DistinguishedName | Select-Object -Property Name Compare-Object -ReferenceObject $SCCMSource -DifferenceObject $ADSource -Property Name -PassThru -IncludeEqual -ExcludeDifferent
  10. Machst Du bitte für ein neues Thema auch einen neuen Thread auf? Wenn Du remote auf einen anderen Computer zugreifst, siehst Du nur die "Umgebung" des Anwenders/Administrators, mit dem Du auf den remote Computer zugreifst. Dieser hat üblicherweise keine Netzwerkdrucker verbunden bzw. es wird beim remote Zugriff nicht das komplette Profile geladen in dem die Netzwerkdrucker verbunden sind.
  11. 1603 ist der Lieblingsfehler aller Software-Paketierer. Das ist ein Exit-Code von MSIEXEC und sagt: "Da war ein Fehler". Manchmal kann man, wenn man die Log-Dateien durchwühlt, noch den ein oder anderen zielführenden Hinweis finden. Nach meiner Erfahrung aber meistens eher nicht. Davon mal abgesehen, was ist falsch am Aufruf der DeInstallation über über die Setup.exe?
  12. Wenn Du schon mit CSV-Dateien arbeitest, solltest Du auch die cmdlets benutzen, die dafür gemacht sind. Das macht Dir das Leben leichter. Um mit den Daten einer CSV-Datei weiterzuarbeiten oder erneut zu arbeiten, ist es viel besser Import-CSV zu benutzen anstatt Get-Content. Dann arbeitest Du nicht mit "flachem" Text, sondern mit Arrays und Properties und brauchst es auch nachher nicht wieder aufwändig sortieren. Ich würde dann auch eher versuchen, die überflüssigen Daten soweit "vorne" wie möglich rauszufiltern … vielelicht so hier irgendwie: $PrinterListFileName = $env:COMPUTERNAME + ".csv" $hostAddresses = @{} Get-CimInstance -ClassName Win32_TCPIPPrinterPort | ForEach-Object { $hostAddresses.Add($_.Name, $_.HostAddress) } $PrinterList = Get-CimInstance -ClassName Win32_Printer | Where-Object {$_.Name -notmatch 'FreePDF|An OneNote|Fax|Microsoft XPS|#TYPE System.Management.Automation.PSCustomObject|Drucker-Name'} | ForEach-Object { [PSCustomObject]@{ 'Drucker-Name' = $_.Name 'IP-Adresse' = $hostAddresses[$_.PortName] 'Computer' = $env:COMPUTERNAME } } $PrinterList $PrinterList | Export-Csv -Path $PrinterListFileName -Encoding UTF8 -Delimiter ';' -NoTypeInformation
  13. Hallo, ich fände es richtig supi, wenn Du bitte beim nächsten mal den Code auch als Code formatierst. Dann lässt er sich leichter lesen und verstehen und lange Zeilen werden im Zweifelsfall auch nicht umgebrochen. ;) Deine Aufgabe würde ich so anfangen: $Path = '\\netclient273\d$\Temp' $Age = -30 $FileList = New-Object System.Collections.Generic.List[object] Get-ChildItem -Path $Path -File -Recurse -Force -ErrorAction SilentlyContinue | Where-Object {$_.LastAccessTime -le (Get-Date).AddDays($Age)} | ForEach-Object { $newobj = [PSCustomObject]@{ Date = (Get-Date).Date Name = $_.BaseName Path = $_.DirectoryName LastAccessTime = $_.LastAccessTime Length = $_.Length } $FileList.Add($newobj) #Remove-Item -Path $_.FullName -Force -ErrorAction SilentlyContinue } Die auskommentierte Zeile solltest Du dann natürlich noch ent-auskommentieren ... ;) Jetzt hast Du also den Ordner schon mal bereinigt und kannst dann mit den gesammelten Daten weiter verfahren, wie Du es gerne möchtest. Z.B.: $FileList | Format-Table -AutoSize um einfach schon mal zu gucken... oder ... $FileList | Export-Csv -Path 'Pfad zu Deiner Lieblings-CSV-Datei' -Delimiter ';' -Encoding UTF8 -NoTypeInformation -Append .... oder, oder, oder ...
  14. Ich glaub, ich habs noch nicht so ganz. :suspect: :schreck: :nene: Wenn Du sowieso Gruppen zuweisen möchtest, die dann nur lesen können sollen, wenn ich das bis dahin richtig verstanden habe, dann ist doch völlig egal, wer bis dahin irgendwelche anderen Rechte hatte. Du ersetzt ALLE bisher existierenden Rechte durch die von Dir gewünschten neuen und basta, oder? ... und das geht, wie zahni schon geschrieben hatte, mit icacls. .... oder fehlt mir doch noch 'ne Ecke?
  15. Die unveränderte Ausgabe des Befehls Get-Process sieht aber normalerweise genauso aus, wie das was per Out-File in eine Datei exportiert wird. Versuch mal ... Get-Process -OutVariable Prozesse | Out-File -FilePath "C:\Users\Documents\Test2\Neu.txt" -Encoding ASCII -Width 100 ; $Prozesse Davon unabhängig kann man natürlich die Ausgabe so gestallten, dass die Informationen enthalten sind, die man haben möchte. Für strukturierte Daten bietet sich natürlich CSV oder XML viel eher an als reiner Text.
  16. Das kommt auf Deine Scripting-Erfahrung an und was Du dann danach mit den ausgelesenen Daten anstellen willst. Wenn es zwingend in Excel sein soll, kommt eigentlich nur VBA in Frage. Wenn Du aber bei der "Laufzeitumgebung" flexibel bist, könntest Du auch Powershell nehmen (das würde ich favorisieren, weil ich kein VBA drauf hab ;) ).
  17. Üblicherweise zeigt Get-Hotfix nur die "richtigen" Windows-Updates an. Keine Office-Updates oder für irgendwelche C++ - Runtimes oder so.
  18. Hmmm ... bitte den Code als Code formatieren! Das macht uns und auch Dir das Leben leichter. ;) Ich würde es so anfangen: $inFile = "C:\PowerTest\testinput.csv" $Drunter = "C:\PowerTest\out_File_Drunter.csv" $Drueber = "C:\PowerTest\out_File_Drueber.csv" $Drin = "C:\PowerTest\out_File_Drin.csv" Import-Csv -Delimiter ',' -Encoding Default -Path $inFile | ForEach-Object { If([INT]$_.Long -le 10){ $_ | Export-Csv -Path $Drunter -Delimiter ';' -NoTypeInformation -Append } ElseIf([INT]$_.Long -gt 10 -and [INT]$_.Long -le 20){ $_ | Export-Csv -Path $Drin -Delimiter ';' -NoTypeInformation -Append } Else{ $_ | Export-Csv -Path $Drueber -Delimiter ';' -NoTypeInformation -Append } } ... Du wolltest ja schließlich 3 Bedingungen prüfen. Noch'n generellen Tipp: Unnötige Kommentare kannst Du weglassen. Jeder der Powershell kennt, weiß was Import-CSV macht, oder was eine Variablenzuweisung ist ... usw.
  19. Na zeig doch mal her .... was hast Du denn schon? Du kannst den Code hier (entsprechend als Code formatiert) posten, dann sehen wir bestimmt, wo's klemmt. ;)
  20. Ganz einfach: Du liest die CSV-Datei ein mit Import-CSV, dann vergleichst Du die gewünschten Werte mit Deinen Vorgaben, entweder mit if oder switch und dann benutzt Du Export-CSV, um die entsprechenden Zeilen jeweils in eine eigene Datei zu schreiben. Was hast Du denn schon? bzw. Wo steckst Du fest? Empfehlung: Du solltest Dir die Hilfe der einzelnen cmdlets dringend komplett durchlesen, inclusive der Beispiele und dann ein wenig "rumspielen" - dabei lernt man meiner Meinung nach am besten.
  21. Ich versuche das nochmal präzise zu formulieren: Du möchtest also alles entfernen, was älter ist als 14 Tage und zusätzlich die eventuell noch existierenden VIB-Dateien, die älter sind als die älteste VBK-Datei die (noch) jünger ist als 14 Tage, richtig? Die zweite Möglichkeit wäre: Du möchtest alles entfernen, was älter ist als 14, es sei denn, die älteste Datei ist keine VBK-Datei. Dann sollen noch alle VIB-Dateien aufbewahrt werden, bis zur nächsten VBK-Datei, richtig? Beides mit Powershell kein Problem. ;) :wink2:
  22. Woran erkennt man denn zusammengehörige Dateien? ... am Namen? Wenn das eindeutig zu bestimmen ist, brauchst Du doch nur das Alter der entsprechenden "Hauptdatei" ermitteln und bei den zugehörigen Dateien nicht nach dem Alter entscheiden, sondern nach dem Namen, ob sie weg können oder nicht.
  23. Wenn Du eine Fehlermeldung bekommst, wäre es natürlich für die Fehlerbeseitigung hilfreich, zu wissen, welche Fehlermeldung Du bekommst. Für sowas reicht üblicherweise ein Einzeiler … ungefähr so: Get-ChildItem -Path '\\wechselplatte\Sicherung\*' -Include *.vbk,*.vib | Where-Object ($_.CreationTime -lt ((Get-Date).AddDays(-14))) | Remove-Item -WhatIf
  24. ... oooops, sorry. Mein Fehler. Ich hatte angenommen, dass wir alle schon im Jahr 2017 angekommen wären. ;) :D :cool: :p :schreck:
×
×
  • Neu erstellen...