通过Powershell将共享打印机添加到远程计算机

时间:2015-01-02 18:25:13

标签: powershell printing

我无法运行invoke-command脚本在远程计算机上安装打印机。我的代码在本地工作,但只要我将它传递给Invoke-command,就会出错。

本地:

$Printer = "\\server1\printer1"
(New-Object -Com Wscript.Network).AddWindowsPrinterConnection($Printer)

这增加了打印机就好了。我可以在远程计算机上执行相同的命令,没有任何问题。但是当我试图远程执行命令时,我遇到了问题。

远程:

$compname = "computer"
$Printer = "\\server1\printer1"
Invoke-Command -ComputerName $CompName -Scriptblock {(New-Object -Com Wscript.Network).AddWindowsPrinterConnection('$Printer')}

返回错误“打印机名称无效”

所以我尝试使用以下代码查看shell发送到远程计算机的内容,并且写入输出中的所有内容看起来都很好,但我仍然会收到错误:

Invoke-Command -ComputerName $CompName -Scriptblock {(New-Object -Com Wscript.Network).AddWindowsPrinterConnection('$Printer'); write-host "(New-Object -Com Wscript.Network).AddWindowsPrinterConnection('$Printer')"}

输出:

Exception calling "AddWindowsPrinterConnection" with "1" argument(s): "The printer name is invalid. (Exception from
HRESULT: 0x80070709)"
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ComMethodTargetInvocation
    + PSComputerName        : computer

(New-Object -Com Wscript.Network).AddWindowsPrinterConnection('\\server1\printer1')

编辑1/5/2015

所以我在参数列表中尝试了许多不同条目的Paul代码。到目前为止一切都没有奏效。我认为前三个更接近答案。

-ArgumentList ""\\server1\printer1""
-ArgumentList ""'\\server1\printer1'""
-ArgumentList "\"\\server1\printer1""

结果:

Invoke-Command : A positional parameter cannot be found that accepts argument '\\server1\printer1'.
At line:1 char:1
+ Invoke-Command -ComputerName $CompName -Scriptblock {(New-Object -Com Wscript.Ne ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Invoke-Command], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.InvokeCommandCommand



-ArgumentList "'\\server1\printer1'"
-ArgumentList \'"\\server1\printer1"'
-ArgumentList \""\\server1\printer1""
-ArgumentList \"\\server1\printer1"

结果:

Exception calling "AddWindowsPrinterConnection" with "1" argument(s): "The printer name is invalid. (Exception from
HRESULT: 0x80070709)"
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ComMethodTargetInvocation
    + PSComputerName        : sso-mxl327082y

2 个答案:

答案 0 :(得分:2)

试试这个:

Invoke-Command -ComputerName $CompName -Scriptblock {(New-Object -Com Wscript.Network).AddWindowsPrinterConnection($args[0]); write-host "(New-Object -Com Wscript.Network).AddWindowsPrinterConnection($($args[0]))"} -ArgumentList "\\server1\printer1"

我认为这是因为你的$printer变量放在单引号之间,单引号之间的变量不会被powershell解释。所以你的函数可能得到的printername是“$ printer”。

如果您想知道它在write-host语句中正确打印出来,因为这里单引号在字符串中。

答案 1 :(得分:0)

你需要使用$ Using:yourvar将变量传递给scriptblock

$compname = "computer"
$Printer = "\\server1\printer1"
Invoke-Command -ComputerName $CompName -Scriptblock 
{
(New-Object -Com Wscript.Network).AddWindowsPrinterConnection($Using:$Printer)
}