2014-02-19 3 views
1

폴더 구조에 "&"이 포함되어있는 경우 언제든지 "and"단어로 바꾸고 싶습니다. powershell을 사용하여이 작업을 수행 할 수 있다고 가정하지만 PowerShell은 극도로 낯선 사람입니다.재귀 심볼을 PowerShell로 바꿉니다

감사합니다.

get-childitem -recurse ./ *&* | where-object { $_.Name -like "*&*" } | % {rename-item $_ -newname $_.Name.Replace("&","and") -whatif} 

이 폴더 만 이름을 변경합니다 : 여기

내 시도?

gci -recurse | where-object { $_.Name -like "*&*" } | ?{ $_.PSIsContainer } | % {rename-item $_FullName $_FullName.Replace("&","and")} 

편집 : 지정된 대상 경로 또는 장치 이름을 나타 내기 때문에 이름을 바꿀 수 없습니다 : Windows 서버에 PowerShell을 2008 R2

+0

어떤 방법으로 당신의 시도가 성공하지 않는 이유는 무엇입니까? 당신이 얻은 오류는 무엇이며 오류를 해결하기 위해 무엇을 시도 했습니까? 또한, 어떤 PowerShell 버전을 사용하고 있습니까? –

+0

편집을 참조하십시오. 감사! – shenn

답변

2

내가 한 이유 원 ž 의심 작동하는 방법을 보여줍니다 이름 바꾸기가 실패하면 Rename-Item에 이름이 아닌 전체 경로가 포함 된 NewName 매개 변수가 제공됩니다. 여기서 두 번째 문제는 코드가 파이프 라인의 다른 객체를 무효화 할 수있는 위에서 아래로 이름을 변경하려고 시도한다는 것입니다. 나는 가장 긴 경로를 먼저 처리함으로써이 문제를 해결하려고 노력했다. 따라서 PSPath.length에 내림차순으로 정렬했다. 내 테스트 폴더에서 작동했습니다.

get-childitem ./ -Recurse -Filter "*&*" | 
    ? { $_.PSIsContainer } | 
    sort { ($_.PSPath).length } -Descending | 
    % { 
     $_ | Rename-Item -NewName ($_.Name -replace "&","and") 
    } 
+0

부모 항목의 이름이 바뀐 경우 DirectoryInfo 객체'$ _. FullName'이 부모 항목의 업데이트 된 경로를 사용하므로 폴더 이름 바꾸기 순서에 문제가 없습니다. 문제는 '$ _. FullName.Replace ("&", "and")가 항목을 옮기고 항목의 이름을 바꾸지 않고 싶다는 것이 었습니다. 당신의 솔루션은 잘 작동하지만 분류 작업은 불필요하며 제거가 가능합니다. –

+0

로버트에게 감사드립니다. 나는 다시 테스트하여 정렬을 주석 처리하고 실패합니다. 그것이 '경로의 일부를 찾을 수 없습니다'라고 말해줍니다. 테스트 트리의 상태를 볼 때, 그것은 실패한 가장 깊은 dir입니다. – andyb

+0

Robert - 내 테스트 구조에 맞춰 코드를 시도했지만 실패했습니다. \ A와 B \ C \ C \ A & \ C \ A와 B의 \ 전자 B & F \ C \ C & D – andyb

0

은 또한이 일하지만 행운 중 하나 (이 하나가 오류를 제공 시도

당신이 바로 그 경로에있는 생성에서 테스트 폴더와 파일의 몇 가지. 'C : \ 임시 \의 AAA'폴더는

PS C:\> gci C:\Temp\aaa -recurse | where {$_.name -match '&'} | Rename-Item -newname {$_.name -replace '&','and'} -whatif 
What if: Performing the operation "Rename Directory" on target "Item: C:\Temp\aaa\ad & il Destination: C:\Temp\aaa\ad and il". 
What if: Performing the operation "Rename Directory" on target "Item: C:\Temp\aaa\ad & il\hin\di&st&t Destination: C:\Temp\aaa\ad & il\hin\diandstandt". 
What if: Performing the operation "Rename File" on target "Item: C:\Temp\aaa\ad & il\hin\adilll&hindist &an.txt Destination: C:\Temp\aaa\ad & il\hin\adilllandhi ndist andan.txt". 
1

하여 오류의 원인은 전체 경로에 & 문자, 심지어 부모 폴더를 대체 할 것입니다.

예를 들어 c:\me & my\something & another $ _. FullName.Replace ("&", "and") 폴더의 이름을 c:\me and my\something and another으로 변경한다고 가정 해보십시오. 그러나이 작은 테스트 시나리오에서 부모 폴더 이전에 하위 폴더의 이름을 변경 했으므로 의 자식이되는 폴더는 c:\my & my의 자식이되고 c:\me and my의 자식이됩니다 (그 위에 우리는 그것을 이동하려고합니다 폴더에있는 존재하지 않는

(나는 Get-Help Rename-Item -Parameter NewName을 실행하여 가지고) Rename-Item의 도움말 섹션에서 :.

Specifies the new name of the item. Enter only a name, not a path and name. If you enter a path that is different 
from the path that is specified in the Path parameter, Rename-Item generates an error. To rename and move an item, 
use the Move-Item cmdlet. 

그래서 우리는 단지 NewName 매개 변수에 폴더의 이름을 포함 할 .

마지막으로 @andyb가 지적했듯이 부모 경로가 그대로 유지되도록 항목의 이름을 하위 폴더, 부모 폴더 순으로 바꿔야합니다. @ andyb가 제안한 폴더 정렬 방법은 FullName 경로의 길이로 정렬하는 것이 좋습니다.

따라서 다음은 매우 잘 작동합니다.

Get-ChildItem .\ -Recurse -Filter "*&*" | 
    Where { $_.PSIsContainer } | 
    Sort { $_.FullName.Length } -Descending | 
    Foreach { 
     $newName = $_.Name.Replace("&", "and") 
     Rename-Item $_.FullName $newName 
    } 

편집 : 때문에 지적 @andyb misstake에, 폴더 경로 길이의 내림차순으로 정렬을 포함하도록 업데이트되었습니다.

0

단계 : 우리가 부모에게 아이에서 이름을 바꿀 수 있도록 1. 일치하는 항목

  1. 역 항목

  2. 그들에게

코드의 이름을 변경 :

$matchedItems = ls D:\test -Recurse | where { $_.Name -like '*&*' } 

[array]::Reverse($matchedItems) 

$matchedItems | foreach { 
    $newName = "" 
    if($_.PSIsContainer){ 

    $newName = Join-Path $_.Parent.FullName ($_.BaseName -replace '&' , 'and') 
    } 
    else { 

    $newName = Join-Path $_.Directory.FullName ($_.BaseName -replace '&' , 'and') 
    } 


    $_ | Rename-Item -NewName $newName 
} 

출력 :

PS C:\> ls D:\test -Recurse | select FullName 

FullName                             
--------                             
D:\test\& New Foder                          
D:\test\New & folder                          
D:\test\New folder&                          
D:\test\test & test.txt                         
D:\test\& New Foder\New & folder                       
D:\test\& New Foder\New folder&                       
D:\test\& New Foder\test & test.txt                      
D:\test\New folder&\& New Foder                       
D:\test\New folder&\New & folder                       
D:\test\New folder&\New folder&                       
D:\test\New folder&\test & test.txt                      
D:\test\New folder&\& New Foder\New & folder                    
D:\test\New folder&\& New Foder\New folder&                    
D:\test\New folder&\& New Foder\test & test.txt                   



PS C:\> $matchedItems = ls D:\test -Recurse | where { $_.Name -like '*&*' } 
[array]::Reverse($matchedItems) 

$matchedItems | foreach { 
    $newName = "" 
    if($_.PSIsContainer){ 
    $newName = Join-Path $_.Parent.FullName ($_.BaseName -replace '&' , 'and') 
    } 
    else { 

    $newName = Join-Path $_.Directory.FullName ($_.BaseName -replace '&' , 'and') 
    } 


    $_ | Rename-Item -NewName $newName 
} 



PS C:\> ls D:\test -Recurse | select FullName 

FullName                             
--------                             
D:\test\and New Foder                         
D:\test\New and folder                         
D:\test\New folderand                         
D:\test\test and test                         
D:\test\and New Foder\New and folder                      
D:\test\and New Foder\New folderand                      
D:\test\and New Foder\test and test                      
D:\test\New folderand\and New Foder                      
D:\test\New folderand\New and folder                      
D:\test\New folderand\New folderand                      
D:\test\New folderand\test and test                      
D:\test\New folderand\and New Foder\New and folder                  
D:\test\New folderand\and New Foder\New folderand                  
D:\test\New folderand\and New Foder\test and test  
+0

길이가 1에서 0까지의 항목에 대해 일치 항목을 액세스하는 경우 [array] :: Reverse ($ matchedItems) –

관련 문제