PowerShell eindeutiger abgleich

Alfredo64

Cadet 3rd Year
Registriert
Jan. 2020
Beiträge
43
Hallo zusammen,

ich habe Momentan den Fall, das ich einen Ordner habe in dem die Ordner sind nach denen Geprüft wird also die Referenz Ordner.
Dann habe ich noch ganz viele Ordner die auf die Ordner Struktur geprüft werden allerdings möchte ich nur die ausgegeben bekommen die dort zu viel sind nicht die dort fehlen.


$Differenze = die zu Prüfende Ordner Struktur
$Probe ist die Referenz Ordner Struktur

Momentan Prüfe ich das folgendermaßen:
PowerShell:
$Diferenz = (Compare-Object $Standart $Probe).InputObject

     #Differenz
    if($Diferenz){
        Differenz #Speicherrelevant
      #Ausnahmen test
    foreach($Diferenz in $Diferenz){
        Ausnahmen #nicht passende Ordner prüfung
        }
    }
 
Kommt da noch was?^^ Zum einen hast du keine Frage gestellt, ein Problem kann ich auch nicht rauslesen.
Abgesehen davon ist deine Erklärung auch etwas mager um ehrlich zu sein. Zumindest ich verstehe nicht, was du überhaupt machen willst. Ergänze das doch noch etwas und garniere es wenn möglich noch mit einem kleinen Screenshot.
 
@burglar225

Ja da kommt noch was aber da ist ziemlich umfangreich und kaum relevant. Dann versuche ich es nochmal zu genauer zu beschreiben. Ich habe zwei Ordner einen Ordner mit der erlaubten Ordner Struktur (Inhalt). Und dann habe ich noch einen anderen Ordner in dem vielleicht mehr Ordner sind. Und jetzt sollen die Ordner-namen ausgegeben werden die dort laut dem Referenzordner nicht rein gehören (zu viel sind). Soweit klappt alles jetzt geht es mir darum, dass mir auch die ausgegeben werden die dort laut dem Referenzordner fehlen, dass möchte ich nicht da das für meinen Anwendungsfall keine Rolle spielt.

Falls Sachen immer noch unklar sind versuche ich es gern noch zu Erklären.

Falls sich jemand doch noch für das Komplette interessieren sollte hier:
Ja da kann man vieles einfacher und besser lösen. Das war mein erstes etwas umfangreicheres Projekt.

PowerShell:
#Verzeichnisse:
$Ordnerstruktuverzeichnis = '*'
$Größenangaben = '*'
$Ordnervorlage = '*'
$CSV_ablage = '*'

$Ordner = Get-ChildItem -Path "$Ordnerstruktuverzeichnis\Cursor-CRM_Port*" -Name -Directory

Function Email{
# Daten für den Mail Versand

$EmailFrom = “*”

$EmailTo = “*”

$Subject = "*”

$Body = $überflüssig + "`r" + $abweichung +  "`r" + $Kapazität

$SMTPServer = “smtp.outlook.com”

# Passwort:

$secure2 = get-content **** | convertto-securestring -key (1..16)
$UnsecurePassword = (New-Object PSCredential "username",$secure2).GetNetworkCredential().Password
#SMTP und Mail-Send

$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)

$SMTPClient.EnableSsl = $true

