#vb.net #powershell
#vb.net #powershell
Вопрос:
Попытка добавить принтеры на компьютер, считывая значения для информации о принтере в VB.net и установка переменных. Как только все переменные установлены, я пытаюсь вызвать следующее
Shell("powershell.exe c:makeportstest.ps1 -name " amp; pPortName amp; " -hostaddress " amp; pPortName amp; " -portNumber " amp; pPortNum amp; " -IPAddress " amp; pIP amp; " -ComputerName " amp; pCompName amp; " -Printername " amp; pPrintName amp; " -Driver " amp; pDriver)
после установки переменных строка выглядит следующим образом
c:makeportstest.ps1 -name 192.168.10.231 -hostaddress 192.168.10.231 -portNumber 6101 -IPAddress 192.168.10.231 -ComputerName PRO-TM2-PRO -Printername PR111 -Driver Zdesigner TLP 2844 -DeviceID ""
Я понимаю, что мне, вероятно, нужны двойные или одинарные кавычки вокруг значений.
Получение страницы, заполненной сообщением об ошибке
Вот сценарий оболочки.
Function CreatePrinterPort {
Param ($PrinterIP, $PrinterPort, $PrinterPortName, $ComputerName)
$wmi = [wmiclass]"\$ComputerNamerootcimv2:win32_tcpipPrinterPort"
$wmi.psbase.scope.options.enablePrivileges = $true
$Port = $wmi.createInstance()
$Port.name = $PrinterPortName
$Port.hostAddress = $PrinterIP
$Port.portNumber = $PrinterPort
$Port.SNMPEnabled = $false
$Port.Protocol = 1
$Port.put()
}
Function CreatePrinter
{
param ($PrinterCaption, $PrinterPortName, $DriverName, $ComputerName)
$wmi = ([WMIClass]"\$ComputerNameRootcimv2:Win32_Printer")
$Printer = $wmi.CreateInstance()
$Printer.Caption = $PrinterCaption
$Printer.DriverName = $DriverName
$Printer.PortName = $PrinterPortName
$Printer.DeviceID = $PrinterCaption
$Printer.Put()
}
CreatePrinterPort $printer.Portname $printer.port $printer.IPAddress $printer.Computer
CreatePrinter $printer.Printername $printer.Portname $printer.Driver $printer.Computer
-ExecutionPolicy : The term '-ExecutionPolicy' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is
correct and try again.
At C:makeportstest.ps1:27 char:1
-ExecutionPolicy ByPass
~~~~~~~~~~~~~~~~
CategoryInfo : ObjectNotFound: (-ExecutionPolicy:String) [], CommandNotFoundException
FullyQualifiedErrorId : CommandNotFoundException
Cannot convert value "\rootcimv2:win32_tcpipPrinterPort" to type "System.Management.ManagementClass". Error: "Invalid parameter "
At C:makeportstest.ps1:3 char:1
$wmi = [wmiclass]"\$ComputerNamerootcimv2:win32_tcpipPrinterPort"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo : InvalidArgument: (:) [], RuntimeException
FullyQualifiedErrorId : InvalidCastToWMIClass
The property 'enablePrivileges' cannot be found on this object. Verify that the property exists and can be set.
At C:makeportstest.ps1:4 char:1
$wmi.psbase.scope.options.enablePrivileges = $true
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo : InvalidOperation: (:) [], RuntimeException
FullyQualifiedErrorId : PropertyNotFound
You cannot call a method on a null-valued expression.
At C:makeportstest.ps1:5 char:1
$Port = $wmi.createInstance()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo : InvalidOperation: (:) [], RuntimeException
FullyQualifiedErrorId : InvokeMethodOnNull
The property 'name' cannot be found on this object. Verify that the property exists and can be set.
At C:makeportstest.ps1:6 char:1
$Port.name = $PrinterPortName
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo : InvalidOperation: (:) [], RuntimeException
FullyQualifiedErrorId : PropertyNotFound
The property 'hostAddress' cannot be found on this object. Verify that the property exists and can be set.
At C:makeportstest.ps1:7 char:1
$Port.hostAddress = $PrinterIP
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo : InvalidOperation: (:) [], RuntimeException
FullyQualifiedErrorId : PropertyNotFound
The property 'portNumber' cannot be found on this object. Verify that the property exists and can be set.
At C:makeportstest.ps1:8 char:1
$Port.portNumber = $PrinterPort
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo : InvalidOperation: (:) [], RuntimeException
FullyQualifiedErrorId : PropertyNotFound
The property 'SNMPEnabled' cannot be found on this object. Verify that the property exists and can be set.
At C:makeportstest.ps1:9 char:1
$Port.SNMPEnabled = $false
~~~~~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo : InvalidOperation: (:) [], RuntimeException
FullyQualifiedErrorId : PropertyNotFound
The property 'Protocol' cannot be found on this object. Verify that the property exists and can be set.
At C:makeportstest.ps1:10 char:1
$Port.Protocol = 1
~~~~~~~~~~~~~~~~~~
CategoryInfo : InvalidOperation: (:) [], RuntimeException
FullyQualifiedErrorId : PropertyNotFound
You cannot call a method on a null-valued expression.
At C:makeportstest.ps1:11 char:1
$Port.put()
~~~~~~~~~~~
CategoryInfo : InvalidOperation: (:) [], RuntimeException
FullyQualifiedErrorId : InvokeMethodOnNull
Cannot convert value "\Rootcimv2:Win32_Printer" to type "System.Management.ManagementClass". Error: "Invalid parameter "
At C:makeportstest.ps1:17 char:1
$wmi = ([WMIClass]"\$ComputerNameRootcimv2:Win32_Printer")
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo : InvalidArgument: (:) [], RuntimeException
FullyQualifiedErrorId : InvalidCastToWMIClass
You cannot call a method on a null-valued expression.
At C:makeportstest.ps1:18 char:1
$Printer = $wmi.CreateInstance()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo : InvalidOperation: (:) [], RuntimeException
FullyQualifiedErrorId : InvokeMethodOnNull
The property 'Caption' cannot be found on this object. Verify that the property exists and can be set.
At C:makeportstest.ps1:19 char:1
$Printer.Caption = $PrinterCaption
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo : InvalidOperation: (:) [], RuntimeException
FullyQualifiedErrorId : PropertyNotFound
The property 'DriverName' cannot be found on this object. Verify that the property exists and can be set.
At C:makeportstest.ps1:20 char:1
$Printer.DriverName = $DriverName
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo : InvalidOperation: (:) [], RuntimeException
FullyQualifiedErrorId : PropertyNotFound
The property 'PortName' cannot be found on this object. Verify that the property exists and can be set.
At C:makeportstest.ps1:21 char:1
$Printer.PortName = $PrinterPortName
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo : InvalidOperation: (:) [], RuntimeException
FullyQualifiedErrorId : PropertyNotFound
The property 'DeviceID' cannot be found on this object. Verify that the property exists and can be set.
At C:makeportstest.ps1:22 char:1
$Printer.DeviceID = $PrinterCaption
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo : InvalidOperation: (:) [], RuntimeException
FullyQualifiedErrorId : PropertyNotFound
You cannot call a method on a null-valued expression.
At C:makeportstest.ps1:23 char:1
$Printer.Put()
~~~~~~~~~~~~~~
CategoryInfo : InvalidOperation: (:) [], RuntimeException
FullyQualifiedErrorId : InvokeMethodOnNull
Кто-нибудь видит, что СОВЕРШЕННО неправильно
Комментарии:
1. Похоже, что опубликованный вами код на самом деле не является точным содержимым файла на диске — согласно первой ошибке, строка 27 — это просто «-ExecutionPolicy ByPass»
2. Да, я удалил это. Результаты, однако, без этой строки
3. Ну, вы никогда не объявляете никаких параметров в сценарии, поэтому я не уверен, откуда вы ожидаете
$printer
? В результате$computerName
(и все другие параметры внутри ваших функций) являются$null
, поэтому[wmiclass]
строка отображается как\rootcimv2:win32_tcpipPrinterPort
4. Я не привык использовать powershell. Я предположил, что строка CreatePrinter $Printer. Имя печати было объявлением переменной
5.Это не работает,
$Printer.Printername
не может иметь значения до$Printer
присвоения какого-либо значения.
Ответ №1:
Если вы хотите, чтобы сценарий принимал привязку аргумента именованного параметра (т. Е.. script.ps1 -Param "value"
в результате $Param -eq "value"
внутри скрипта), вам нужно объявить свои параметры с param()
блоком:
param(
[string]$Name,
[string]$HostAddress,
[uint32]$PortNumber,
[string]$IPAddress,
[string]$ComputerName,
[string]$Printername,
[string]$Driver,
[string]$DeviceID
)
function CreatePrinterPort { ... }
function CreatePrinter { ... }
# Don't forget to construct port name
$PortName = "${Printername}_tcpip_${PortNumber}"
# Now we just pass the appropriate parameter values that the script received to our functions
CreatePrinterPort -PrinterIP $IPAddress -PrinterPort $PortNumber -PrinterPortName $PortName -ComputerName $ComputerName
CreatePrinter -PrinterCaption $PrinterName -PrinterPortName $PortName -DriverName $Driver -ComputerName $ComputerName
… и вам понадобится дополнительный набор кавычек вокруг имени драйвера (из-за пробелов) при вызове сценария, т.Е. -Driver "Zdesigner TLP 2844"
Пожалуйста, ознакомьтесь с about_Functions_Advanced
и связанными с ними файлами справки для получения более подробной информации о параметрах в расширенных функциях и сценариях
Комментарии:
1. Спасибо. Я попытаюсь это реализовать. Цените указатели.