hatschi1
Goto Top

Powershell: GCI sofort ausgeben

Frohes neues Jahr face-smile

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                         
}
}

Content-Key: 5174430593

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

Printed on: May 2, 2024 at 11:05 o'clock

Mitglied: 5175293307
Solution 5175293307 Jan 01, 2023 updated at 16:11:54 (UTC)
Goto Top
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
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
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.
Member: Hatschi1
Hatschi1 Jan 01, 2023 at 16:33:07 (UTC)
Goto Top
Hallo Wurstel, vielen Dank!
Funktioniert super und ich habe viel gelernt.
Danke und Gruß