powershehll删除并重装打印机

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HoKis/article/details/82796284

01 前言

故事发生在XXXX年XX月XX日的某个办公室,小姐姐的本本连不上公司的打印机(局域网、无线,此处以ABC Printer为例)了,要找人解决。怀揣着是时候表演真正的技术了的想法开始一波王者操作。期间碰到几个问题,记录一下。

02 过程

1、打印机图标是灰的,底下状态栏——“打印机状态:脱机”

  • 首先当然是检查网络。由于网络打印机设置了固定IP(此处以192.168.5.100为例),而公司的网络又分了几个区段,如果网段不一致肯定连不上。结果:没问题
  • 那么再看看防火墙。什么?防火墙设置操作不了?看来被优化了。怎么办呢?有办法:Win+R组合键调出“运行”,输入services.msc,然后回车。稍等一会,弹出“服务”窗口,找到Windows Firewall项,哦,原来是被禁用了。右键->属性->启动类型选为自动确定,然后启动此服务。回过头看防火墙,两个都开启了,再看看允许程序或功能通过Windows防火墙,找到文件和打印机共享,都勾上再说,确定保存。
  • 打印机图标还是灰的,看来只能试试先删了,重新装一次。然而……

2、刚删除了打印机,过一会图标又冒出来,死活删不掉

  • 查了一下资料,判断是由于该打印机还存在打印任务,所以删不干净。怎么办呢?有办法:
    (1)停止打印服务。Win+R组合键,输入cmd,回车。在DOS窗口中输入net stop spooler,回车。
    (2)打开文件夹C:\Windows\System32\spool\PRINTERS\,删除该目录下所有文件。
    (3)开启打印服务。Win+R组合键,输入cmd,回车。在DOS窗口中输入net start spooler,回车。
    (4)再次删除打印机,彻底没了。结果:成功

3、添加新的打印机

  • 添加打印机,根据需要设置即可,问题不大。关键是这种操作看起来有些low,不如换个口味——代码解决
  • 好了,请各位观众拿好板凳,备好瓜子,好戏要开锣了。下面表演的是,由powershell带来的一波蛇皮走位,看好了。
<#
环境:powershell 5.1
其他环境未测试,有问题可回复
#>
Stop-Service -Name Spooler #停服务
Remove-Item $env:SystemRoot\System32\spool\PRINTERS\* | Out-Null #删文件
Start-Service -Name Spooler #开服务
$p = Get-WmiObject -Query "SELECT * FROM Win32_Printer";
$printerName = 'ABC Printer';
if($p){
    $name = $($p|Where-Object{$_.DriverName -like $printerName }|Select-Object -First 1).name;
    if($name){&rundll32 printui.dll,PrintUIEntry /dl /n $name }; #删除已有
    $port = @();
    $portAdress = "192.168.5.100";
    $port += Get-WmiObject -Class Win32_TCPIPPrinterPort | Where-Object{$_.HostAddress -eq $portAdress};
    if(-not $port){
        #添加TCP/IP端口
        &cscript $env:SystemRoot\System32\Printing_Admin_Scripts\zh-CN\prnport.vbs -a -r $portAdress -h $portAdress  -o lpr -me -q BINARY_P1 -y public -i 1 | Out-Null;
    }else{
        $portAdress = $port[0].Properties["name"].value
    }
    sleep -Seconds 1 #可暂停一秒
    #添加新的打印机
    &rundll32 printui.dll,PrintUIEntry /if /b $printerName /r $portAdress /m $printerName
}

以上代码另存为.ps1文件,右键使用Powershell 运行(如果不能执行,参考 让系统可以执行.ps1文件)。
当然,还有一种使用姿势是cmd+Powershell 混搭,在cmd中运行以下:

powershell.exe -command "Stop-Service -Name Spooler;Remove-Item $env:SystemRoot\System32\spool\PRINTERS\* | Out-Null;Start-Service -Name Spooler;$p = Get-WmiObject -Query 'SELECT * FROM Win32_Printer';$printerName = 'ABC Printer';if($p){$name = $($p|Where-Object{$_.DriverName -like $printerName}|Select-Object -First 1).name;if($name){&rundll32 printui.dll,PrintUIEntry /dl /n $name };$port = @();$portAdress = '192.168.5.100';$port += Get-WmiObject -Class Win32_TCPIPPrinterPort|Where-Object{$_.HostAddress -eq $portAdress};if(-not $port){&cscript $env:SystemRoot\System32\Printing_Admin_Scripts\zh-CN\prnport.vbs -a -r $portAdress -h $portAdress  -o lpr -me -q BINARY_P1 -y public -i 1 | Out-Null}else{$portAdress = $port[0].Properties['name'].value};sleep -Seconds 3;&rundll32 printui.dll,PrintUIEntry /if /b $printerName /r $portAdress /m $printerName}"

此脚本适用于已经装过此打印机,只是偶尔抽风不能用的情况(本机已经存在该打印机的驱动)。如果之前没有装过,需另外修改,指定驱动文件,此处不做讨论,请另寻别处。

03 后记

经过一波操作,小姐姐的本本满血复活,心情大好,约了下班一起吃饭,要不要答应人家呢~(想得美,哈哈哈)

参考资料:
windows批处理一键安装网络打印机脚本


猜你喜欢

转载自blog.csdn.net/HoKis/article/details/82796284