Muszę pobrać wszystkie pliki, w tym pliki obecne w podfolderach, które należą do określonego typu.
Robię coś takiego, używając Get-ChildItem :
Get-ChildItem "C:\windows\System32" -Recurse | where {$_.extension -eq ".txt"}
Jednak zwraca mi tylko nazwy plików, a nie całą ścieżkę.
powershell
powershell-2.0
Gagan
źródło
źródło
*.txt*
(-Filter
używa symboli wieloznacznych CMD). Jeśli tego nie chcesz, użyj-Include *.txt
.Możesz także użyć Select-Object w następujący sposób:
źródło
Select-Object
zwracaPSCustomObject
, a nie ciąg. Może to nie zadziałać, jeśli użyjesz wyniku jako parametru dla innego programuPSCustomObject
, użyj-ExpandProperty FullName
zamiast po prostuFullName
. O ile rozumiem,-ExpandProperty
parametr powoduje, że polecenie cmdlet zwraca wyniki jako typ określonej właściwości (natywny?) Zamiast jako obiekt niestandardowy.Get-ChildItem -Path 'C:\Program Files\TheProgram' -Recurse | Where-Object -FilterScript {($_.LastWriteTime -gt '2020-03-01')} | Select-Object FullName
Oto krótszy:
źródło
(gci -r c:\).fullname
(ls -r c:\).fullname
(ls -r c:).fullname
Jeśli ścieżki względne są tym, czego potrzebujesz, możesz po prostu użyć
-Name
flagi.Get-ChildItem "C:\windows\System32" -Recurse -Filter *.txt -Name
źródło
To jest to, czego użyłem. Wydaje mi się, że jest to bardziej zrozumiałe, ponieważ nie zawiera żadnej składni pętli.
źródło
Naprawdę irytujące w PS 5, gdzie $ _ nie będzie pełną ścieżką dla wszystkich. To są ciągowe wersje obiektów FileInfo i DirectoryInfo. Z jakiegoś powodu znak wieloznaczny w ścieżce naprawia to lub użyj Powershell 6 lub 7. Możesz również potokować, aby uzyskać element w środku.
Wydaje się, że był to problem z .Net, który został rozwiązany w .Net Core (Powershell 7): Zachowanie ciągów znaków dla instancji FileInfo / Directory zmieniło się od wersji 6.0.2 # 7132
źródło
To zadziałało dla mnie i tworzy listę nazwisk:
Znalazłem to, używając
get-member -membertype properties
niezwykle użytecznego polecenia. większość opcji, które daje, jest zakończona znakiem.<thing>
, jakfullname
tutaj. Możesz trzymać to samo polecenie;na końcu dowolnego polecenia, aby uzyskać więcej informacji o tym, co możesz z nimi zrobić i jak uzyskać do nich dostęp:
źródło
Spróbuj tego:
źródło
Dlaczego nikt jeszcze nie używał pętli foreach? Zaletą jest to, że możesz łatwo nazwać swoją zmienną:
źródło
$
przedtextfile
:$textfile = $fileList[$i].FullName
.$i
To znaczy, zakładając, że ma wartość liczbową.źródło
[alternatywna składnia]
Niektórym osobom operatorzy rur kierunkowych nie są w ich guście, ale wolą łańcuchy. Zobacz kilka interesujących opinii na ten temat udostępnionych w narzędziu do śledzenia problemów Roslyn: dotnet / roslyn # 5445 .
W zależności od przypadku i kontekstu, jedno z tych podejść można uznać za ukryte (lub pośrednie). Na przykład w tym przypadku użycie potoku przeciwko enumerable wymaga specjalnego tokena
$_
(akaPowerShell's "THIS" token
) może wydawać się niektórym niesmaczne.Dla takich gości jest bardziej zwięzły, prosty sposób na zrobienie tego z łańcuchem kropek :
(<rant> Zauważ, że PowerShell za argumenty polecenia parser akceptuje częściowe nazwy parametrów Więc oprócz.
-recursive
;-recursiv
,-recursi
,-recurs
,-recur
,-recu
,-rec
i-re
są akceptowane, ale niestety nie-r
.. który jest jedynym właściwym wyborem, który ma sens z pojedynczego-
znaku (jeśli mamy przejdź przez konwencje POSIXy UNIXy)! </rant>)źródło
-r
krótka forma-Recurse
prac jest dla mnie dobra.-File
przełącznika-fi
w przykładzie:-fil
i-file
działa, ale nie-f
. Przechodząc do stylu POSIX, powinno to być--file
(wieloliterowe) i-f
(jednoliterowe, chyba że -f jest zarezerwowane dla czegoś innego, powiedzmyforce
przełącznik, wtedy może to być coś innego, jak-l
opcja jednoliterowa lub nie mieć jej wcale).Używam poniższego skryptu, aby rozszerzyć całą ścieżkę folderu:
Pełna ścieżka folderu nie nadchodzi. Po 113 znakach nadchodzi:
źródło
Użyłem tego polecenia do wyszukania plików „.xlm” w „C: \ Temp”, a wynik wypisuje ścieżkę pełnej nazwy w pliku „result.txt”:
W moich testach ta składnia działa pięknie.
źródło