Как вызвать сценарий powershell из VB.net Переменные 2017 года, передающие?

#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. Спасибо. Я попытаюсь это реализовать. Цените указатели.