Windows, PowerShell e percorsi lunghi

Windows, PowerShell e percorsi lunghi

Credo che, come me, ti sia capitato più volte di vedere percorsi del tipo !!! Importante____Nuovo____!!! Non cancellare!!! Ordinanza №98819-649-Б del 30 febbraio 1985 riguardante la nomina di Kozlov Ivan Aleksandrovich a responsabile temporaneo della direzione per il supporto di clienti VIP aziendali e organizzazione di incontri d'affari nei corridoi.doc.

E spesso aprire un documento del genere in Windows non è immediato. Alcuni praticano workaround come la mappatura delle unità, altri utilizzano gestori di file capaci di lavorare con percorsi lunghi: Far Manager, Total Commander e simili. E molti hanno osservato con tristezza come lo script PS che avevano creato, nel quale avevano investito non poco impegno e che funzionava perfettamente in ambiente di test, in produzione, si lamentasse impotente di un compito insormontabile: Il percorso specificato, il nome del file, o entrambi sono troppo lunghi. Il nome file completo deve essere inferiore a 260 caratteri e il nome della directory deve essere inferiore a 248 caratteri.
Come si è scoperto, 260 caratteri non sono sufficienti "per tutti". Se ti interessa superare i limiti consentiti, ti invito a continuare.

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

Allontanandomi leggermente dall'argomento, osservo che per la replica DFS il problema trattato nell'articolo non è grave e i file con nomi lunghi viaggiano senza problemi da server a server (se, ovviamente, nel resto avete fatto tutto bene) fatto correttamente).

Vorrei anche sottolineare un'utility molto utile che mi ha spesso salvato robocopy. Anche per lei i lunghi percorsi non sono un problema, e sa fare molte cose. Quindi, se il compito è limitato alla copia/spostamento di dati, si può rimanere su di lei. Se bisogna fare qualche magia con le liste di controllo accesso nel sistema di file (DACL), guarda in direzione di subinacl. Nonostante l'età rispettabile, si è comportata eccellentemente su Windows 2012 R2. Qui sono stati esaminati i metodi di applicazione.

A me interessava insegnare a lavorare con i lunghi percorsi in PowerShell. È un po' come nella barzelletta sul principe Ivan e la bellissima Vasilisa.

Metodo veloce

Passare a Linux e non doversi preoccupare di Windows 10/2016/2019 e attivare il parametro di gruppo giusto/giocare con il registro. Non mi soffermerò su questo metodo, poiché ci sono già molti articoli online a riguardo, per esempio, questo.

Considerando che nella maggior parte delle aziende ci sono molte versioni di sistemi operativi, per usare un eufemismo, non freschissime, questo metodo è veloce solo sulla carta, a meno che non siate tra i pochi fortunati con poche legacy-systems dove regnano Windows 10/2016/2019.

Metodo lungo

Chiarisco subito che le modifiche non influenzeranno il comportamento di Esplora file di Windows, ma permetteranno di utilizzare percorsi lunghi nei cmdlet di PowerShell, come Get-Item, Get-ChildItem, Remove-Item e altri.

Innanzitutto aggiorniamo PowerShell. Si fa in un attimo.

  1. Aggiorniamo .NET Framework a una versione non inferiore a 4.5. Il sistema operativo deve essere almeno Windows 7 SP1/2008 R2. La versione attuale può essere scaricata qui, leggere informazioni aggiuntive qui.
  2. Scarichiamo e installare Windows Management Framework 5.1
  3. Riavviare la macchina.

I diligenti possono eseguire manualmente i passaggi descritti sopra, i pigri - tramite SCCM, politiche, script e altri strumenti di automazione.

La versione attuale di PowerShell può essere scoperta dalla variabile $PSVersionTable. Dopo l'aggiornamento dovrebbe essere all'incirca così:

Windows, PowerShell e percorsi lunghi

Ora, utilizzando i cmdlet Get-ChildItem e simili, invece del consueto Path utilizzeremo LiteralPath.

Il formato dei percorsi sarà leggermente diverso:

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

Per facilitare la conversione dei percorsi dal formato abituale al formato LiteralPath si può utilizzare 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, imposto il parametro LiteralPath non è possibile utilizzare caratteri jolly (*, ? ecc.).

Oltre al parametro LiteralPath, nella versione aggiornata di PowerShell, il cmdlet Get-ChildItem ha ricevuto il parametro Depth, tramite il quale è possibile specificare la profondità di annidamento per la ricerca ricorsiva; l'ho usato un paio di volte e sono rimasto soddisfatto.

Ora non c'è più motivo di temere che il tuo script PS si perda in un lungo e arduo viaggio e non riesca a vedere file distanti. Ad esempio, questo approccio mi è stato molto utile nella scrittura di uno script per rimuovere l'attributo «temporaneo» dai file nelle cartelle DFSR. Ma questa è un'altra storia, che cercherò di raccontare in un altro articolo. Aspetto i vostri interessanti commenti e vi invito a 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-parameter

Solo gli utenti registrati possono partecipare al sondaggio. Accedi, per favore.

Il problema dei percorsi lunghi è attuale per voi?

  • Era attuale, ma ho già risolto

  • Dà fastidio, ma non molto

  • Non ci ho pensato, sembra tutto funzionare

  • No

  • Altro (specifica nei commenti)

155 utenti hanno votato. 25 utenti si sono astenuti.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster