2014-03-25 2 views
0

bloggsj 형식의 100 사용자 이름 목록과 joe.bloggs 형식 목록이 있습니다.Powershell 스크립트와 Robocopy에 대한 foreach 목록을 비교하십시오.

예를 들어 각 폴더에 프로필이 가득한 폴더가 있습니다. \\server1\profiles\bloggsj

list1과 일치하는 모든 폴더를 list2에서 \\server2\profiles\joe.bloggs으로 robocopy해야합니다. 당신이 열이있는 CSV가있는 경우 내가 psudocode 같은 것을 기대하고

...

$list1 = currentnames.txt 

$list2 = newnames.txt 

$newpath = \\server2\profiles 

$oldpath = \\server1\profiles 

foreach item in $list 1 
robocopy $oldpath + $list1.record to $newpath + list2.record 
+0

이전 이름을 새 이름으로 매핑하는 것이 있습니까? 2 열 또는 일부 CSV? – TheMadTechnician

답변

2

, 만일 oldname과 NewName으로의 헤더는 당신이 할 수 있습니다 :

$NameMap = import-csv .\namemap.csv 
gci \\server1\profiles|?{$_.PSIsContainer}|%{ 
    $source = $_.name 
    $dest = ($NameMap|?{$_.newname -match $source}|select -expandproperty oldname) 
    $_.MoveTo("\\Server2\Profiles\$dest") 
} 

를로드 할 것이다 CSV, 이전 서버 프로필의 폴더 목록을 가져오고, 각각에 대해 새 프로필 이름으로 새 서버로 이동하십시오.

CSV가 없으면 가정을해야하기 때문에 훨씬 복잡해지고 오류가 발생하기 쉽습니다. 수동으로 할 수 있습니다. 나는 모든 이전 이름이 성이며 첫 번째 이니셜이 이어지고 새 이름이 성 (도트) 성이라고 가정합니다. 그러면 목록이로드되고 새 이름을 반복하며 이전 가정에 따라 새 이름을 이전 이름과 연결하는 해시 테이블을 만듭니다. 그런 다음 이전 프로필의 폴더 목록을 가져와 해시 테이블에서 제공 한 새 프로필 이름으로 새 서버로 이동합니다.

$NameMap = @{} 
$OldNames = gc oldnames.txt 
$NewNames = gc newnames.txt 
ForEach($Name in $NewNames){ 
    $FindIt = "$($Name.Substring($Name.Length-1,1)).*?\.$($Name.Substring(0,$Name.Length-1))" 
    $NewName = $NewNames|?{$_ -match $FindIt} 
    $NameMap.Add($NewName,$Name) 
} 
GCI "\\Server1\Profiles"|?{$_.PSIsContainer}|%{$Dest = $NameMap[$_.Name];$_.MoveTo("\\Server1\Profiles\$Dest")} 

편집 : 좋아, 당신은 정말 당신이 CSV로드 매핑을 일단 당신이 할 수있는, ROBOCOPY를 사용할 필요가 있다고 생각하는 경우 :

$NameMap|%{Robocopy "\\server1\profiles\$($_.oldname)","\\server2\profiles\$($_.newname)","/E","/COPYALL"} 

을 아니면 만들기 - 네 - Own_Hashtable를 사용하는 경우 방법을 사용하면 다음과 같이 할 수 있습니다.

GCI "\\Server1\Profiles"|?{$_.PSIsContainer}|%{$Dest = $NameMap[$_.Name];RoboCopy $_.FullName,"\\Server1\Profiles\$Dest","/E","/COPYALL"} 
+0

moveTo가 아닌 robocopy 스크립트에서 이것을 어떻게 사용합니까? – meeeeeeeeee