$SMTPClient.Credentials = New-Object System.Net.NetworkCredential(“**”, “$UnsecurePassword”);
$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)
}
Function Kontrolle(){
$Ordnertest = Get-ChildItem -Path "$Ordnerstruktuverzeichnis" -Name -Directory
$Ordnertest1 = Get-ChildItem -Path "$Ordnerstruktuverzeichnis\Cursor-CRM_Port*" -Name -Directory
$dervergleich = (Compare-Object $Ordnertest $Ordnertest1).InputObject

if($dervergleich){

$newrow = New-Object PSObject -Property @{
      "Ordner" = ("$dervergleich"+$_)
      }
   $csvlist += $newrow

$csvlist | ft -AutoSize
$csvlist | export-csv -path "$CSV_ablage\überflüssig\überflüssig.csv" -notypeinformation -Append
}
} #Wenn es in der Obersten Ordner struktur abweichungen gibt wird eine CSV erstellt.
Function Differenz(){
$sum = (Get-ChildItem -Path "$Ordnerstruktuverzeichnis\$Ordner"  -Force -Recurse -ErrorAction SilentlyContinue | Measure-Object -ErrorAction SilentlyContinue -Property Length -Sum).Sum
         
   #speichergröße prüfen
   $Speicherrelevant = (Compare-Object $Diferenz $Probe).InputObject
   foreach($Speicherrelevant in $Speicherrelevant){
         
    test #die größe wierde überprüft
      }
} #Es wird nachgeschat ob es relevant ist auf größe zu prüfen oder ob der Ordner so oder so da nicht hin darf.
Function test(){
    $größentest = (Get-ChildItem -Path "$Ordnerstruktuverzeichnis\$Ordner\$Speicherrelevant"  -Force -Recurse -ErrorAction SilentlyContinue | Measure-Object -ErrorAction SilentlyContinue -Property Length -Sum).Sum
    $maxgrößen = Get-Content -Path "$Größenangaben\$Speicherrelevant.txt"
    $umrechnung = $größentest / 1GB
       if($umrechnung -ge $maxgrößen){
   
    $speicherrelevant1 = Test-Path -Path $Ordnerstruktuverzeichnis\$Ordner\$speicherrelevant\*.ignor
    if($speicherrelevant1){
    }
    else{
     $csvlist =@()
    $newrow = New-Object PSObject -Property @{
        Unterordner= ($Speicherrelevant+$_)
        Kapazitaet = ($umrechnung+$_)
        Ordner     = ($Ordner+$_)
   }
    $csvlist += $newrow
    $csvlist | ft -AutoSize
    $csvlist | export-csv -path "$CSV_ablage\Kapazität\Kapazität.csv" -notypeinformation -Append
    }}
} #Testet die größen idem sie mit den Reverenzen abgeglichen werden und falls es zu groß ist wird eine CSV erstellt.
Function Ausnahmen(){
  $testverzeichnis = "$Ordnerstruktuverzeichnis\$Ordner\$Diferenz\..ignore"
        If (Test-Path $testverzeichnis){
     }
    else{
     
     
      foreach($Diferenz in $Diferenz){
$newrow = New-Object PSObject -Property @{
      Ordnerdifferenz = ("$Ordner,$Diferenz"+$_)
   }
   $csvlist += $newrow

$csvlist | ft -AutoSize
$csvlist | export-csv -path "$CSV_ablage\abweichung\abweichung.csv" -notypeinformation -Append
        }
    }
} #Prüft die Unterordner auf nicht erlabute Ordner und ob sie eine .ignor Datei beinhalten. Falls er keine ignor hat wird ein CSV erstellt.

Remove-Item "$CSV_ablage\abweichung\abweichung.csv" -ErrorAction SilentlyContinue #Löscht das alte CSV
Remove-Item "$CSV_ablage\Kapazität\Kapazität.csv" -ErrorAction SilentlyContinue #Löscht das alte CSV
Remove-Item "$CSV_ablage\überflüssig\überflüssig.csv" -ErrorAction SilentlyContinue #Löscht das alte CSV


foreach($Ordner in $Ordner){
$Standart = Get-ChildItem -Path "$Ordnervorlage" -Name -Directory
$Probe = Get-ChildItem -Path $Ordnerstruktuverzeichnis\$Ordner\ -Name -Directory
$Diferenz = (Compare-Object $Standart $Probe).InputObject

     #Differenz
    if($Diferenz){
        Differenz #Speicherrelevant
      #Ausnahmen test
    foreach($Diferenz in $Diferenz){
        Ausnahmen #nicht passende Ordner prüfung
        }
    }
}
Kontrolle

