我在Powershell中找到了关于foreach循环的一些很好的例子,但是我无法绕着foreach循环包围我正在做的事情。
我发现在从一台Windows打印服务器迁移到另一台Windows打印服务器时处理迁移打印机的优秀脚本,但我的挑战是我从Novell iPrint服务器迁移到Windows服务器。
困难在于iPrint打印机的打印机名称或共享名称(或任何打印机属性)不是主机名,因此我必须提供一些带有iPrint名称和打印机主机名的转换表。
最初,我想让我的翻译表的第2列让它执行我的powershell命令来安装网络打印机,这将使事情变得更容易。
我正在尝试创建一个登录脚本来查询安装在计算机上的打印机并让它执行“预告”操作。使用iPrint名称和主机名循环CSV。
csv 1
installediprintprintername1 installediprintprintername2 installediprintprintername3
printtranslationtable.csv
column 1 column 2 iprintprintername1 hostnameprinter1 iprintprintername2 hostnameprinter2 iprintprintername3 hostnameprinter3 iprintprintername4 hostnameprinter4
这是我到目前为止所得到的,但却无法让它发挥作用。任何帮助将不胜感激!
$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 \" | out-file -FilePath" C:\ windowsprinters.txt" -附加 {break} {exit} }
答案 0 :(得分:0)
当您使用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)"}
答案 1 :(得分:0)
好的,所以你查询安装了哪些打印机,并且你有一个从CSV加载的转换表,现在你只需要查看该转换表并交叉引用哪些条目在本地计算机的打印机列表中有列表。< / p>
$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