Powershell: GCI sofort ausgeben
Frohes neues Jahr
Ich habe bei Powershell folgendes Problem:
Ich suche in Laufwerken und Unterverzeichnissen nach bestimmten Dateinamen und Dateiendungen, die ich als Parameter mit P1 bis P45 übergebe (als Beispiel bzw. Code habe ich unten nur P1 und P2 aufgeführt).
Das funktioniert super, aber die Ausgabe gefällt mir nicht.
Befehl wäre bspw.: Suche.ps1 -Drives "C D X" -P1 "Hallooo1.txt" -P2 "Speisekarte*.txt"
Ausgabe sieht so aus:
Die Ausgaben sollen am Ende nicht zusammengefasst werden, sondern unter dem einzelnen "Suchbalken" stehen. Was muss ich machen das erst P1 abgearbeitet wird und danach erst P2?
Danke und Grüße
Claudi
Mein Code sieht bisher so aus.
Ich habe bei Powershell folgendes Problem:
Ich suche in Laufwerken und Unterverzeichnissen nach bestimmten Dateinamen und Dateiendungen, die ich als Parameter mit P1 bis P45 übergebe (als Beispiel bzw. Code habe ich unten nur P1 und P2 aufgeführt).
Das funktioniert super, aber die Ausgabe gefällt mir nicht.
Befehl wäre bspw.: Suche.ps1 -Drives "C D X" -P1 "Hallooo1.txt" -P2 "Speisekarte*.txt"
Ausgabe sieht so aus:
//.
#########################################################################################
Search for "Hallooo1.txt" in Drives: C D X
#########################################################################################
.
.
#########################################################################################
Search for "Speisekarte*.txt" in Drives: C D X
#########################################################################################
.
FullName
--------
C:\Hallooo1.txt
D:\Hallooo1.txt
C:\Speisekarte1.txt
D:\Speisekarte334455.txt//
Die Ausgaben sollen am Ende nicht zusammengefasst werden, sondern unter dem einzelnen "Suchbalken" stehen. Was muss ich machen das erst P1 abgearbeitet wird und danach erst P2?
Danke und Grüße
Claudi
Mein Code sieht bisher so aus.
Param (
[string[]]$Drives,
[string]$P1,
[string]$P2
)
$letterArray = ($Drives -split ' ').Trim()
if($P1) {
Write-Host "."
Write-Host "##############################################"
Write-Host "Search for ""$P1"" in Drives: $Drives"
Write-Host "##############################################"
Write-Host "."
foreach ($letter in $letterArray) {
gci $letter":\" -Filter $P1 -Force -EA Ignore -Recurse -File | select Fullname
}
}
if($P2) {
Write-Host "."
Write-Host "##############################################"
Write-Host "Search for ""$P2"" in Drives: $Drives"
Write-Host "##############################################"
Write-Host "."
foreach ($letter in $letterArray) {
gci $letter":\" -Filter $P2 -Force -EA Ignore -Recurse -File | select Fullname
}
}
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 5174430593
Url: https://administrator.de/contentid/5174430593
Ausgedruckt am: 22.11.2024 um 16:11 Uhr
2 Kommentare
Neuester Kommentar
Grüezi wohl und a guts Neus.
Write-Host und Write-Output macht einen großen Unterschied. Das eine gibt die Daten nur zur Ansicht auf der Konsole aus das andere gibt die ausgegeben Daten tatsächlich in der Pipeline weiter, deswegen ist write-host auch nur zur reinen Anzeige von Daten gedacht.
Dein select am Ende der Befehlskette gibt die Daten jedoch als Objekte in den Ausgabe-Stream und deswegen und weil die Objekte gemeinsame Properties (Fullname) besitzen werden die Objekte auch am Ende implizit zusammengefasst im Outputstream mittels Format-Table ausgegeben.
Details kannst du auch hier nachlesen:
https://stackoverflow.com/questions/40257475/powershell-write-output-onl ...
Wenn du die ausgegebenen Daten und Strings weiterverarbeiten und ausgeben willst solltest du stattdessen write-output statt write-host nutzen.
Beispiel
Soll es alles nur für die Anzeige sein, reicht es auch alles nur auf den Host auszugeben und ein out-host am Ende der Pipeline zu setzen.
Gibt es da diverse Möglichkeiten.
Ich würde mir stattdessenaber angewöhnen die Daten erst in Variablen zu sammeln und erst am Schluss die Ausgabe entsprechend formatiert auszugeben. Hat den Vorteil das man die Daten aus den Variablen später auch noch im Original weiterverarbeiten/ausgeben kann
Des weiteren brauchst du in deinem Skript das Splitten der Laufwerksbuchstaben nicht, du kannst die Laufwerke direkt als Array übergeben dann entfällt das Splitten.
-Drives C,D,E
Dann kannst du die Variable $drives direkt als Array nutzen ohne das Splitten.
Wurstel.
Write-Host und Write-Output macht einen großen Unterschied. Das eine gibt die Daten nur zur Ansicht auf der Konsole aus das andere gibt die ausgegeben Daten tatsächlich in der Pipeline weiter, deswegen ist write-host auch nur zur reinen Anzeige von Daten gedacht.
Dein select am Ende der Befehlskette gibt die Daten jedoch als Objekte in den Ausgabe-Stream und deswegen und weil die Objekte gemeinsame Properties (Fullname) besitzen werden die Objekte auch am Ende implizit zusammengefasst im Outputstream mittels Format-Table ausgegeben.
Details kannst du auch hier nachlesen:
https://stackoverflow.com/questions/40257475/powershell-write-output-onl ...
Wenn du die ausgegebenen Daten und Strings weiterverarbeiten und ausgeben willst solltest du stattdessen write-output statt write-host nutzen.
Beispiel
write-output Files1
Get-ChildItem | select -Expand Fullname
write-output Files2
Get-Childitem | select -Expand Fullname
Soll es alles nur für die Anzeige sein, reicht es auch alles nur auf den Host auszugeben und ein out-host am Ende der Pipeline zu setzen.
write-host Files1
Get-ChildItem | select -Expand Fullname | out-host
write-host Files2
Get-Childitem | select -Expand Fullname | out-host
Ich würde mir stattdessenaber angewöhnen die Daten erst in Variablen zu sammeln und erst am Schluss die Ausgabe entsprechend formatiert auszugeben. Hat den Vorteil das man die Daten aus den Variablen später auch noch im Original weiterverarbeiten/ausgeben kann
Des weiteren brauchst du in deinem Skript das Splitten der Laufwerksbuchstaben nicht, du kannst die Laufwerke direkt als Array übergeben dann entfällt das Splitten.
-Drives C,D,E
Dann kannst du die Variable $drives direkt als Array nutzen ohne das Splitten.
Wurstel.