Windows, PowerShell i długie ścieżki

Windows, PowerShell i długie ścieżki

Myślę, że ty, podobnie jak ja, często widziałeś ścieżki formy !!! Ważne____Nowe____!!! Nie usuwać!!!Zarządzenie nr 98819-649-B z dnia 30 r. w sprawie powołania Iwana Aleksandrowicza Kozłowa na p.o. szefa departamentu obsługi korporacyjnych klientów VIP i organizacji spotkań biznesowych na marginesie.doc.

I często nie będziesz mógł od razu otworzyć takiego dokumentu w systemie Windows. Ktoś ćwiczy obejście w postaci mapowania dysku, ktoś używa menedżerów plików, które mogą pracować z długimi ścieżkami: Far Manager, Total Commander i tym podobne. A wielu innych ze smutkiem obserwowało, jak stworzony przez nich skrypt PS, w który włożono wiele pracy i który działał z hukiem w środowisku testowym, w środowisku bojowym, bezradnie narzekał na niemożliwe zadanie: Określona ścieżka, nazwa pliku lub oba są za długie. W pełni kwalifikowana nazwa pliku musi mieć mniej niż 260 znaków, a nazwa katalogu musi mieć mniej niż 248 znaków.
Jak się okazało, 260 znaków wystarczy „nie tylko każdemu”. Jeśli interesuje Cię wyjście poza granice tego, co dozwolone, pytam pod kat.

Oto tylko kilka niefortunnych konsekwencji ograniczenia długości ścieżki do pliku:

Nieco odbiegając od tematu, zauważam, że w przypadku replikacji systemu plików DFS problem rozważany w artykule nie jest straszny i pliki o długich nazwach z powodzeniem przemieszczają się z serwera na serwer (o ile oczywiście inaczej zrobione dobrze).

Chciałbym również zwrócić uwagę na bardzo przydatne narzędzie, które pomogło mi nie raz robocopy. Ona też nie boi się długich ścieżek i dużo wie. Dlatego jeśli zadanie sprowadza się do skopiowania / przeniesienia danych pliku, możesz na tym poprzestać. Jeśli musisz bawić się listami kontroli dostępu do systemu plików (DACL), odwróć wzrok subincl. Mimo swojego sporego wieku doskonale sprawdził się na Windowsie 2012 R2. Tutaj brane są pod uwagę metody aplikacji.

Byłem również zainteresowany nauką pracy z długimi ścieżkami PowerShell. Z nim prawie jak w brodatym dowcipie o Iwanie Carewiczu i Pięknej Wasilisie.

Szybki sposób

Przełącz się na Linuksa i nie martw się o Windows 10/2016/2019 i włącz odpowiednie ustawienia zasad grupy/ulepszenia rejestru. Nie będę szczegółowo omawiał tej metody, ponieważ. w sieci jest już wiele artykułów na ten temat, np. to.

Biorąc pod uwagę, że w większości firm jest wiele, delikatnie mówiąc, nieświeżych wersji systemów operacyjnych, ta metoda jest szybka tylko do pisania na papierze, o ile oczywiście nie należysz do tych szczęśliwców, którzy mają niewiele starszych systemów i Windows panowanie 10r.

długa droga

Tutaj od razu zastrzegamy, że zmiany nie wpłyną na zachowanie Eksploratora Windows, ale umożliwią korzystanie z długich ścieżek w cmdletach PowerShell, takich jak Get-Item, Get-ChildItem, Remove-Item itp.

Najpierw zaktualizujmy PowerShell. Skończyło się raz, dwa, trzy.

  1. Aktualizujemy .NET Framework do wersji co najmniej 4.5. System operacyjny musi być co najmniej Windows 7 SP1/2008 R2. Aktualną wersję można pobrać tutajczytaj więcej informacji tutaj.
  2. Ściąganie i zainstaluj Windows Management Framework 5.1
  3. Restartujemy maszynę.

Pracowici mogą wykonać powyższe kroki ręcznie, leniwi mogą to zrobić za pomocą SCCM, zasad, skryptów i innych narzędzi automatyzujących.

Bieżącą wersję programu PowerShell można znaleźć w zmiennej $PSVersionTable. Po aktualizacji powinno to wyglądać tak:

Windows, PowerShell i długie ścieżki

Teraz podczas korzystania z poleceń cmdlet Get-ChildItem a inni lubią go zamiast zwykłego ścieżka użyjemy ścieżka literału.

Format ścieżek będzie nieco inny:

Get-ChildItem -LiteralPath "?C:Folder"
Get-ChildItem -LiteralPath "?UNCServerNameShare"
Get-ChildItem -LiteralPath "?UNC192.168.0.10Share"

Dla wygody konwertowania ścieżek ze zwykłego formatu na format ścieżka literału możesz użyć tej funkcji:

Function ConvertTo-LiteralPath 
Param([parameter(Mandatory=$true, Position=0)][String]$Path)
    If ($Path.Substring(0,2) -eq "") {Return ("?UNC" + $Path.Remove(0,1))}
    Else {Return "?$Path"}
}

Należy pamiętać, że podczas ustawiania parametru ścieżka literału nie można używać symboli wieloznacznych (*, ? i tak dalej).

Oprócz parametru ścieżka literału, w zaktualizowanym poleceniu cmdlet programu PowerShell Get-ChildItem otrzymany parametr Głębokość, za pomocą którego można ustawić głębokość zagnieżdżenia dla wyszukiwania rekurencyjnego, użyłem go kilka razy i byłem zadowolony.

Teraz nie możesz się obawiać, że Twój skrypt PS zboczy z długiej, ciernistej ścieżki i nie zobaczy odległych plików. Na przykład takie podejście bardzo pomogło mi podczas pisania skryptu resetującego atrybut „tymczasowy” dla plików w folderach DFSR. Ale to już inna historia, którą postaram się opowiedzieć w innym artykule. Czekam na ciekawe komentarze z Twojej strony i zachęcam do wypełnienia ankiety.

Przydatne linki:
docs.microsoft.com/en-us/dotnet/api/microsoft.powershell.commands.contentcommandbase.literalpath?view=powershellsdk-1.1.0
docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem?view=powershell-5.1
https://stackoverflow.com/questions/46308030/handling-path-too-long-exception-with-new-psdrive/46309524
luisabreu.wordpress.com/2013/02/15/theliteralpath-parameter

W ankiecie mogą brać udział tylko zarejestrowani użytkownicy. Zaloguj się, Proszę.

Czy problem długich tras jest dla Ciebie istotny?

  • Tak

  • Było istotne, ale już postanowione

  • Zakłóca, ale niewiele

  • Nie pomyślałem o tym, wszystko wydaje się działać

  • Nie

  • Inne (określ w uwagach)

Głosowało 155 użytkowników. 25 użytkowników wstrzymało się od głosu.

Źródło: www.habr.com

Dodaj komentarz