Windows, PowerShell y rutas largas

Windows, PowerShell y rutas largas

Creo que tú, como yo, has visto caminos como este más de una vez. !!! Importante____Nuevo____!!! ¡¡¡No borrar!!! Orden No. 98819-649-B del 30 de febrero de 1985 sobre el nombramiento de Ivan Aleksandrovich Kozlov como jefe interino temporal del departamento de apoyo a clientes corporativos VIP y organización de reuniones de negocios al margen.doc.

Y, a menudo, no podrá abrir dicho documento en Windows de inmediato. Algunas personas practican una solución alternativa mediante el mapeo de discos, otras usan administradores de archivos que pueden funcionar con rutas largas: Far Manager, Total Commander y similares. Y muchos más observaron con tristeza cómo el guión de PS que crearon, en el que se invirtió mucho trabajo y que funcionó a las mil maravillas en el entorno de prueba, en un entorno de producción se quejaba impotente de una tarea imposible: 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.
Resulta que 260 caracteres son suficientes "no sólo para todos". Si está interesado en ir más allá de los límites de lo permitido, consulte el gato.

Estas son sólo algunas de las desafortunadas consecuencias de limitar la longitud de la ruta del archivo:

Apartándome un poco del tema, observo que para la replicación DFS el problema discutido en el artículo no es terrible y los archivos con nombres largos viajan con éxito de un servidor a otro (si, por supuesto, todo lo demás es correcto). bien hecho).

También me gustaría llamar su atención sobre una utilidad muy útil que me ha ayudado más de una vez. robocopy. Tampoco le temen a los caminos largos y puede hacer mucho. Por lo tanto, si la tarea se reduce a copiar/transferir datos de archivos, puede detenerse allí. Si necesita jugar trucos con las listas de control de acceso al sistema de archivos (DACL), mire hacia otro lado subinacl. A pesar de su avanzada edad, funcionó excelentemente en Windows 2012 R2. Aquí Se consideran los métodos de aplicación.

Estaba interesado en enseñar cómo trabajar con rutas largas de PowerShell. Con él es casi como en un chiste barbudo sobre Ivan Tsarevich y Vasilisa la Bella.

Forma rápida

Cambie a Linux y no se preocupe por Windows 10/2016/2019 y habilite la configuración de política de grupo adecuada/modifique el registro. No me detendré en este método en detalle, porque... Ya hay muchos artículos sobre este tema en Internet, por ejemplo, este.

Teniendo en cuenta que la mayoría de las empresas tienen muchas, por decirlo suavemente, no las últimas versiones de los sistemas operativos, este método es rápido solo para escribir en papel, a menos, por supuesto, que seas uno de esos afortunados que tienen pocos sistemas heredados y Windows 10. /2016/2019 reina supremo.

largo camino

Inmediatamente hagamos una reserva aquí de que los cambios no afectarán el comportamiento del Explorador de Windows, pero permitirán usar rutas largas en los cmdlets de PowerShell, como Get-Item, Get-ChildItem, Remove-Item, etc.

Primero, actualicemos PowerShell. Se hace una, dos, tres veces.

  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. Puedes descargar la versión actual. aquí, leer más información aquí.
  2. Descargar e instalar Windows Management Framework 5.1
  3. Reiniciamos la máquina.

Las personas trabajadoras pueden realizar los pasos descritos anteriormente manualmente, las personas perezosas pueden hacerlo con la ayuda de SCCM, políticas, scripts y 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 verse así:

Windows, PowerShell y rutas largas

Ahora al usar cmdlets Get-ChildItem y similares en lugar de lo habitual Path usaremos Ruta literal.

El formato de la ruta será ligeramente diferente:

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

Para la conveniencia de convertir rutas del formato habitual al formato Ruta literal puedes 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 al configurar el parámetro Ruta literal No puedes usar comodines (*, ? и т.д.).

Además del parámetro Ruta literal, en la versión actualizada del cmdlet de PowerShell Get-ChildItem tengo el parametro Perfil, con el que puedes establecer la profundidad de anidamiento para la búsqueda recursiva, lo usé un par de veces y quedé satisfecho.

Ahora no tiene que preocuparse de que su script PS se pierda en el largo y espinoso camino y no pueda ver archivos distantes. Por ejemplo, este enfoque me ayudó mucho al escribir un script para restablecer el atributo "temporal" de los archivos en las carpetas DFSR. Pero esa es otra historia, que intentaré contar en otro artículo. Espero recibir comentarios interesantes de usted y le sugiero que responda la encuesta.

Enlaces de interés:
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 los usuarios registrados pueden participar en la encuesta. Registrarsepor favor

¿Es relevante para usted el problema de los caminos largos?

  • Era relevante, pero ya decidido.

  • Interfiere, pero no mucho.

  • No lo pensé, todo parece estar funcionando.

  • No

  • Otro (especifique en los comentarios)

155 usuarios votaron. 25 usuarios se abstuvieron.

Fuente: habr.com

Añadir un comentario