Długość programu PowerShell nie pojawi się w danych wyjściowych Get-ChildItem

Dec 20 2020

Próbuję tego polecenia w Windows 10 PowerShell:

Get-ChildItem -Recurse | select FullName,Length,LastAccessTime

Wynik zawiera tylko FullName, while LastAccessTimei Lengthbrakuje w danych wyjściowych.

PowerShell ScreenShot

Co ja robię źle?

Odpowiedzi

1 AshokPrasath Dec 20 2020 at 23:34

To zadziała:

Get-ChildItem -Recurse | select FullName,Length,LastAccessTime | Export-Csv list.csv

3 mklement0 Dec 21 2020 at 01:07

Problem jest tylko problemem z wyświetlaniem :

  • Ponieważ ścieżki między obiektami wyjściowymi są długie i FullNamejest to pierwsza wybrana właściwość, pozostałe właściwości (kolumny) nie są drukowane , ponieważ nie mieszczą się na ekranie. Jednak właściwości obecne i mogą być używane programowo.

  • Uwaga: Jeśli zamierzasz zapisać do pliku w celu późniejszego przetwarzania programowego , nie powinieneś używać >/ Out-File, co skutkuje tym samym formatowaniem wyświetlania , jakie widzisz w konsoli (terminalu), ponieważ to formatowanie jest przeznaczone tylko dla obserwator ludzki .

    • Dla programowego przetwarzania , użyć strukturalnego formatu danych , takich jak CSV , jak pokazano w odpowiedzi Ashok Prasath za

Obejścia :

  • Szybkim i trudnym obejściem jest umieszczenie FullNamewłaściwości na końcu , jak radzi Doug Maurer , co spowoduje wyświetlenie wszystkich właściwości (kolumn), chociaż FullNamewartości właściwości zostaną obcięte (oznaczone symbolem ), a zwłaszcza od początku ścieżek:

    # FullName is placed *last*
    # Caveat: Paths will be truncated at the *end*.
    Get-ChildItem -Recurse | select Length, LastAccessTime, FullName
    
  • Jeśli nie masz nic przeciwko przełączeniu się na format oparty na liście , w którym każda wartość właściwości jest reprezentowana we własnym wierszu poprzedzonym nazwą właściwości, potokuj do Format-List; zwróć uwagę, że zbyt długie wartości będą zawijane w wierszach :

    Get-ChildItem -Recurse | select FullName,Length,LastAccessTime | Format-List
    
  • Jeśli chcesz tabelaryczne dane wyjściowe i nie masz nic przeciwko zawijaniu wierszy w swoim wyniku , możesz przesłać do Out-Stringniego -Widthwartość wystarczająco dużą, aby zmieściła się we wszystkich kolumnach (pamiętaj, że Out-Filerównież obsługuje -Width):

    Get-ChildItem -Recurse | select FullName,Length,LastAccessTime |
      Out-String -Width 300
    
    • Jeśli wolisz przewijanie w poziomie od zawijania wierszy, możesz zapisać powyższe do pliku i otworzyć w nim edytor tekstu lub za pomocą edytora tekstu, takiego jak Visual Studio Code , możesz bezpośrednio przesłać do niego dane wyjściowe:

      # Opens the output directly in a new Visual Studio Code editor tab.
      Get-ChildItem -Recurse | select FullName,Length,LastAccessTime |
        Out-String -Width 300 | code -
      
  • W przeciwnym razie - jeśli chcesz zobaczyć tabelarycznej wyświetlacz w konsoli , w takiej kolejności podanej kolumnie i bez linii owijania - jedynym rozwiązaniem jest obciąć te FullNamewartości tak, że wszystkie kolumny zmieści; zwróć uwagę, że ze względu na zwięzłość pomijam wywołanie select( Select-Object) na rzecz bezpośredniego użycia Format-Table:

    Get-ChildItem -Recurse |
      Format-Table @{ e='FullName'; w=[Console]::WindowWidth-45; a='right'},
                   Length, LastAccessTime
    
    • Zwróć uwagę, jak szerokość kolumny ( wpozycja, skrót od width) jest oparta na oknie konsoli ze znakami [Console]::WindowWidthminus ( ) 45, aby pokazać jak najwięcej FullNamewartości, jednocześnie pozostawiając miejsce na pozostałe dwie kolumny; również, aby upewnić się, że obcięcie (symbolizowane symbolem jest stosowane na początku ścieżki - aby nazwa pliku / katalogu była zawsze wyświetlana - kolumna jest wyrównana do prawej strony (poprzez awpis, skrót alignment); jeśli wolisz obcinanie końca toru, pominąć ten awpis (który następnie domyślnie left).

    • Aby uzyskać więcej informacji na temat @{ ... }sposobu określania tak zwanych obliczonych właściwości dla Format-Table, opartego na tablicy haszy ( ) , w tym sposobu obcinania od początku, przy jednoczesnym zachowaniu wyrównania do lewej , zobacz tę odpowiedź .