2011-12-26 4 views
10

경로에 대괄호가 있으면 PowerShell에서 이상한 동작이 발생합니다. 예를 들어, 폴더에있는 경우 :경로에 대괄호가있는 이상한 동작

C:\Some Movie [2011] 

mkv 파일을 포함하면 입력 :

ls *.mkv 

아무것도 반환되지 않습니다! [2011]가 와일드 카드로 간주되기 때문에 실패

Get-ChildItem 'C:\Some Movie [2011]\*.mkv' 

: 나는 문제가 PowerShell에서 그런 짓을하려고한다는 사실에있다 생각합니다. 나는 다음과 같은 명령을 사용하여 이러한 폴더에서 모든 mkv를 가져 오지 수 있었다 :

Get-ChildItem -LiteralPath 'C:\Some Movie [2011]' -Include *.mkv 

을하지만 난 이름 바꾸기-Item 명령에 그 결과를 먹이려고하면 실패합니다.

Get-ChildItem -LiteralPath 'C:\Some Movie [2011]' -Include *.mkv | Rename-Item -NewName "movie.mkv" 

괄호없이 폴더에 같은 작업은 문제없이 실행됩니다. 어떤 아이디어?

+0

폴더에 둘 이상의 mkv 파일이 있으면 어떻게됩니까? 모두 이름을 movie.mkv로 바꿀 수는 없습니다. –

+0

네, 단 하나의'mkv' 파일을 가지고 있습니다. 이름은 알지 못하기 때문에 와일드 카드가 필요합니다. – lalibi

답변

7

내 질문에 대한 위의 내용을보십시오 (위). 해당 폴더에 하나의 mkv 파일 만있는 경우 예상대로 작동합니다. Rename-Item은 LiterlPath (v3에서 고정)를 지원하지 않으므로 .NET에 의지 할 수 있습니다. 또한 Include 대신 -Filter를 사용하도록 (단 하나의 확장자로 필터링 할 때) 더 빨리 수행하는 것이 좋습니다.

Get-ChildItem -LiteralPath 'D:\Some Movie [2011]' -Filter *.mkv | Foreach-Object{ 
    $NewName = Join-Path -Path $_.DirectoryName -ChildPath 'movie.mkv' 
    [System.IO.File]::Move($_.FullName,$NewName) 
} 
+0

이것은 아름답게 작동합니다. 고맙습니다. – lalibi

+0

+1 정말 멋진 작품입니다. – Aaron

4

Rename-Item cmdlet에 알려진 버그가 있습니다 (that doesn't handle filenames with brackets). 링크에서 "2010 년 1 월 29 일에 게시 됨 Microsoft"로 스크롤합니다.

대신 Move-Item cmdlet을 "-LiteralPath"옵션으로 사용하는 것이 좋습니다. 그러나 catch는 디렉터리 이름에 대괄호가 포함되어 있지 않은 경우에만 작동한다는 것이므로 사용자의 상황에 도움이 될 것 같지 않습니다.

확실하지 않지만 DOS (cmd)와 비슷한 것을 시도 할 수 있습니다. 그렇지 않으면 .Net 언어에서 이름 바꾸기를 실행하는 데 어려움을 겪을 수 있습니다.

마이크로 소프트가 며칠 전에 Powershell 3.0을 발표 한 것처럼 보입니다. 약속은 없지만 설치를 시도해보고 버그가 수정되었는지 확인할 수 있습니다.

+0

새 버전을 알려 주셔서 감사합니다. – lalibi