Powershell脚本与Robocopy的foreach列表进行比较

时间:2014-03-25 16:10:29

标签: powershell robocopy

我有一个列表,其中100个用户名格式为bloggsj,另一个列表格式为joe.bloggs

我有一个文件夹,其中包含每个文件夹,例如\\server1\profiles\bloggsj

我需要将列表1中与list1匹配的所有文件夹复制到\\server2\profiles\joe.bloggs

我期待像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

1 个答案:

答案 0 :(得分:2)

如果你有一个包含2列的CSV,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")}

编辑:好的,如果你真的觉得你需要使用RoboCopy,一旦你加载了映射CSV,你可以这样做:

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

或者,如果您使用Make-Your-Own_Hashtable方法,您可以执行以下操作:

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