po prostu chcę uruchomić:
C:\>xcopy [0-9]{13}\.(gif|jpg|png) s:\TargetFolder /s
wiem, xcopy
że nie obsługuje wyszukiwania nazw plików wyrażeń regularnych.
nie mogę się dowiedzieć, jak sprawdzić, czy PowerShell ma Cmdlet
kopiować pliki; a jeśli tak, jak sprawdzić, czy obsługuje dopasowanie nazw plików wyrażeń regularnych.
Czy ktoś może pomyśleć o sposobie wykonania kopiowania / przenoszenia pliku rekurencyjnego z dopasowaniem wyrażenia regularnego?
windows
file-management
regex
xcopy
Ian Boyd
źródło
źródło
Odpowiedzi:
Lubię używać wszystkich poleceń Powershell, kiedy mogę. Po kilku testach jest to najlepsze, co mogę zrobić.
Pierwsze trzy wiersze mają na celu ułatwienie odczytu. Możesz zdefiniować zmienne w rzeczywistych poleceniach, jeśli chcesz. Kluczem do tego przykładu kodu jest polecenie „Where-Object”, które jest filtrem, który akceptuje dopasowanie wyrażeń regularnych. Należy zauważyć, że obsługa wyrażeń regularnych jest trochę dziwna. Znalazłem tutaj kartę referencyjną PDF z obsługiwanymi znakami po lewej stronie.
[EDYTOWAĆ]
Jak wspomniano „@Johannes Rössel”, możesz również zredukować ostatnie dwie linie do jednej linii.
Główną różnicą jest to, że sposób Johannesa filtruje obiekty, a mój sposób filtruje tekst. Podczas pracy z Powershell prawie zawsze lepiej jest używać obiektów.
[EDIT2]
Jak wspomniano @smoknheap, powyższe skrypty spłaszczą strukturę folderów i umieszczą wszystkie twoje pliki w jednym folderze. Nie jestem pewien, czy istnieje przełącznik, który zachowuje strukturę folderów. Wypróbowałem przełącznik -Recurse i to nie pomaga. Jedynym sposobem, w jaki udało mi się to uruchomić, jest powrót do manipulacji ciągami i dodawanie folderów do mojego filtra.
Jestem pewien, że jest to bardziej elegancki sposób, ale z moich testów to działa. Zbiera wszystko, a następnie filtry dla dopasowań nazw i obiektów folderów. Musiałem użyć metody ToString (), aby uzyskać dostęp do manipulacji ciągami.
[EDIT3]
Teraz, jeśli chcesz zgłosić ścieżkę, aby upewnić się, że wszystko jest poprawne. Możesz użyć polecenia „Write-Host”. Oto kod, który da ci kilka wskazówek, co się dzieje.
Powinno to zwrócić odpowiednie ciągi. Jeśli gdzieś nic nie dostaniesz, będziesz wiedział, z którym przedmiotem masz problemy.
Mam nadzieję że to pomoże
źródło
$item.FullName
tam używać - odpowiednia właściwość jest pobierana automatycznie, jeśli przekazujesz obiekt FileInfo (imho, nie powinieneś, ponieważ moc PowerShell pochodzi z przekazywania obiektów strukturalnych, a nie ciągu znaków). Co więcej, możesz umieścić wszystko w jednym potoku:((gci $source) -match $filter) | cp -dest $destination
(nieco przystosowany do zwięzłości - nie krępuj się zmieniać; mówię tylko, że nieforeach
jest to konieczne).Copy-Item : Cannot bind argument to parameter 'Path' because it is null
Trim
nie jest przeznaczony do usuwania ciągu z końca innego ciągu, zamiast tego usuwa wszystkie wystąpienia znaków w ciągu parametrów od początku i końca ciągu, do którego jest wywoływany. W twoim przypadku, jeśli$item.Name
zawiera wielką literę C, usunie również literę dysku C z początku łańcucha.PowerShell jest doskonałym narzędziem do tego zadania. Do kopiowania można użyć cmdletu Copy-Item . Możesz potokować go za pomocą innych poleceń cmdlet dla złożonych poleceń kopiowania, oto ktoś, kto dokładnie to zrobił :)
Wyrażenia regularne wykorzystują klasę .NET RegEx z przestrzeni nazw System.Text.RegularExpressions, istnieje szybki poradnik na temat tych klas
Program PowerShell ma również operatory -match i -replace, których można używać podczas potokowania z kopiowaniem elementu
Istnieją również narzędzia, które pomogą Ci stworzyć samego RegEx, np. Znajomy RegEx
źródło
-match
i-replace
należy o tym wspomnieć przed wejściem doSystem.Text.RegularExpressions.RegEx
. Przynajmniej dla mnie rzadko używam[regex]
bezpośrednio; Jednak ja nie często używać-match
i-replace
operatorów. Jeśli chodzi o tworzenie wyrażeń regularnych, uważam, że PowerShell jest bardzo przydatny w testowaniu i dopracowywaniu wyrażeń regularnych, które piszesz.jako pomysł, ale potrzebuje trochę pracy
reż -r | ? {$ _ -match '[0-9] {13} \. (gif | jpg | png)'} | % {xcopy $ _. pełna nazwa c: \ temp}
źródło