Powershell: как создать собственный объект и передать его в функцию powershell?

Я хочу создать пользовательский объект со свойствами в PowerShell, а затем передать этот объект в функцию. Я нашел онлайн пример для создания пользовательского объекта, но он использует HashTable. Тем не менее, у меня есть один объект со свойствами, а не массив объектов.

  1. Если возможно, я бы хотел создать один объект вместо HashTable.
  2. Если HashTables - это путь, как мне получить объект и передать его функции?

Ниже приведен пример моего кода:

function CreateObject()
{       
  $properties = @{      
    'TargetServer' = “ServerName”;
    'ScriptPath' = “SomePath”;
    'ServiceName' = "ServiceName"
 }

   $obj = New-Object -TypeName PSObject -Property $properties    

   Write-Output $obj.TargetServer
   Write-Output $obj.ScriptPath
   Write-Output $obj.ServiceName

   return $obj
}

 function Function2([PSObject] $obj)
{   
   Do something here with $obj
}


$myObj = CreateObject

Function2 $myObj

РЕДАКТИРОВАТЬ 1
Спасибо @Frode и @Matt. Я не знал, что оператор return вернет и другие результаты. Будет ли следующая работа?

function CreateObject()
{      
    return New-Object -TypeName PSObject -Property @{     
       'TargetServer' = "ServerName"
       'ScriptPath' = "SomePath"
       'ServiceName' = "ServiceName"
      }
}

function Init()
{
   // Do something here

   $myObject = CreateObject()

  // Do something here with $myObject

  return $myObject
}

function Funcntion2([PSObject] $obj)
{
  //Do somthing with $obj
}

$obj = Init

Function2 $obj

2 ответа

Решение

Из about_return Важно знать, что

В Windows PowerShell результаты каждого оператора возвращаются как выходные данные, даже без оператора, содержащего ключевое слово Return.

Итак, как сказал Фроде, вы получите массив строк. Вы хотите вернуть свой объект в целом, а не его части. Если цель вашей функции - просто вернуть этот пользовательский объект, то вы можете сократить этот оператор до одной строки.

function CreateObject()
{      
    return New-Object -TypeName PSObject -Property @{     
        'TargetServer' = "ServerName"
        'ScriptPath' = "SomePath"
        'ServiceName' = "ServiceName"
    }
}

Если у вас есть хотя бы PowerShell 3.0, вы можете использовать [pscustomobject] Введите приведение, чтобы выполнить то же самое.

function CreateObject()
{      
    return [pscustomobject] @{     
        'TargetServer' = "ServerName"
        'ScriptPath' = "SomePath"
        'ServiceName' = "ServiceName"
    }
}

Обратите внимание, что в обоих случаях return ключевое слово является необязательным, но знайте, что оно все еще служит цели как логический выход функции (все выходные данные до тех пор, пока эта точка не будет возвращена).

Если вам не нужно сохранять результаты функции в переменной, вы также можете просто связать ее в следующую функцию.

Function2 (CreateObject)

Вы создаете объект. Хеш-таблица - это просто заполнитель, используемый для определения всех свойств перед их превращением в объект.

Удалите три строки, начинающиеся с write-output и тебе должно быть хорошо. Они не нужны и заставляют вашу функцию возвращать массив, а не просто объект, как вы хотели. использование write-host если вы хотите отобразить значения на экране во время тестирования.

Другие вопросы по тегам