derwowusste
Goto Top

Powershell Voodoo - Cacheproblem?

Moin Kollegen.

Nein, kein Voodoo, kein Feng-Shui, nur der übliche Ärger mit (vermutlich) einem Bug.
Wie kann es bitte sein, dass ein Skript mir eine Variable ausgibt mit
Nutzer1
Nutzer2
aber dann bei der Weiterverarbeitung auch Nutzer3 mitnimmt?

Also: Variable wird gebaut:
$names=(gci $path).name
und in folgendem Befehl auch korrekt ausgegeben:
foreach ($name in $names) {if ((test-path -path "$path\$name\file.txt") -eq $false) {echo $name}}  
aber dann wird falsch weitergemacht; Nutzer3 kommt hinzu:
foreach ($name in $names) {if ((test-path -path "$path\$name\file.txt") -eq $false) {Send-MailMessage -From 'bla@blub' -To "$name@wurst.de"-Subject "Betreffzeile" -SmtpServer Mailserver -Body "test"}}  

Das Witzige: es ist immer der selbe Nutzer3, der hinzukommt, alle anderen sind stets korrekt.
Nutzer3 war beim allerersten Lauf des Skriptes auch korrekterweise dabei, dann wurde aber die zu prüfende Datei angelegt und seitdem darf das nicht passieren (und die zweite Zeile hier gezeigte Zeile macht es ja auch richtig).

Was ist das bitte?

Content-Key: 22616951084

Url: https://administrator.de/contentid/22616951084

Printed on: May 21, 2024 at 21:05 o'clock

Member: Cleanairs
Cleanairs Oct 13, 2023 at 10:56:31 (UTC)
Goto Top
Das Problem liegt daran, dass die dritte Zeile die Liste der Namen noch einmal kopiert. Dies führt dazu, dass Nutzer3 zweimal in der Liste enthalten ist.

Um das Problem zu beheben, musst du die Liste der Namen nicht kopieren. Du kannst die foreach-Schleife so ändern, dass sie die Liste direkt verwendet.

Versuch mal:

$names = (gci $path).name

foreach ($name in $names) {
  if ((test-path -path "$path\$name\file.txt") -eq $false) {  
    Send-MailMessage -From 'bla@blub' -To "$name@wurst.de"-Subject "Betreffzeile" -SmtpServer Mailserver -Body "test"  
  }
}
Member: DerWoWusste
DerWoWusste Oct 13, 2023 at 11:01:45 (UTC)
Goto Top
Du wirst lachen, so sieht mein Skript schon aus. Ich habe Zeile 2 nur zu Diagnosezwecken eingefügt.
Mitglied: 7907292512
7907292512 Oct 13, 2023 updated at 11:52:30 (UTC)
Goto Top
Da sind ein paarFehler drin, es fehlt bspw. die Angabe des Parameters -Directory damit nur Ordner und keine Dateien damit aufgelistet werden , besser so
foreach ($dir in Get-ChildItem -LiteralPath $path -Directory) {
  if (!(test-path -LiteralPath "$($dir.Fullname)\file.txt")) {    
    Send-MailMessage -From 'bla@blub' -To "$($dir.Name)@wurst.de"-Subject "Betreffzeile" -SmtpServer Mailserver -Body "test"    
  }
}
Gruß Sid.
Member: Cleanairs
Cleanairs Oct 13, 2023 at 11:22:20 (UTC)
Goto Top
Und so Doppelungen rausschmeißen?

$names = (gci $path).name | sort | uniq

foreach ($name in $names) {
  if ((test-path -path "$path\$name\file.txt") -eq $false) {  
    Send-MailMessage -From 'bla@blub' -To "$name@wurst.de" -Subject "Betreffzeile" -SmtpServer Mailserver -Body "test"  
  }
}
Member: TK1987
TK1987 Oct 13, 2023 at 11:23:58 (UTC)
Goto Top
Moin,

ich habe bei Test-Path auch schon des öfteren merkwürdiges Verhalten festgestellt.

Versuche mal, ob bei der Exists-Methode der File-Klasse das selbe Problem auftritt
if (![System.IO.File]::Exists("$path\$name\file.txt")) {...}  

Gruß Thomas
Member: DerWoWusste
DerWoWusste Oct 13, 2023 at 11:35:50 (UTC)
Goto Top
Ich kann die Kommentare allesamt versuchen, nachvollziehen kann ich die Gedanken noch nicht.
Versuche mal, ob bei der Exists-Methode der File-Klasse das selbe Problem auftritt
Jeder andere Befehl macht doch damit, was er soll, selbst send-mailmessage, wenn ich die Mails alle an mich senden lassen und $name nur in den Betreff packe, arbeitet korrekt!

Ich werde die Tests erst nach Feierabend machen, da die Leute nicht mit Mails genervt werden sollen

es fehlt die Angabe des Parameters -Directory damit nur Ordner und keine Dateien...
dort sind keine Dateien.
Doppelungen rausschmeißen
Was für Doppelungen? Es gibt keine.
Member: DerWoWusste
Solution DerWoWusste Oct 13, 2023 updated at 16:13:16 (UTC)
Goto Top
Oh weh.
Lösung: die Syntax war's nicht.
Der ausführende Nutzer dieses Tasks durfte in diesem einen Verzeichnis von Nutzer3, was ein anderer, der in das System nicht ausreichend eingeweiht war, manuell angelegt hat und was dadurch andere Rechte trug, nichts lesen und dachte dementsprechend "keine Datei da". Test-path macht eben keinen Unterschied zwischen "Zugriff verweigert" und "existiert nicht".

Zeit für's WE

Wünsche euch ein schönes Selbiges und danke für die Tipps.
Member: DerWoWusste
DerWoWusste Oct 17, 2023 at 18:40:31 (UTC)
Goto Top
Dennoch bleibt mir unklar, warum der genannte Umstand Zeile 3 beeinflusst hatte, aber nicht Zeile 2.
Hat jemand eine Idee?