2009-04-18 8 views
1

Powershell 1.0에서 이상한 일이 발생했습니다. Powershell이 ​​어떻게 반응하는지 이해할 수 없습니다.내부 논리가있는 Powershell 문제

상황 : 나는 편지 전자에 의해 드라이브에 여러 zip 파일을 만들었습니다

는 지금은 그들 모두를 삭제합니다. 그러나 내 e : 드라이브에는 더 많은 zip 파일이 있습니다. 그래서이 특정 폴더 및 해당 하위 폴더에있는 파일 만 삭제하려고합니다.

나는이에 사용할 명령은 다음과 같습니다 \ 테스트 :

PS E:\> Get-ChildItem -Path E:\Webdev\icons\ -Include *.zip -Recurse -Name -Force | Remove-Item -Force 

그러나, 실행시, 나는 모든

이 경로 E를 찾을 수 없다는 오류의 한 무리를 얻을. 지퍼가 있기 때문에 존재하지 않습니다.

실제로 test.zip 파일은 e 아래에 있습니다. 스크립트를 넘겨주는 아이콘 폴더 아래에 존재합니다.

해결 방법은 아이콘 폴더로 디렉토리를 변경하고 거기에서 명령을 실행하는 것입니다.

그러나 이것은 논리적이지 않습니다. 파일을 삭제해야하는 디렉토리를 말하면 파일 만 삭제해야합니다. Powershell이 ​​현재 디렉토리에서 파일을 찾기 시작한 이유는 나에게 수수께끼입니다.

아무에게도 설명해 주시겠습니까?

답변

8

당신은 파이프 라인의 끝에서 Remove-Item을 제거 할 경우 반환되는 모든 경로 이름은 당신이 Get-ChildItem-Path 매개 변수를 통해 입력 된 경로에 상대적인 것을 볼 수 있습니다. 따라서 Remove-Item은 현재 디렉토리에서 모든 경로를 찾습니다. Get-ChildItem이 반환됩니다.

capar가 제안 했으므로 여기서 -Name 매개 변수가 문제입니다. 의도 한대로

Get-ChildItem -Path E:\Webdev\icons\ -Include *.zip -Recurse -Force | Remove-Item -Force 

가 작동합니다 : 그것을 삭제하면 Remove-Item 쉽게 파일을 찾을 수 있습니다 File 객체를 할 수 있도록 최선을 다하고 있습니다. 객체로 뭔가를 해결할 수 있다면 문자열 수준으로 내려 가지 마십시오 :-)

+0

+1 사실 내 솔루션 인 –

+0

보다 효과적이며 간단합니다. 트릭을 수행했습니다. 그 특정 매개 변수가 결과에 어떻게 영향을 미치는가는 이상합니다. – KdgDev

+2

매개 변수는 FileInfo 개체 대신 문자열을 반환하도록 cmdlet에 지시합니다. Remove-Item은 FileInfo를 가져올 때 제거 할 항목을 찾을 수있을 정도로 똑똑하지만 문자열로만 경로 이름을 지정할 수 있습니다.그것들은 당신이 지정한 경로와 관련이 있기 때문에 추측 할 수 있습니다. -Name 매개 변수는 아마도 표시 용으로 만 존재합니다. 그러나 객체 사용은 파이프 라인에서 훨씬 쉽습니다. – Joey

3

Get-ChildItem은 검색 경로 다음에 -Name을 사용할 때 파일 이름을 더한 경로 부분을 반환하는 것으로 보입니다. 이 파일 이름은 현재 디렉터리와 반환 된 파일 이름을 사용하는 Remove-Item으로 파이프됩니다.

-FullName을 사용하여 해당 명령을 시도했으나 작동하지 않는 것으로 보입니다.이 명령을 Select-Object에 파이프하여 Full-name을 지정하고 Remove-Item에 파이프 할 수 있어야합니다.

시도 :

Get-ChildItem -Path E:\Webdev\icons -Include *.zip -Recurse | 
Select-Object -Property FullName | Remove-Item -Force