1

我正在尝试将虚拟服务器中的 C:\windows 中的所有 .dll 文件复制到新的虚拟服务器。我已经设法获取所有 .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,但不知道如何使用它将所有这些移动到新的虚拟服务器。

编辑:

[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"}
foreach($dll in $Files){
$destinationName +=  
cp $dll.fullname $destinationName}

我想让每个特定文件的路径字符串为“\$server2\C$\windows\ ..\ ..”。

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

4

1 回答 1

2

事实上,你真的快到了。

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

foreach($dll in $Files){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\rather\deep\file.dll,并且正则表达式替换路径的一部分\\SourceServer并替换它,\\DestinationServer以便路径的其余部分保持不变。也就是说,现在将是\\TargetServer\C$\windows\some\rather\deep\file.dll。这种方法消除了对$destinationName变量的需要。该Test-Path位确保文件的父文件夹在复制之前远程存在,否则将失败。

于 2012-08-03T15:18:32.887 回答