if((get-childitem *).count -eq 0){ $abweichung = "" }else{ $abweichung =  "Es wurde eine abweichung gefunden"}
if((get-childitem *).count -eq 0){ $überflüssig = "" }else{$überflüssig = "Es wurden unerwünschte Ordner gefunden"}
if((get-childitem *).count -eq 0){ $Kapazität = "" }else{ $Kapazität = "Es wurde Kapazität gefunden"}

if($überflüssig -or $abweichung -or $Kapazität){
Email
} #Wenn eine CSV erstellt wurde wird hier der Email versand angestoßen
 
Zuletzt bearbeitet:
Meinst du sowas in der Art ?

PowerShell:
$base = Get-ChildItem -Recurse -Path C:\Standard\ -Name -Directory
$test = Get-ChildItem -Recurse -Path C:\Test\ -Name -Directory

$erg = (Compare-Object -DifferenceObject $test -ReferenceObject $base)
$erg |  Where-Object 'SideIndicator' -contains '=>' | Select-Object 'InputObject'
 
  • Gefällt mir
Reaktionen: Alfredo64
@burglar225

Danke für deine Antwort wir kommen der Sache schon näher. Hier ist nur das Problem, dass es wieder so ist, dass ich das ausgegeben bekomme, was ich aber genau nicht möchte. Denn ich möchte nicht wissen was fehlt sondern was zu viel an Ordnen dort ist.
 
@Turian

vielen Dank genau sowas habe ich gesucht.!
Ergänzung ()

@burglar225

nein leider geht es nicht wenn ich es einfach tausche dann habe ich immer-noch die selbe Ergebnismenge und andersherum aber trotzdem vielen Dank für deine Bemühungen.
 
Das Problem ist doch, wenn ich es richtig verstanden habe, dass Ordner fehlen dürfen, diese also unrelevant sind. Das Problem sind die, welche gar nicht existieren sollten, da bringt das drehen nichts. (Ausser ich verdrehe gerade was)
 
  • Gefällt mir
Reaktionen: Alfredo64
@Turian

ich hätte nochmal eine Frage. Ich bin leider erst heute dazu gekommen es ausführlich zu testen. Und dabei ist mir Folgendes aufgefallen. ich brauche als Ausgabe nur den Ordner Namen. Ich bekomme allerdings das ausgegeben: "@{InputObject=backup}"

Ich habe mich jetzt schon ein bisschen versucht und auch auf der Seite von Microsoft nachgelesen allerdings bekommen ich es nie ganz in den Griff.

kannst du mir da vielleicht weiterhelfen?

meine Code sieht folgendermaßen aus:

PowerShell:
$Diffoerenz = (Compare-Object -DifferenceObject $Probe -ReferenceObject $Standart)
$Differenz = $Diffoerenz | Where-Object 'SideIndicator' -contains '=>' | Select-Object 'InputObject'
 
Den -Recurse Parameter zum rekursiven abfragen hast du beim get-childitem mit eingebaut ? Oder kommt mehr wie die eine Zeile ?
Variablen passen alle ?
 
@Turian

Den -Recurse Parameter habe ich weg gelassen, da ich nur in dem Ordner Prüfen möchte den ich angegeben habr und nicht in weiter Ordner hinein gehen.
Die Variablen passen alle.
 
Hast du noch mehr geändert oder haben $standart & $probe noch die gleichen angaben wie im Skript ?
Wie verhält es sich, wenn du $Ordner leicht änderst ?
PowerShell:
$Ordner = Get-ChildItem -Path $Ordnerstruktuverzeichnis -Include Cursor-CRM_Port* -Name -Directory
 
Zuletzt bearbeitet:
Nein ich habe nichts mehr geändert. Wenn Man $Probe ausgeben lässt kommt das dabei raus:
backup
client
documents
jboss
log

und bei $Standart Folgendes:
client
clientlog
documents
jboss
log
server
tools
webclient

und ich bäuchte jetzt als Ausgabe eigentlich nur:

da das der einzige Ordner ist der oben vorhanden ist aber unten nicht.

