Ich habe follgendes Script mit folgenden Kommentaren:
# Nach dem Quellordner fragen
$sourceFolder = Read-Host "Quellordner"
# Nach dem Zielordner fragen
$targetFolder = Read-Host "Zielordner"
$SearchFile = 'ManualToHelpCmd.exe' # Datei welche gesucht werden soll
$ExcludeFolders = 'Windows','Video' # Hauptordner in Laufwerken, welche überhaupt nicht durchsucht werden sollen
# ermittle alle lokalen Laufwerke (HDD, SSD, USB, SD...) (keine CD, DVD)
$Drives = (Get-CimInstance -ClassName Win32_LogicalDisk -Filter 'DriveType = 3 or DriveType = 2').DeviceID -as [Array]
# Get-CimInstance:Instanzen einer bestimmten Klasse aus dem CIM (Common Information Model) abruft
# ClassName Win32_LogicalDisk: Gibt an, dass Informationen aus der Klasse Win32_LogicalDisk abgerufen werden sollen die Laufwerke auf dem System beschreibt
# Filter 'DriveType = 3 or DriveType = 2': Ein Filter der nur die logischen Laufwerke auswählt deren DriveType gleich 3 oder 2 ist. DriveType 3 steht für lokale Festplatten, und DriveType 2 steht für Wechseldatenträger (z.B. USB-Sticks).
# DeviceID: Greift auf die DeviceID-Eigenschaft der zurückgegebenen logischen Laufwerke zu, was die Laufwerksbuchstaben (z.B. C:, D:) darstellt
# -as [Array]: Konvertiert die Liste der DeviceIDs in ein Array
# Überprüfen, ob Laufwerke gefunden wurden
if (-not $Drives) {
Write-Host "Keine Laufwerke gefunden." -ForegroundColor Red
exit
}
# das eigentliche Arbeitspferd
$Worker = {
param(
[Array]$Drives,
[String]$Filter,
[Array]$ExcludeFolders
)
# param(: Definiere die Parameter die der Skriptblock akzeptiert
# [Array]$Drives: Ein Array von Laufwerken
# [String]$Filter: Ein String-Filter
# [Array]$ExcludeFolders: Ein Array von auszuschließenden Ordnern
$Results = @() #Initialisiert eine leere Array-Variable namens "Results" die verwendet wird um die Ergebnisse zu speichern.
foreach ($Drive in $Drives) { #Jedes Element wird in der Variablen $Drive gespeichert.
$Results += (Get-ChildItem "$Drive\" -File -Filter $Filter -ErrorAction SilentlyContinue).FullName #-ErrorAction: Dieser Parameter steuert, wie das Cmdlet auf Fehler reagiert. SilentlyContinue: Diese Einstellung bewirkt, dass Fehler zwar erkannt, aber nicht angezeigt werden. Filtert hier sozusagen anch den Fehlern aber gibt sie nicht aus
$Results += (Get-ChildItem "$Drive\" -Directory | Where-Object Name -notin $ExcludeFolders | Get-ChildItem -File -Filter $Filter -Recurse -ErrorAction SilentlyContinue).FullName #-Directory = nur buchstaben, | = und, Recurse = sucht in
}
return $Results
}
# die Suche starten...
if ($Drives.Length -lt 2) {
# wenn wir nur ein (Physikalisches) Laufwerk haben können wir die Verteilung auf mehrere Jobs sparen, einfach den Worker direkt ausführen
Write-Host "$($Drives.Length) physikalische Festplatte(n), Suche wird einstufig durchgeführt:" -ForegroundColor Magenta
$Result = & $Worker -Drives $Drives -Filter $SearchFile -ExcludeFolders $ExcludeFolders
} else {
# bei mehreren Laufwerken die Arbeit auf mehrere parallele Jobs verteilen
$Jobs = $Drives | ForEach-Object {
Write-Host "Festplatte $_ wird durchsucht" -ForegroundColor Green
Start-Job -ScriptBlock $Worker -ArgumentList @($_ , $SearchFile, $ExcludeFolders)
}
$Result = $Jobs | Wait-Job | Receive-Job | Where-Object {$_}
}
# Debugging-Ausgabe für die gefundenen Ergebnisse
Write-Host "Gefundene Dateien:" -ForegroundColor Cyan
$Result | ForEach-Object { Write-Host $_ -ForegroundColor Cyan }
if ($Result) {
# Wenn mehrere Dateien gefunden werden, Auswahl anzeigen
if ($Result.Count -gt 1) {
Write-Host "Es wurden mehrere Dateien gefunden mit gleichnamigen Namen. Wählen Sie die gewünschte Datei aus!" -ForegroundColor Yellow
$selectedFile = $Result | Out-GridView -Title "Wählen Sie die Datei aus, welche Sie benutzen wollen!" -OutputMode Single
} else {
$selectedFile = $Result
}
# Das Ergebnis (können auch mehrere Dateien gleichen Namens sein)
if ($selectedFile) {
Write-Host "Ausgewählte Datei: $selectedFile" -ForegroundColor Green
& $selectedFile $sourceFolder $targetFolder
} else {
Write-Host "Keine Datei ausgewählt" -ForegroundColor Red
}
} else {
Write-Host "Keine Datei gefunden" -ForegroundColor Red
}
Aber was machen diese zwei Zeilen?:
$Results += (Get-ChildItem "$Drive\" -File -Filter $Filter -ErrorAction SilentlyContinue).FullName
$Results += (Get-ChildItem "$Drive\" -Directory | Where-Object Name -notin $ExcludeFolders | Get-ChildItem -File -Filter $Filter -Recurse -ErrorAction SilentlyContinue).FullName
Hey, danke für deine Antwort!
Leider bin ich nicht erfahren im Gebiet Batch und wüsste nicht genau, was ich eingeben sollte. Hättest du vielleicht eine commandline, welche ich eingeben kann?