Pregunta Get-ChildItem y espacio sin interrupciones


Mientras trabajaba en mis servidores de archivos, noté una carpeta extraña que rompió mi script. La carpeta tiene un nombre que consta de un solo carácter con el valor ascii 160 (espacio irrompible, NBSP). Visualmente, ese nombre es lo mismo que el carácter espacial.

En pocas palabras, tengo Get-ChildItem se está ejecutando en esta carpeta y está ingresando bucle infinito. El comando en realidad se ejecuta en la carpeta padre y devuelve otra carpeta problemática, por lo que mi script entró en un bucle infinito.

Puede simular fácilmente esto en su propio entorno. En C:\temp carpeta crea una nueva carpeta cuyo nombre consiste únicamente en NBSP. Puede escribir eso manteniendo presionado alt y presionando 0160 en el teclado numérico. Después de crearlo, ejecuta

Get-ChildItem C:\Temp\ -Recurse

obtendrás una lista interminable de carpetas sin nombre, aunque solo tengo esa única carpeta.

d-----        6/15/2017   2:20 PM
d-----        6/15/2017   2:20 PM
d-----        6/15/2017   2:20 PM
d-----        6/15/2017   2:20 PM
d-----        6/15/2017   2:20 PM
. . .

Probé esto con PowerShell 4 y 5, en Servidor y SO cliente y es el mismo comportamiento. Mando Get-Item está teniendo problema con este nombre, y ambos interruptores -Path y -LiteralPath se están comportando de la misma manera. Lo intenté también [System.IO.Directory] clase, pero estaba teniendo el mismo problema.

Pregunta: He actualizado mi script para reportar carpetas con este nombre como un error y omitirlo, pero me pregunto si hay alguna forma más inteligente de hacerlo. Mi objetivo sería correr Get-ChildItem o equivalente contra dicha carpeta.

¿Es esto un problema conocido? ¿Valdría la pena informarlo en algún lugar como un error, si es confirmado por más personas?


32
2018-06-15 12:43


origen


Respuestas:


Como se mencionó en el comentario, usted encontró un error real que, con suerte, pronto será solucionado.

Sin embargo, hay una solución muy aceptable que puede aplicar con un esfuerzo mínimo mientras continúa usando Get-ChildItem sin la necesidad de excluir su carpeta.

La versión Unicode de Get-ChildItem no sufre este problema. (Probado en Powershell 5.1 en un entorno Windows 10) Para usarlo, simplemente reemplace

Get-ChildItem  -Path 'c:\__tmp' -recurse 

por

Get-ChildItem  -LiteralPath '\\?\c:\__tmp' -recurse 

Nota adicional

Si tiene que tratar con UNC, la llamada Unicode de UNC es ligeramente diferente.

Get-ChildItem  -LiteralPath '\\?\UNC\127.0.0.1\c$\__tmp' -recurse 

Tenga en cuenta que uso para que esto funcione correctamente -LiteralPath parámetro en lugar de -Path.

Referencias

De la documentación de Microsoft

-LiteralPath

Especifica una ruta a una o más ubicaciones. A diferencia del parámetro -Path, el valor del parámetro -LiteralPath se usa exactamente como se escribe. No se interpretan los caracteres como comodines. Si la ruta incluye caracteres de escape, enciérrelo entre comillas simples. Las comillas simples indican a Windows PowerShell que no debe interpretar ningún carácter como secuencia de escape.

fuente

En cuanto a la convención de prefijo Unicode: Nombrar archivos, rutas y espacios de nombres

Prima La llamada Unicode también tiene la ventaja de resolver el límite de longitud de ruta de 260 caracteres: mira aquí


1
2017-10-05 20:03