Рекомендации по написанию сценариев PowerShell для локального и удаленного использования

Каковы некоторые из лучших практик для написания сценариев, которые будут выполняться в удаленном контексте?

Например, я только что обнаружил, что встроенная переменная $Profile не существует во время удаленного выполнения.


person Community    schedule 19.04.2010    source источник


Ответы (2)


Профиль

Вы обнаружили одно основное отличие: $profile не настраивается.

В MSDN есть несколько часто задаваемых вопросов об удаленном powershell или выполните get-help about_Remote_FAQ.

В разделе "ГДЕ МОИ ПРОФИЛИ?" (хех) это объясняет:

Например, следующая команда запускает профиль CurrentUserCurrentHost с локального компьютера в сеансе в $s.

    invoke-command -session $s -filepath $profile

Следующая команда запускает профиль CurrentUserCurrentHost с удаленного компьютера в сеансе в $s. Поскольку переменная $profile не заполнена, команда использует явный путь к профилю.

    invoke-command -session $s {. "$home\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1"}

Сериализация

Еще одно отличие, которое может повлиять на вас, заключается в том, что объекты .NET, возвращаемые командами, возвращаются не просто напрямую, а когда вы запускаете их удаленно и возвращаете, они сериализуются и десериализуются по сети. Многие объекты поддерживают этот штраф, но некоторые нет. Powershell автоматически удаляет методы для объектов, которые больше не «подключены», и тогда они в основном являются структурами данных... но он действительно перехватывает методы для некоторых типов, таких как DirectoryInfo.

Обычно вам не нужно беспокоиться об этом, но если вы возвращаете сложные объекты по каналу, вы можете...

person Community    schedule 09.05.2012
comment
Спасибо, мне нужно было более внимательно прочитать ваш ответ, прежде чем публиковать этот вопрос о get-childItem и, по-видимому, о сериализации. - person noam; 26.04.2013

Блоки скрипта не действуют как замыкания, как обычно:

$var = 5
$sb={ $var }
&$sb # 5
Start-Job $sb | Wait-Job | Receive-Job # nothing
person Community    schedule 20.04.2010
comment
Скотт, причина, по которой ваш пример не работает, заключается в том, что $var не входит в область действия при выполнении как задание. Помните, что задания PowerShell фактически зависят от удаленного взаимодействия PowerShell, поэтому для обработки вашего задания запускается совершенно новый экземпляр PowerShell. Попробуйте свой пример с $sb = {переменная Test-Path:\var - person Greg Wojan; 12.05.2011