Windows, PowerShell e percorsi lunghi

Windows, PowerShell e percorsi lunghi

Penso che tu, come me, hai visto percorsi come questo più di una volta !!! Importante____Nuovo____!!! Non cancellare!!!Ordine N. 98819-649-B del 30 febbraio 1985 sulla nomina di Ivan Aleksandrovich Kozlov a capo ad interim del dipartimento per il supporto dei clienti VIP aziendali e l'organizzazione di incontri d'affari a margine.doc.

E spesso non sarai in grado di aprire subito un documento del genere in Windows. Alcune persone praticano soluzioni alternative sotto forma di mappatura del disco, altre utilizzano file manager che possono funzionare con percorsi lunghi: Far Manager, Total Commander e simili. E molti altri hanno guardato con tristezza mentre lo script PS da loro creato, nel quale è stato investito molto lavoro e che ha funzionato alla grande nell'ambiente di test, nell'ambiente di produzione si è lamentato impotente di un compito impossibile: Il percorso, il nome file o entrambi specificati sono troppo lunghi. Il nome file completo deve essere inferiore a 260 caratteri e il nome della directory deve essere inferiore a 248 caratteri.
A quanto pare, 260 caratteri sono sufficienti “non solo per tutti”. Se siete interessati ad andare oltre i confini di ciò che è consentito, fate riferimento al cat.

Ecco solo alcune delle sfortunate conseguenze della limitazione della lunghezza del percorso del file:

Divergendosi leggermente dall'argomento, noto che per Replica DFS il problema discusso nell'articolo non è terribile e i file con nomi lunghi viaggiano con successo da un server all'altro (se, ovviamente, tutto il resto è fatto bene).

Vorrei anche attirare la vostra attenzione su un'utilità molto utile che mi ha aiutato più di una volta robocopy. Inoltre non ha paura dei lunghi percorsi e può fare molto. Pertanto, se l'attività si riduce alla copia/trasferimento dei dati di un file, puoi fermarti qui. Se hai bisogno di giocare brutti scherzi con gli elenchi di controllo degli accessi al file system (DACL), distogli lo sguardo subincl. Nonostante la sua età avanzata, ha funzionato in modo eccellente su Windows 2012 R2. Qui vengono prese in considerazione le modalità di applicazione.

Ero interessato a insegnare come lavorare con lunghi percorsi PowerShell. Con lui è quasi come in una battuta barbuta su Ivan Tsarevich e Vasilisa la Bella.

Modo veloce

Passa a Linux e non preoccuparti di Windows 10/2016/2019 e abilita l'impostazione dei criteri di gruppo appropriata/modifica il registro. Non mi soffermerò su questo metodo nel dettaglio, perché... Ci sono già molti articoli su questo argomento su Internet, ad esempio, questo.

Considerando che la maggior parte delle aziende ne ha molte, per usare un eufemismo, non le ultime versioni dei sistemi operativi, questo metodo è rapido solo per scrivere su carta, a meno che, ovviamente, tu non sia uno di quei fortunati che hanno pochi sistemi legacy e Windows 10 /2016/2019 regna sovrano.

La lunga strada

Facciamo subito una riserva qui che le modifiche non influenzeranno il comportamento di Windows Explorer, ma consentiranno di utilizzare percorsi lunghi nei cmdlet di PowerShell, come Get-Item, Get-ChildItem, Remove-Item, ecc.

Innanzitutto, aggiorniamo PowerShell. È fatto una, due, tre volte.

  1. Aggiorniamo .NET Framework alla versione non inferiore alla 4.5. Il sistema operativo deve essere almeno Windows 7 SP1/2008 R2. È possibile scaricare la versione corrente qui, leggi ulteriori informazioni qui.
  2. Scarica e installare Windows Management Framework 5.1
  3. Riavviamo la macchina.

Le persone laboriose possono eseguire manualmente i passaggi sopra descritti, le persone pigre possono farlo con l'aiuto di SCCM, policy, script e altri strumenti di automazione.

La versione corrente di PowerShell può essere trovata dalla variabile $PSVersionTabella. Dopo l'aggiornamento dovrebbe assomigliare a questo:

Windows, PowerShell e percorsi lunghi

Ora quando si utilizzano i cmdlet Get-ChildItem e simili invece del solito sentiero удем использовать percorso letterale.

Il formato del percorso sarà leggermente diverso:

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

Per comodità di convertire i percorsi dal formato abituale al formato percorso letterale puoi usare questa funzione:

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"}
}

Si prega di notare che quando si imposta il parametro percorso letterale Non è possibile utilizzare i caratteri jolly (*, ? e così via).

Oltre al parametro percorso letterale, nella versione aggiornata del cmdlet di PowerShell Get-ChildItem ottenuto il parametro Profondità, con il quale è possibile impostare la profondità di annidamento per la ricerca ricorsiva, l'ho utilizzato un paio di volte e sono rimasto soddisfatto.

Ora non devi preoccuparti che il tuo script PS si smarrisca lungo il lungo percorso spinoso e non sia in grado di vedere file distanti. Ad esempio, questo approccio mi ha aiutato molto durante la scrittura di uno script per reimpostare l'attributo "temporaneo" dei file nelle cartelle DFSR. Ma questa è un’altra storia, che cercherò di raccontare in un altro articolo. Aspetto con ansia i tuoi commenti interessanti e ti suggerisco di partecipare al sondaggio.

Link utili:
docs.microsoft.com/ru-ru/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
stackoverflow.com/questions/46308030/handling-path-too-long-exception-with-new-psdrive/46309524
luisabreu.wordpress.com/2013/02/15/theliteralpath-parametro

Solo gli utenti registrati possono partecipare al sondaggio. AccediPer favore.

È rilevante per te il problema dei percorsi lunghi?

  • Era rilevante, ma già deciso

  • Interferisce, ma non molto

  • Non ci avevo pensato, sembra che funzioni tutto

  • No

  • Altro (specificare nei commenti)

155 utenti hanno votato. 25 utenti si sono astenuti.

Fonte: habr.com

Aggiungi un commento