item full ejemplos content childitem powershell get-childitem

full - powershell foreach



Get-ChildItem y espacio sin interrupciĆ³n (1)

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

Brevemente, tengo Get-ChildItem ejecutándose 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 la carpeta C:/temp crea una nueva carpeta cuyo nombre solo consta de 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. Command Get-Item también está teniendo problemas con este nombre, y los dos switches -Path y -Path se comportan de la misma manera. Intenté también la clase [System.IO.Directory] , pero estaba teniendo el mismo problema.

Pregunta: He actualizado mi script para reportar las carpetas con este nombre como un error y omitirlo, pero me pregunto si existe alguna forma más inteligente de hacerlo. Mi objetivo sería ejecutar 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?


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 el parámetro -Path 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.

source

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

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