programing

하위 항목 가져오기 및 공백 없음

batch 2023. 8. 24. 21:54
반응형

하위 항목 가져오기 및 공백 없음

파일 서버에서 작업하는 동안 스크립트가 손상된 하나의 이상한 폴더를 발견했습니다.폴더의 이름은 ASCII 값 160을 가진 하나의 문자로만 구성됩니다(분할하지 않는 공백, NBSP).시각적으로 해당 이름은 공백 문자와 동일합니다.

간단히 말하자면, 저는.Get-ChildItem이 폴더에서 실행 중이며 무한 루프에 진입하고 있습니다.실제로 상위 폴더에 대해 명령이 실행되고 문제가 있는 폴더가 다시 반환되어 스크립트가 무한 루프 상태가 되었습니다.

사용자 환경에서 쉽게 시뮬레이션할 수 있습니다.C:\temp폴더 이름이 NBSP로만 구성된 새 폴더를 만듭니다.숫자 키보드에서 alt를 누른 상태에서 0160을 눌러 입력할 수 있습니다.생성 후 실행

Get-ChildItem C:\Temp\ -Recurse

이름이 없는 폴더 목록이 무한히 표시됩니다. 폴더는 하나뿐입니다.

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

서버 및 클라이언트 OS에서 PowerShell 4 및 5를 사용하여 테스트한 결과 동일한 동작을 보였습니다.명령Get-Item또한 이 이름과 두 스위치 모두에 문제가 모두 있습니다.-Path그리고.-LiteralPath같은 방식으로 행동하고 있습니다.저도 노력했어요.[System.IO.Directory]클래스, 하지만 같은 문제가 있었습니다.

질문:이 이름을 가진 폴더를 오류로 보고하고 건너뛸 수 있도록 스크립트를 업데이트했는데, 더 현명한 방법이 있는지 궁금합니다.내 목표는 달리는 것입니다.Get-ChildItem또는 해당 폴더와 동등한 폴더입니다.

이것은 알려진 문제입니까?더 많은 사람들이 확인한다면 어딘가에 버그로 보고할 가치가 있습니까?

댓글에 언급된 것처럼, 당신은 곧 수정될 실제 오류를 발견했습니다.

그러나 폴더를 제외할 필요 없이 Get-ChildItem을 계속 사용하면서 최소한의 노력으로 적용할 수 있는 매우 허용 가능한 해결 방법이 있습니다.

유니코드 버전의 Get-ChildItem은 이 문제로 인해 문제가 발생하지 않습니다.(윈도우즈 10 환경의 Powershell 5.1에서 테스트됨) 사용하려면 다음과 같이 하십시오.

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

타고

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

추가주

UNC를 처리해야 하는 경우 UNC 유니코드 호출이 약간 다릅니다.

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

이 기능을 사용하여 올바르게 작동합니다.-LiteralPath매개 변수 대신-Path.

레퍼런스

Microsoft 설명서에서

-LiteralPath

하나 이상의 위치에 대한 경로를 지정합니다.-Path 매개 변수와 달리 -LiteralPath 매개 변수의 값은 입력한 대로 정확하게 사용됩니다.와일드카드로 해석되는 문자는 없습니다.경로에 이스케이프 문자가 포함된 경우에는 하나의 따옴표로 묶습니다.따옴표 하나를 사용하면 Windows PowerShell에서 문자를 이스케이프 시퀀스로 해석하지 않습니다.

원천

유니코드 접두사 규칙:파일, 경로 및 네임스페이스 이름 지정

보너스 유니코드 호출은 260자 경로 길이 제한을 해결하는 이점도 있습니다: 여기를 참조하십시오.

언급URL : https://stackoverflow.com/questions/44567844/get-childitem-and-non-breaking-space

반응형