2012-03-29 2 views
0

나는 그것이 매우 유용하고 강력한 :파워 쉘 값

을 찾아 원인 나는 최근, PowerShell을 사용하기 시작를 포함하는 재귀 적 변화 경로 그래서 이것은 시나리오입니다 . 최신 프로그램이 추가되어 쉼표로 인해 실패합니다. 기본적으로 쉼표를 예를 들어 "-"로 바꾸고 싶습니다.

이것은 내가 가지고있는 것입니다. 그리고 그것은 효과가 있지만 비효율적이라고 생각합니다. 스크립트는 예상대로 작동하지만 한 경로가 변경 되 자마자 원래 경로가 변경 되었기 때문에 나머지 경로가 변경됩니다. :)

$folderpath = "C:\pathcontainingcomma" 
foreach ($i in get-childitem $folderpath -Recurse) { 
    $name = $i.name.replace(","," - ") 
    Rename-Item -Path $i.fullname -NewName $name -Force -Verbose 
} 

내가 당신이있는 경우에 질문을하시기 바랍니다, 내가 충분히 잘 설명 바랍니다 어떤 :

답변

1

당신은 당신이 아직도 처리해야 경로를 변경하는 것을 방지하기 위해 안쪽에서 바깥에서 이름을 변경해야하는, 그래서 것 다음 작동합니다 같아요 :

$folderpath = 'C:\pathcontainingcomma' 
$items = Get-ChildItem -Recurse $folderpath 
[Array]::Reverse($items) 
$items | ForEach-Object { Rename-Item -Path $_ -NewName ($_ -replace ',', '-') -Force -Verbose } 
+0

'Path'매개 변수가 null이므로 바인딩 할 수 없습니다. 여기에 뭔가가 빠졌습니까? 나는 어느 곳에서나 $ i를 볼 수 없다. $ items가 아니었다면이 오류가 발생한다. 이름 바꾸기 : 'System.Object []'을 매개 변수에 필요한 'System.String'유형으로 변환 할 수 없다. '통로'. 지정된 meth od는 지원되지 않습니다. 예를 들어, $ items.Name이어야합니까? –

+1

죄송합니다. 코드를 너무 충실히 복사했습니다. foreach() {}는 보통 PowerShell에서 매우 관용적 인 해결책이 아니므로 파이프 라인을 사용하여 다시 작성했습니다. – Joey

+0

그리고 '$ items'는 배열입니다 (실제 루프보다 먼저 반대로됩니다). 'ForEach-Object'는'$ _'을 통해 현재 파이프 라인 요소에 접근을 허용합니다 (보통 scriptblocks와 관련된 파이프 라인에서와 같이). – Joey

1

을이 시도 :

Get-ChildItem $folderPath -r '*,*' -name | foreach { 
$p = "$folderPath\$_"; rename-item $p ($p -replace ',',' - ') -whatif } 

-Name 출력 순서가 -Name 인 경우 상위 레벨 디렉토리의 이름을 먼저 바꿀 수 있고 출력을 통해 foreach 할 때 대체 경로가 경로의 모든 요소를 ​​수정하므로 매개 변수를 사용하면 편리합니다.