Windows, PowerShell y rutas largas

Windows, PowerShell y rutas largas

Creo que, al igual que a mí, a usted también le ha tocado ver rutas como estas !!! Importante____Nuevo____!!! ¡No eliminar!!! Orden №98819-649-B del 30 de febrero de 1985 sobre el nombramiento de Kozlov Ivan Alexandrovich como interino del departamento encargado de atender a clientes VIP corporativos y de organizar reuniones de negocios en los pasillos.doc.

Y a menudo no se puede abrir un documento así en Windows de inmediato. Algunos practican soluciones alternativas como el mapeo de unidades, otros utilizan administradores de archivos que pueden trabajar con rutas largas: Far Manager, Total Commander y similares. Además, muchos han observado con tristeza cómo su script de PowerShell, que requirió mucho esfuerzo y funcionó a la perfección en un entorno de prueba, en producción se quejaba impotente de la tarea abrumadora: La ruta especificada, el nombre de 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.
Como resultó, 260 caracteres no son suficientes para "casi todos". Si tiene interés en superar los límites permitidos, le invito a seguir leyendo.

Aquí hay algunas de las tristes consecuencias de la limitación en la longitud de la ruta de archivo:

Desviándome un poco del tema, señalaré que para la replicación DFS el problema tratado en este artículo no es aterrador y los archivos con nombres largos viajan con éxito de servidor a servidor (si, por supuesto, todo lo demás lo han hecho correctamente) ha hecho bien).

También me gustaría llamar la atención sobre una utilidad muy útil que en varias ocasiones me ha salvado robocopy. Esta herramienta tampoco teme a las rutas largas y es capaz de hacer muchas cosas. Por lo tanto, si la tarea consiste en copiar/mover datos de archivos, se puede detener en ella. Si necesita hacer ajustes con las listas de control de acceso en el sistema de archivos (DACL), mire hacia subinacl. A pesar de su edad, demostró un gran rendimiento en Windows 2012 R2. Aquí se han considerado formas de aplicación.

Me interesaba aprender a trabajar con rutas largas en PowerShell. Es casi como el viejo chiste de Iván el Terrible y Vasilisa la Bella.

Método rápido

Pasar a Linux y no preocuparse de Windows 10/2016/2019 y habilitar el parámetro correspondiente en la política de grupo/o modificar el registro. No me detendré mucho en este método, ya que hay muchos artículos en línea sobre este tema, por ejemplo, esta.

Teniendo en cuenta que en la mayoría de las empresas hay muchas, por decirlo de alguna manera, versiones no recientes de sistemas operativos, este método es rápido solo para escribir en papel, a menos que seas de esos afortunados que tienen pocas sistemas heredados y usan Windows 10/2016/2019.

Método largo

Aquí aclaramos de inmediato que los cambios no afectarán el comportamiento del explorador de Windows, sino que permitirán usar rutas largas en los cmdlets de PowerShell, como Get-Item, Get-ChildItem, Remove-Item, etc.

Primero, actualizaremos PowerShell. Se hace en un abrir y cerrar de ojos.

  1. Actualizamos .NET Framework a una 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í, leer información adicional aquí.
  2. Descargamos e instalar el Windows Management Framework 5.1
  3. Reiniciamos la máquina.

Los trabajadores diligentes pueden realizar los pasos anteriores manualmente, los perezosos — mediante SCCM, políticas, scripts y otros medios de automatización.

La versión actual de PowerShell se puede conocer a través de la variable $PSVersionTable. Después de la actualización debería verse algo así:

Windows, PowerShell y rutas largas

Ahora, al usar los cmdlets Get-ChildItem y similares, en lugar del habitual Path usaremos LiteralPath.

El formato de las rutas será un poco diferente:

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

Para facilitar la conversión de rutas del formato habitual al formato LiteralPath se puede usar la siguiente 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 al establecer el parámetro LiteralPath no se pueden usar caracteres comodín (*, ? etc.).

Además del parámetro LiteralPath, en la versión actualizada de PowerShell, el cmdlet Get-ChildItem recibió el parámetro Depth, que permite establecer la profundidad de anidamiento para búsquedas recursivas. Lo he usado un par de veces y estoy satisfecho.

Ahora puedes estar tranquilo, sabiendo que tu script de PS no se desviará de su largo y tortuoso camino ni ignorará archivos lejanos. Personalmente, este enfoque me ayudó mucho al escribir un script para eliminar el atributo 'temporal' de los archivos en carpetas DFSR. Pero esa es otra historia, de la cual intentaré hablar en otro artículo. Espero sus comentarios interesantes y les propongo participar en la encuesta.

Enlaces útiles:
docs.microsoft.com/es-es/dotnet/api/microsoft.powershell.commands.contentcommandbase.literalpath?view=powershellsdk-1.1.0
docs.microsoft.com/es-es/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 los usuarios registrados pueden participar en la encuesta. Inicie sesión, por favor.

¿Es un problema de rutas largas relevante para ti?

  • Sí

  • Era relevante, pero ya lo resolví

  • Es molesto, pero no demasiado

  • No he pensado en ello, parece que todo funciona

  • No

  • Otro (especificar en los comentarios)

155 usuarios votaron. 25 usuarios se abstuvieron.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster