Powershell脚本与Robocopy的foreach列表比较

Powershell脚本与Robocopy的foreach列表比较,powershell,robocopy,Powershell,Robocopy,我有一个列表,其中100个用户名的格式是bloggsj,另一个列表的格式是joe.bloggs 我有一个文件夹,里面有很多配置文件,每个文件夹名为\\server1\profiles\bloggsj 我需要将与列表1匹配的所有文件夹自动复制到列表2中的\\server2\profiles\joe.bloggs 我期待像psudocode这样的东西 $list1 = currentnames.txt $list2 = newnames.txt $newpath = \\server2\prof

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

我有一个文件夹,里面有很多配置文件,每个文件夹名为
\\server1\profiles\bloggsj

我需要将与列表1匹配的所有文件夹自动复制到列表2中的
\\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

如果您的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"}

你有把旧名字映射到新名字的东西吗?一个有两列的CSV或者类似的东西?在robocopy脚本中使用它而不是moveTo怎么样?