Pertanyaan Dapatkan-ChildItem dan non-breaking space


Saat mengerjakan server file saya, saya telah memperhatikan satu folder aneh yang merusak skrip saya. Folder memiliki nama yang hanya terdiri dari satu karakter dengan nilai ascii 160 (ruang non-breaking, NBSP). Secara visual nama itu sama dengan karakter ruang.

Sebentar, saya punya Get-ChildItem dieksekusi di folder ini dan memasuki lingkaran tanpa akhir. Perintah pada kenyataannya dieksekusi terhadap folder induk dan mengembalikan folder bermasalah lagi, jadi skrip saya masuk ke loop tanpa akhir.

Anda dapat dengan mudah mensimulasikan ini di lingkungan Anda sendiri. Di C:\temp folder buat folder baru yang namanya hanya terdiri dari NBSP. Anda dapat mengetik dengan menahan alt dan menekan 0160 pada keyboard numerik. Setelah membuatnya, jalankan

Get-ChildItem C:\Temp\ -Recurse

Anda akan mendapatkan daftar tanpa akhir folder tanpa nama, meskipun saya hanya memiliki satu folder itu.

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
. . .

Saya menguji ini dengan PowerShell 4 dan 5, di Server dan OS Klien dan perilaku yang sama. Perintah Get-Item mengalami masalah dengan nama ini, dan kedua switch -Path dan -LiteralPath berperilaku dengan cara yang sama. Saya juga mencoba [System.IO.Directory] kelas, tetapi itu memiliki masalah yang sama.

Pertanyaan: Saya telah memperbarui skrip saya untuk melaporkan folder dengan nama ini sebagai kesalahan dan melewatkannya, tetapi saya bertanya-tanya apakah ada cara lain yang lebih cerdas untuk melakukannya? Tujuan saya adalah lari Get-ChildItem atau setara dengan folder semacam itu.

Apakah ini masalah yang diketahui? Apakah layak dilaporkan di suatu tempat sebagai bug, jika dikonfirmasi oleh lebih banyak orang?


32
2018-06-15 12:43


asal


Jawaban:


Seperti disebutkan dalam komentar, Anda menemukan kesalahan sebenarnya yang diharapkan akan segera diperbaiki.

Namun, ada solusi yang dapat diterima yang dapat Anda terapkan dengan sedikit usaha sambil terus menggunakan Get-ChildItem tanpa perlu mengecualikan folder Anda.

Versi Unicode dari Get-ChildItem tidak menderita masalah ini. (Diuji pada Powershell 5.1 pada lingkungan Windows 10) Untuk menggunakannya, ganti saja

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

oleh

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

Catatan tambahan

Jika Anda perlu berurusan dengan UNC, unicode UNC panggilan sedikit berbeda.

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

Perhatikan bahwa saya menggunakan ini untuk bekerja dengan benar -LiteralPath parameter bukan -Path.

Referensi

Dari dokumentasi Microsoft

-LiteralPath

Menentukan lintasan ke satu atau beberapa lokasi. Tidak seperti parameter -Path, nilai parameter -LiteralPath digunakan persis seperti yang diketikkan. Tidak ada karakter yang ditafsirkan sebagai wildcard. Jika jalan termasuk karakter pelarian, lampirkan dalam tanda kutip tunggal. Tanda kutip tunggal memberitahu Windows PowerShell untuk tidak menafsirkan karakter apa pun sebagai urutan escape.

sumber

Mengenai konvensi awalan unicode: Penamaan File, Jalur, dan Ruang Nama

Bonus Panggilan unicode juga memiliki manfaat untuk memecahkan batas panjang 260 karakter path: Lihat disini


1
2017-10-05 20:03