Не используйте Invoke-Expression
(который редко является подходящим инструментом, и обычно следует избегать по соображениям безопасности ):
Струнизация пользовательских объектов, выводимых с помощью Import-Csv
в исполнении $($VM)
не сохраняет исходные объекты;это приводит к хеш-таблице - , как представление, которое не подходит для программной обработки и нарушает синтаксис командной строки, которую вы передаете Invoke-Expression
.
Вместо этого просто вызовите вашнепосредственно сценарий:
$aVMs = Import-Csv -Path "PathToCsv"
.\TestMe.ps1 -arr $aVMs
Обратите внимание, что я передаю $aVMs
в целом вашему сценарию, учитывая, что ваш параметр -arr
имеет тип массива.
Если вылучше обрабатывайте объекты один за другим, придерживайтесь подхода foreach
(но тогда вы должны объявить тип вашего $arr
параметра как [pscustomobject]
вместо [array]
):
$aVMs = Import-Csv -Path "PathToCsv"
foreach ($VM in $aVMs) {
.\TestMe.ps1 -arr $VMs
}
Другойможно объявить $arr
как принимающий конвейерный ввод, добавить блок process
в свой сценарий, а затем pipe $aVMs
в свой сценарий ($aVMs | .\TestMe.ps1
).
Кроме того, не вкладывайте функцию с тем же именем в ваш скрипт .ps1
, который вы вызываете из скрипта, особенно если не передать аргументы;Сценарии могут напрямую объявлять параметры, как функции:
[CmdLetBinding()]
Param (
[Parameter(Mandatory, Position=1)]
[array]$arr
)
$arr | Out-GridView