
Creo que usted, como yo, a menudo ha visto caminos de la forma
\ !!! Importante \ ____ Nuevo ____ \ !!! ¡No lo elimine! \ Order No. 98819-649-B del 30 de febrero de 1985 sobre el nombramiento de Kozlov Ivan Aleksandrovich como jefe interino del departamento para acompañar a clientes corporativos VIP y organizar reuniones de negocios al margen .
Y a menudo abrir un documento de este tipo en Windows no funciona de inmediato. Alguien practica una solución alternativa en forma de mapeo de disco, alguien usa administradores de archivos que pueden trabajar con rutas largas: Far Manager, Total Commander y similares. Y muchos más vieron con tristeza cómo crearon un script PS, que fue mucho trabajo y que funcionó en un entorno de prueba con una explosión, en un entorno de combate se quejaron impotentes de una tarea imposible:
la ruta especificada, el nombre del archivo o ambos son demasiado largos . El nombre de archivo completo debe tener menos de 260 caracteres y el nombre del directorio debe tener menos de 248 caracteres.Resultó que 260 caracteres son suficientes "no solo para todos". Si está interesado en ir más allá de los límites de lo permitido, le pido un gato.
Estas son solo algunas de las tristes consecuencias de limitar la longitud de una ruta de archivo:
Un poco desviado del tema, noto que para la replicación DFS el problema considerado en el artículo no es terrible y los archivos con nombres largos viajan con éxito de un servidor a otro (a menos que, por supuesto, haya
hecho todo
correctamente el resto).
También me gustaría llamar la atención sobre la muy útil utilidad
robocopy que me ayudó más de una vez. Ella tampoco le tiene miedo a los caminos largos y sabe mucho. Por lo tanto, si la tarea se reduce a copiar / transferir datos de archivos, puede detenerse allí. Si necesita chamanizar con listas de control de acceso al sistema de archivos (DACL), mire hacia
subinacl . A pesar de su considerable antigüedad, mostró excelentes resultados en Windows 2012 R2. Los métodos de aplicación se discuten aquí.
Fue interesante para mí enseñar a trabajar con PowerShell a lo largo. Con él casi como en una anécdota barbuda sobre Ivan Tsarevich y Vasilisa la Bella.
Forma rápida
Vaya a
Linux y no utilice Windows 10/2016/2019 y active la configuración de directiva de grupo correspondiente / haga clic en el registro. No me detendré en este método en detalle, porque Ya hay muchos artículos en la red sobre este tema, por ejemplo
este .
Dado que en la mayoría de las empresas hay muchas, por decirlo suavemente, no versiones nuevas de sistemas operativos, este método es rápido solo para escribir en papel, a menos, por supuesto, que sea uno de esos afortunados que tienen pocos sistemas heredados y reinan Windows 10/2016/2019 .
Largo camino
Aquí hacemos una reserva de inmediato de que los cambios no afectarán el comportamiento del Explorador de Windows, pero permitirán utilizar rutas largas en los cmdlets de PowerShell, como Get-Item, Get-ChildItem, Remove-Item, etc.
Primero, actualice PowerShell. Se hace uno-dos-tres.
- Estamos actualizando .NET Framework a la versión no inferior a 4.5. El sistema operativo debe ser al menos Windows 7 SP1 / 2008 R2. La versión actual se puede descargar aquí , lea más información aquí .
- Descargue e instale Windows Management Framework 5.1
- Reinicia el auto.
Las personas trabajadoras pueden realizar los pasos descritos anteriormente manualmente, los perezosos, con la ayuda de SCCM, políticas, scripts y
enikeys de otras herramientas de automatización.
La versión actual de PowerShell se puede encontrar en la variable
$ PSVersionTable . Después de la actualización, debería ser algo como esto:

Ahora, al usar los cmdlets
Get-ChildItem y similares, en lugar de la
ruta habitual
, usaremos
LiteralPath .
El formato de las rutas será ligeramente diferente:
Get-ChildItem -LiteralPath "\\?\C:\Folder" Get-ChildItem -LiteralPath "\\?\UNC\ServerName\Share" Get-ChildItem -LiteralPath "\\?\UNC\192.168.0.10\Share"
Para la conveniencia de convertir rutas del formato familiar al formato
LiteralPath , puede usar esta función:
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"} }
Tenga en cuenta que no puede usar comodines (
* ,
? , Etc.) al especificar el parámetro
LiteralPath .
Además del parámetro
LiteralPath , en la versión actualizada de PowerShell, el cmdlet
Get-ChildItem recibió el parámetro
Depth , con el que puede establecer la profundidad de anidamiento para una búsqueda recursiva, lo usé un par de veces y quedé satisfecho.
Ahora no puede temer que su script PS se extravíe y no pueda ver archivos distantes. Por ejemplo, este enfoque me ayudó mucho al escribir un script para colocar el atributo "temporal" en los archivos en las carpetas DFSR. Pero esta es otra historia, que trataré de contar en otro artículo.
UPD 07/06/2019: artículo prometidoEspero comentarios interesantes de usted y le sugiero que responda una encuesta.
Enlaces utiles:docs.microsoft.com/en-us/dotnet/api/microsoft.powershell.commands.contentcommandbase.literalpath?view=powershellsdk-1.1.0docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem?view=powershell-5.1stackoverflow.com/questions/46308030/handling-path-too-long-exception-with-new-psdrive/46309524luisabreu.wordpress.com/2013/02/15/theliteralpath-parameter