使用Powershell将所有.dll文件从一个虚拟服务器复制到另一个虚拟服务器

使用Powershell将所有.dll文件从一个虚拟服务器复制到另一个虚拟服务器,powershell,scripting,virtual-machine,code-cleanup,Powershell,Scripting,Virtual Machine,Code Cleanup,我正在尝试将所有.dll文件从虚拟服务器中的C:\windows复制到新的虚拟服务器。我已经设法获取了所有的.dll文件,但是我找不到将它们复制到新虚拟服务器的方法,我想知道是否有人知道如何使用Powershell实现这一点 [void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic') $server = [Microsoft.VisualBasic.Interaction]::InputBox

我正在尝试将所有.dll文件从虚拟服务器中的C:\windows复制到新的虚拟服务器。我已经设法获取了所有的.dll文件,但是我找不到将它们复制到新虚拟服务器的方法,我想知道是否有人知道如何使用Powershell实现这一点

[void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic') 
$server = [Microsoft.VisualBasic.Interaction]::InputBox("Enter the server name with files you want to copy", "Server")
$server2 = [Microsoft.VisualBasic.Interaction]::InputBox("Enter the server name you want files copied to", "Server")
$destinationName = ("\\" + $server2 + '\C$\windows')
$Files = Get-ChildItem -Path ("\\" + $server + '\C$\windows') -recurse | Where {$_.extension -eq ".dll"}
要将$Files变量复制到新的VM,我需要做什么?我知道copy item cmdlet,但不知道如何使用它将所有这些内容移动到新的虚拟服务器

编辑:

对于每个特定的文件,我想将路径字符串设置为“\$server2\C$\windows\..\..”


此时,如果代码运行,它将使每个文件/目录显示为“\$server2\C$\windows”,而不会获得完整路径

事实上,你就快到了

$Files=Get ChildItem…
使
$Files
成为一个项目数组,并且由于Powershell设计用于处理对象,因此您只需将
$Files
用作
复制项目的参数。需要注意的是,无论出于何种原因,
Copy Item
都不会使用通过
Get ChildItem
获取的对象的完整路径属性(相反,它只获取文件名,因此您必须在该目录中才能工作),因此最简单的方法是:

foreach($Files中的dll){cp$dll.fullname$destinationName}

要在保留目录结构的同时进行复制,您需要采用起始完整路径,并对其进行修改以反映新的根目录/服务器。这可以在与上面类似的一行中完成,但为了清晰易读,我将其扩展为以下多行设置:

foreach($dll in $Files){
    $target = $dll.fullname -replace "\\\\$server","\\$server2"
    $targetDir = $($dll.directory.fullname -replace "\\\\$server","\\$server2")
    if(!(Test-Path $targetDir){
        mkdir $targetDir
    }
    cp $dll.fullname $target
}
为了解释这一点,
$target…
行采用当前
$dll
的完整路径,例如
\\SourceServer\C$\windows\some\lay\deep\file.dll
,并且regex替换路径中显示
\\SourceServer
的部分,并将其替换为
\\DestinationServer
,以便路径的其余部分保持不变。也就是说,它现在将是
\\TargetServer\C$\windows\some\reat\deep\file.dll
。此方法不需要使用
$destinationName
变量。
测试路径
位确保文件的父文件夹在复制之前远程存在,否则将失败。

谢谢!然而,我注意到字符串中有一件事,当我测试它时,它所做的只是将所有内容直接复制到新VM上的C:\Windows。我注意到这是因为我将$server2指定为一个静态字符串,但是我希望附加到此字符串并附加到每个文件位置。我个人对如何解释这一点有点困惑,所以我认为显示代码也会更有意义。感谢SpellingD,这更接近我想要得到的。我对此进行了测试,它在大部分情况下都能正常工作,但是我现在没有在指定的路径中获得任何目录。是否有一种方法可以使用此方法递归并获取Windows中的所有目录?您正在筛选以仅查找.dll文件,因此它将找不到任何要复制的目录。我添加的更新创建了目标计算机上所需的目录,而不是假设这些目录已经存在。如果您仍然有问题,您可能需要考虑查看<代码> RoopPox< /Cord>内置实用程序——
foreach($dll in $Files){
    $target = $dll.fullname -replace "\\\\$server","\\$server2"
    $targetDir = $($dll.directory.fullname -replace "\\\\$server","\\$server2")
    if(!(Test-Path $targetDir){
        mkdir $targetDir
    }
    cp $dll.fullname $target
}