Powershell Problem mit System.Collections.ArraylList?
Hallo.
Ich habe ein Problem mit einer ArrayList.
Meine Funktion funtioneirt solange durch die Funktion mehrere Dateien gefunden werden, wenn aber nur eine Datei gefunden wird bekomme ich immer einen Fehler.
Das ist der Bereich in dem die ArrayList gefüllt wird (bzw. ein Auszug):
...
[System.Collections.ArrayList]$TableData = @(Get-ChildItem $FullDateFolders -Filter $filter -File -Recurse) |
where-object {($_.LastAccessTime -le (get-date).AddMinutes($DelTime)) -and ($_.Fullname -like $filter1)} |
ForEach-Object `
-Begin {$i=0} `
-Process {
$i++
$TextBox_Output.AppendText([System.Environment]::NewLine + "# Add: " + $_.FullName) #TODO Nur für TEST
write-host "Datei-Nr.: $i -- " $_.Name #TODO Nur für TEST
$_CopyFullPath = (($_.FullName -split '\\') | Select -Last 3) -join '\'
$_CopyFolder = (($_.FullName -split '\\') | Select -Last 3 | Select -SkipLast 1) -join '\'
$_DisplayPath = (($_.FullName -split '\\') | Select -Last 4) -join '\'
$_NumberOfParts = (Select-String -path $_ -pattern 'K0007').count
$_LastDir = (Split-Path $_.Directory -Leaf)
$_
...
Wichtiger ist wahrscheinlich die Fehlermeldung:
Der Wert "@{Maschine=50151; Name=schleifen.dfq; Teile=0; LastWriteTime=13.07.2022 18:57:52; DisplayPath=20220713_060501\MFU\50151\schleifen.dfq;
CopyFullPath=MFU\50151\schleifen.dfq; CopyFolder=MFU\50151; FullName=E:\Powershell_Skripts\99-Ordner_Test\Source\20220713_060501\MFU\50151\schleifen.dfq}" kann nicht
in den Typ "System.Collections.ArrayList" konvertiert werden. Fehler: "Der Wert "@{Maschine=50151; Name=schleifen.dfq; Teile=0; LastWriteTime=13.07.2022 18:57:52;
DisplayPath=20220713_060501\MFU\50151\schleifen.dfq; CopyFullPath=MFU\50151\schleifen.dfq; CopyFolder=MFU\50151;
FullName=E:\Powershell_Skripts\99-Ordner_Test\Source\20220713_060501\MFU\50151\schleifen.dfq}" vom Typ "Selected.System.IO.FileInfo" kann nicht in den Typ
"System.Collections.ArrayList" konvertiert werden."
Kann mit dieser Fehlermeldung vielleicht jemand was Anfangen und mir einen Tip für die Fehlersuche geben?
1 Antwort
Dein Get-ChiIdItem -Aufruf als Array zu binden und An die Pipe zu übergeben macht wenig Sinn. Wichtig ist Dass was Du aus der Pipe raus schickst, innerhalb eier Arraydefinition erfolgt. ...sonst Wird versucht bei einem einzelnen Objekt, dieses in einzelne Felder zu zerlegen, was natürlich in die Hose geht
das geht:
[System.Collections.ArrayList]$TableData =
1..3 |%{
[PSCustomObject]@{
Number = $_
Eiertanz = 'QuickStep{0}'-f $_ }
}
$TableData |fl
das nicht...
(Wichtig ist Dass was Du aus der Pipe raus schickst, innerhalb einer Arraydefinition erfolgt. ...sonst wird versucht bei einem einzelnen Objekt, dieses in einzelne Felder zu zerlegen, was natürlich in die Hose geht):
[System.Collections.ArrayList]$TableData =
1 |%{
[PSCustomObject]@{
Number = $_
Eiertanz = 'QuickStep{0}'-f $_ }
}
$TableData |fl
richtig:
#die richtige Klammer am richtigen Platz macht es
[System.Collections.ArrayList]$TableData = @(
1 |%{
[PSCustomObject]@{
Number = $_
Eiertanz = 'QuickStep{0}'-f $_ }
}
)
$TableData |fl
für Dein gci...:
#übergib die gesamte Pipe als Element eines Arrays an Arraylist!
[System.Collections.ArrayList]$TableData = @(
Get-ChildItem 'einsamedatei.txt' -File|
ForEach-Object `
-Begin {$i=0} `
-Process {
$i++
write-host "Datei-Nr.: $i -- " $_.Name -fo green
#hier wird das neu geschaffene Objekt ausgegeben
[PSCustomObject]@{
CopyFullPath = (($_.FullName -split '\\') | Select -Last 3) -join '\'
CopyFolder = (($_.FullName -split '\\') | Select -Last 3 | Select -SkipLast 1) -join '\'
}
}
#hier wird die Arraydefinition abgeschlossen
)
#mal anzeigen
$TableData|fl
Hallo.
Erstmal Danke für die super verständliche Erklärung.
Hab viel probiert, aber auf eine falsch gesetzte Klammer bin ich nicht gekommen.
Aber mit deinen Beispielen ist mir auch klar das es vorher "Blödsinn" war.
Nochmals DANKE für deine riesige Hilfsbereitschaft.