allerdings bekomme ich:
@{InputObject=backup}
 
@Turian

das komplette Skript sieht folgendermaßen aus(auf das beschränkt was mit der Abfrage irgendwie zusammenhängt):

PowerShell:
$Ordnerstruktuverzeichnis = 'C:\Cursor' #
$Größenangaben = 'C:\Tools\esi\speicher' #
$Ordnervorlage = 'C:\Tools\esi\Referenz' #
$CSV_ablage = 'C:\Tools\esi\Ergebnisse'   #

$Ordner = Get-ChildItem -Path "$Ordnerstruktuverzeichnis\Cursor-CRM_Port*" -Name -Directory

Function Email{
# Daten für den Mail Versand

$EmailFrom = “***”

$EmailTo = “***”

$Subject = "Zungagsdaten”

$Body = $überflüssig + "`r" + $abweichung +  "`r" + $Kapazität + "`r"

$SMTPServer = “smtp.outlook.com”

# Passwort:

$secure2 = get-content **** | convertto-securestring -key (1..16)
$UnsecurePassword = (New-Object PSCredential "username",$secure2).GetNetworkCredential().Password
#SMTP und Mail-Send

$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)

$SMTPClient.EnableSsl = $true

$SMTPClient.Credentials = New-Object System.Net.NetworkCredential(“linus.kliegel@ecoplan.de”, “$UnsecurePassword”)
$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)
} #versendet nur die eine Email.
Function Ausnahmen(){
  $testverzeichnis = "$Ordnerstruktuverzeichnis\$Ordner\$Differenz\..ignore"
        Write-Host $testverzeichnis -BackgroundColor Red
        If (Test-Path $testverzeichnis){
     }
    else{
   
   
      foreach($Differenz in $Differenz){
$newrow = New-Object PSObject -Property @{
      Ordnerdifferenz = ("$Ordner,$Diferenz,"+$_)
   }
   $csvlist += $newrow

$csvlist | ft -AutoSize
$csvlist | export-csv -path "$CSV_ablage\Ordner-innen-Struktur.csv" -notypeinformation -Append
        }
    }
} #Prüft die Unterordner auf nicht erlabute Ordner und ob sie eine .ignor Datei beinhalten. Falls er keine ignor hat wird ein CSV erstellt.

Remove-Item "$CSV_ablage\Ordner-innen-Struktur.csv" -ErrorAction SilentlyContinue #Löscht das alte CSV
Remove-Item "$CSV_ablage\Kapazität.csv" -ErrorAction SilentlyContinue #Löscht das alte CSV
Remove-Item "$CSV_ablage\Cursor-Struktur.csv" -ErrorAction SilentlyContinue #Löscht das alte CSV

foreach($Ordner in $Ordner){
$Standart = Get-ChildItem -Path "$Ordnervorlage" -Name -Directory
$Probe = Get-ChildItem -Path $Ordnerstruktuverzeichnis\$Ordner\ -Name -Directory

$Diffoerenz = (Compare-Object -DifferenceObject $Probe -ReferenceObject $Standart) #testet die Ordner auf abweichungen im bezug zu dem Referenzordner
$Differenz = $Diffoerenz | Where-Object 'SideIndicator' -contains '=>' | Select-Object 'InputObject' #Filtert die Ordner raus die Fehlen bis auf die nicht zulässigen Ordner

foreach($Differenz in $Differenz){
      Write-Host $Differenz -BackgroundColor Green
      Ausnahmen #nicht passende Ordner prüfung
        } #wird pro Cursor Ordner einmal ausgefürt und testet ob da Ordner nicht rein gehören.
        }
     
if((get-childitem C:\Tools\esi\Ergebnisse\Ordner-innen-Struktur.csv).count -eq 0){ $abweichung = "" }else{ $abweichung =  "Es wurde eine Ordner-innen-Struktur gefunden"}
if($abweichung){
Email
} #Wenn eine CSV erstellt wurde wird hier der Email versand angestoßen.
 
Zurück
Oben