我有一个列表,其中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
答案 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"}