2017-03-02 154 views
0

我正在尝试使PowerShell脚本能够更改特定打印机组的所有驱动程序。在几台打印机上更改打印机驱动程序的PowerShell脚本

我有大约200名称以字母Z 我也有打印机的少数不以字母Z.

我想要做到的是该开始打印机..任何以字母ZEB开头的打印机都会将其驱动程序更改为“HP LaserJet 4000系列PS”

我试过修改下面的脚本来处理我需要的内容,但它只是运行而没有任何更改。

$driver = "HP LaserJet 4000 Series PS" 
$pattern = 'ZEB' 

$printers = gwmi win32_printer 

foreach($printer in $printers){ 
     $name = $printer.name 
     if($name -like $pattern){ 
       & rundll32 printui.dll PrintUIEntry /Xs /n $name DriverName $driver 
     } 
} 
+0

'$ pattern ='ZEB *'' – BenH

+0

谢谢!这实际上工作:) – user2387281

+0

现在我需要添加第二个“如果”它检查特定的打印驱动程序。因此,如果名称中包含ZEB,并且驱动程序中包含HP LASERJET 4,则将驱动程序更改为新的。 – user2387281

回答

0

这很简单,因为您已经从评论回复中完成了一半的工作。我将在定义循环时过滤要修改的打印机,因此您只通过循环放置所需的打印机,其余部分完全跳过。最主要的是Where语句,它像您的If语句一样工作,以过滤出合适的打印机。它读起来就像这样:

$Printers | Where{ $_.Name -like $pattern -and $_.DriverName -like '*HP LASERJET 4*' } 

所以它会检查该名称以字母开始ZEB,并检查该驱动器必须在驱动程序名称“HP LASERJET 4”的地方。一起看起来像这样:

$driver = "HP LaserJet 4000 Series PS" 
$pattern = 'ZEB*' 

$printers = gwmi win32_printer 

foreach($printer in ($printers|Where{$_.Name -like $pattern -and $_.DriverName -like '*HP LASERJET 4*'})){ 
     $name = $printer.name 
     & rundll32 printui.dll PrintUIEntry /Xs /n $name DriverName $driver 
} 
+0

非常感谢!而不是像DriverName那样,我可以为我想要替换的更具体类型的驱动程序做一个匹配吗? – user2387281

+0

@ user2387281'-match'可以工作,但我怀疑你需要它。如果你知道确切的驱动程序,只需从''-like''中取出'*'。 ''''''=>通配符; '-match' =>正则表达式。所以如果你想要几个驱动程序,你可以使用'-match'和'|'运算符,而不是使用多个'-or'语句。 – BenH

+0

很酷,感谢您的信息!我最终使用-eq语法,因此它完全匹配。我试过 - 匹配,但它会使用HP LaserJet 4更换所有打印机 – user2387281