【问题标题】:Printer Migration - Powershell script打印机迁移 - Powershell 脚本
【发布时间】:2018-02-08 21:41:42
【问题描述】:

我在这里找到了有关 Powershell 中 foreach 循环的一些很好的示例,但是对于我正在做的事情,我无法完全理解 foreach 循环。

在从一台 Windows 打印服务器迁移到另一台时,我发现了处理打印机迁移的出色脚本,但我面临的挑战是我正在从 Novell iPrint 服务器迁移到 Windows 服务器。

问题在于 iPrint 打印机的打印机名称或共享名称(或任何打印机属性)不是主机名,所以我必须想出一些带有 iPrint 名称和打印机主机名的转换表。

最初,我只想让我的转换表的第 2 列让它执行我的 powershell 命令来安装网络打印机,这会使事情变得更容易。

我正在尝试创建一个登录脚本来查询计算机上安装的打印机,并让它针对具有 iPrint 名称和主机名的 CSV 执行“foreach”循环。

csv 1

安装的iprintprintername1 安装iprintprintername2 安装iprintprintername3

printtranslationtable.csv

第 1 列 第 2 列 iprintprintername1 主机名printer1 iprintprintername2 主机名printer2 iprintprintername3 主机名printer3 iprintprintername4 主机名printer4

这是我到目前为止得到的,但无法让它工作。任何帮助将不胜感激!

$printers = @(Get-wmiobject win32_printer)

$path = "\\networkdrive\printtranslationtable.csv"
$printertranslation = Import-Csv -path $path

foreach ($iprintprinter in $printtranslationtable) {
    foreach ($name in $csv1) {
        if ($name -eq $printtranslationtable.column1) {
            Write-Host $newPrinter = $printtranslationtable.column2
        }
    }
}

更新 所以我能够调整@TheMadTechnician 建议的脚本,并能够让这个 PS 脚本在我的环境中工作。我要做的是检查是否安装了新打印机,如果它们只是退出脚本。这就是我所拥有的,但无法让它退出或中断。我也尝试将新打印机写入文本文件,但没有必要,我希望它停止执行脚本。

if (($printers.name -like "\winprint*") -eq $true) { $printers.name -like "\winprint\" |输出文件 -FilePath "C:\windowsprinters.txt" -Append {中断} {退出} }

【问题讨论】:

    标签: powershell


    【解决方案1】:

    当您使用Import-Csv 读取文件时,PowerShell 会使用标题行中的属性名称创建一个自定义对象数组。另一方面,Get-Content 生成简单的字符串值数组。我想出了一个衬里,它通过翻译表并检查打印机列表是否包含一个。如果您有数十亿台打印机,这不是最佳选择,但可以保持清晰:

    printers.txt:

    iprinter2
    iprinter3
    

    printertable.csv:

    "Column1";"Column2"
    "iprinter1";"hostname1"
    "iprinter2";"hostname2"
    "iprinter3";"hostname3"
    "iprinter4";"hostname4"
    

    PowerShell:

    $printers = Get-Content .\printers.txt
    $prtable = Import-Csv -Delimiter ";" .\printertable.csv
    $prtable | ?{ $printers -contains $_.Column1 } | %{Write-Host "Install $($_.Column2)"}
    

    【讨论】:

    • 看这个和你的解释对我来说更有意义。谢谢你的例子。
    【解决方案2】:

    好的,所以您查询安装了哪些打印机,并且您有一个从 CSV 加载的转换表,现在您只需要查看该转换表并交叉引用哪些条目在本地计算机的打印机列表中列出。

    $printers = @(Get-wmiobject win32_printer)
    
    $path = "\\networkdrive\printtranslationtable.csv"
    $printertranslation = Import-Csv -path $path
    
    $printertranslation | Where{$_.Column1 -in $printers.ShareName} | ForEach{ Add-Printer $_.Column2 }
    

    我不知道 win32_printer 对象的哪个属性最适合您,但我建议您使用 ShareName 或 DeviceId。应该是这样的:

    ShareName: XeroxColor02
    DeviceId:  \\printserver\XeroxColor02
    

    【讨论】:

    • 这个对我有用。太感谢了。在这种事情上获得帮助真是太棒了。由于 Windows 7 不支持“添加打印机”,因此我不得不进行一些小修改。我最终将命令放在第 2 列并使用“调用表达式”添加打印机。再次感谢您!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多