Проще и эффективнее импортировать CSV, а затем работать с экземплярами пользовательских объектов, возвращаемых им:
# Import into an array of custom objects ([pscustomobject]) that have
# both a .Server and an .ID property.
$serversAndTheirIds = Import-Csv C:\SecuredFiles\ID.csv
В частности, создание выходного массива итеративно с +=
очень эффективно,поскольку массивы являются неизменяемыми структурами данных, и "добавление" к ним означает, что новый массив должен выделяться за кулисами каждый раз.
Нетнеобходимо использовать Invoke-Command
для синхронного вызова консольного приложения - просто вызовите приложение напрямую .
$ServerName = hostname # invoke hostname.exe and capture its output
Используйте командлет Where-Object
илиметод PSv4 + .Where()
для фильтрации коллекции:
$inputId = $serversAndTheirIds | Where-Object { $_.Server -eq $ServerName } |
Select-Object -ExpandProperty ID
Более эффективная альтернатива PSv4 +:
$inputId = $serversAndTheirIds.Where({ $_.Server -eq $ServerName }, 'First' }).ID
Опять же, синхронно вызовите другое консольное приложение, вызовите его напрямую:
C:\MyFolder\App.exe -id $InputID -d C:\MyFolder
Примечание. Если путь к исполняемому файлу указан , вам необходимоprepend &
, оператор вызова .
ИспользованиеStart-Process
только для вызова приложений с графическим интерфейсом или запуска программ асинхронно или скрыто .
Что касается вашего проблемы с синтаксисом :
Код, опубликованный в вашем вопросе на момент написания этой статьи, является синтаксически правильным и не приведет к сообщениям об ошибках, которые вы цитируете.
Вот что вызовет их :
Missing closing '}' in statement block or type definiton
Блок сценария ({...}
) без закрывающего }
вызовет эту ошибку;например, если ваш скрипт содержал только следующее:
{ 'foo' # no closing '}'
Missing statement block after if ( condition )
оператор if
, который не выполняетсяблоком скрипта вызовет эту ошибку;например, если ваш скрипт содержит только следующее:
if ($true) # no script block ({ ... }) to follow the conditional