Powershell:将文件从网络复制到 PC 的 base off PC 型号

Powershell: Copy files from network to PC's base off PC model

我目前的任务是在 excel 电子表格中列出 IP 及其计算机型号。示例:

0.0.0.1 惠普 ProBook 640 G1

0.0.0.3 惠普 ProBook 640 G4

0.0.0.4 惠普 ProBook 640 G1

0.0.0.2 惠普 ProBook 640 G2

0.0.0.5 惠普 ProBook 640 G1

0.0.0.6 惠普 ProBook 640 G3

0.0.0.9 惠普 ProBook 640 G3

0.0.0.8 惠普 ProBook 640 G2

我首先需要ping每个IP看PC是否正常。如果 PC 正常运行,那么我需要将特定的组文件从网络复制到基于 PC 型号的 PC。例如:

如果 PC 0.0.0.1 已启动且其型号为 HP ProBook 640 G1,我需要将文件从 \network\HP_ProBook_640_G1 目录复制到 C:\path\to\directory。如果 PC 是 0.0.0.3,型号是 HP ProBook 640 G4,那么我会将文件从 \network\HP_ProBook_640_G4 目录复制到 C:\path\to\directory。我将如何通过 powershell 编写此脚本以进行迭代,确定主机是否处于活动状态并确定 PC 型号,然后将文件从指定的网络目录复制到指定的 C:\path\to\directory?每个目录总共包含 4 个文件。这是我的 IP 部分:

$Output= @()
$names = Get-content "C:\Users\<username>\Desktop\abc.txt"
foreach ($name in $names){
  if (Test-Connection -ComputerName $name -Count 1 -ErrorAction SilentlyContinue){
   $Output+= "$name,up"
   Write-Host "$Name,up"
  }
  else{
    $Output+= "$name,down"
    Write-Host "$Name,down"
  }
}
$Output | Out-file "C:\Users\<username>\Desktop\results.txt"

此 ping 命令有效,但未将 IP 与 PC 型号配对。

这是我的复制部分:

$File="C:\path\to\directory";
$Exists=Test-Path $File;

If($Exists-eq$TRUE)
    {Write-Host `nFile already exists.}
Else
    {Write-Host `nFile not found. Copying file. Please wait...;
    Copy-Item -Path "\network\HP_ProBook_640_G1" -Destination "C:\path\to\directory"-Recurse;
Write-Host `nFile has been successfully copied.}

这个复制脚本也能正常工作(很抱歉,如果它草率了,在 Whosebug 中格式化它会使它变得不稳定)但是我在弄清楚如果 IP = PC 模型如何迭代时遇到问题,从 [复制所有文件=45=] 到 c:\path\to\directory。我也为解释道歉。任何帮助,将不胜感激。我通常使用 python,但是这台电脑上没有 Python,我无法安装它。

我认为你可以在一个循环中完成所有这些,当然前提是你有权写入每台计算机上的 C 驱动器。

此外,我建议创建一个 CSV 文件作为输出,这样您就可以以结构化的方式存储更多信息。

# read the list, omit empty lines
$names = Get-content "C:\Users\<username>\Desktop\abc.txt" | Where-Object { $_ -match '\S' }

$result = foreach ($item in $names) {
    # split the string in the IP address or name and the model
    $pc, $model = $item -split '\s+', 2
    if (Test-Connection -ComputerName $pc -Count 1 -Quiet) {
        # create the paths to copy from and to Both paths in UNC format
        $sourcePath = Join-Path -Path '\network' -ChildPath ($model.Trim() -replace ' ', '_')
        $targetPath = '\{0}\C$\path\to\directory' -f $pc
        if (!(Test-Path -LiteralPath $targetPath -PathType Container)) {
            $null = New-Item -Path $targetPath -ItemType Directory
        }
        Copy-Item -Path $sourcePath -Destination $targetPath -Recurse -Force
        # output for $result
        [PsCustomObject]@{
            Computer = $pc
            Model    = $model
            Status   = "Files copied from $($sourcePath)"
        }
    }
    else {
        # output for $result
        [PsCustomObject]@{
            Computer = $pc
            Model    = $model
            Status   = "Computer is unreachable"
        }
    }
}

# output on screen
$result

# output to CSV file
$result | Export-Csv -Path 'C:\Users\<username>\Desktop\results.csv' -NoTypeInformation -UseCulture