PowerShell ConsoleShell в .NET 4.0 одобрен для производства? - PullRequest
3 голосов
/ 16 ноября 2011

После прочтения нескольких других постов и статей в блоге (ссылки приведены ниже), похоже, есть несколько способов запуска PowerShell в .NET 4.0, но для наших целей их мало.Из-за того, как мы внедряем наше программное обеспечение, мы не можем обновить реестр или изменить добавить приложение.Это оставляет нам два варианта: создать собственную оболочку, используя ConsoleShell или переопределить PSHost.Мы хотели бы иметь возможность использовать первый вариант, ConsoleShell, из-за его простоты, но хотели бы знать, с какими проблемами мы можем столкнуться и рекомендуется ли это делать.

Ссылка

Основываясь на других вопросах, я видел, что вы можете использовать следующие методы для запуска PowerShell как .NET 4.0.Похоже, что ни один из этих методов не был официально санкционирован Microsoft, но первый, показанный ниже, включен в качестве решения проблемы Microsoft connect.

Варианты запуска PowerShell в .NET 4.0, по-видимому, включают:

  1. Обновите app.config , чтобы он включал .NET 4.0 в качестве поддерживаемого
  2. Добавить параметр реестра для переключения версии
  3. . Использовать <a href="http://community.bartdesmet.net/blogs/bart/archive/2010/07/06/hosting-windows-powershell-2-0-under-clr-4-0.aspx" rel="nofollow noreferrer">ConsoleShell</a> для размещения своей собственной консоли PowerShell.
  4. Реализовать собственный хост PowerShell, PSHost, как сделано. PoshConsole или Nuget

Ответы [ 2 ]

2 голосов
/ 16 ноября 2011

Насколько это официально не утверждено (насколько мне известно), никто не может одобрить его, кроме вас.Если ваш сценарий работает и проходит разумные тесты, одобрите и используйте его.

Я использую PowerShell в .NET 4.0, но с опцией 4, и тоже использовал опцию 1 (мне не нравится опция 2лично).Таким образом, я одобрил это, производство или нет, я использую это много, и это работает.Я все еще использую PowerShell в .NET 2.0 по двум причинам: 1) PowerShell.exe запускается быстрее (особенно x64);2) быть уверенным, что часть моей разработки PowerShell совместима с .NET 2.

Еще одна мысль.Если что-то не работает должным образом в PowerShell в .NET 2.0 (есть некоторые проблемы, действительно, см. Connect), то сам факт «одобрен для производства» мало помогает.Нужно преодолеть существующие проблемы, .NET 2 или .NET 4 не имеет значения.

PS Я должен был упомянуть, что я также попробовал вариант 3.Я не нашел подходящих вариантов использования в моих сценариях.Но я не нашел никаких проблем в использовании ConsoleShell.

PPS Еще один вариант.Сделайте копию PowerShell.exe , переименуйте ее в MyConsoleShell.exe , используйте ее вместе с MyConsoleShell.exe.config , настроенным для .NET 4. Покатак как вы все равно собираетесь использовать отдельное приложение, то почему бы не рассмотреть это?

0 голосов
/ 22 февраля 2012

Я немного похож на PowerShell N00b, но я собрал это вместе как способ заставить произвольный скрипт использовать .NET 4.0 в моем скрипте:

# Place this at the top of your script, and it will run as a .NET 4 ps script.
# #############################################################################
if ($PSVersionTable.CLRVersion.Major -lt 4) { try {
    $cfgPath = $Env:TEMP | Join-Path -ChildPath ([Guid]::NewGuid())
    mkdir $cfgPath | Out-Null
    "<configuration><startup useLegacyV2RuntimeActivationPolicy='true'><supportedRuntime version='v4.0'/></startup></configuration>" | Set-Content -Path $cfgPath\powershell.exe.activation_config -Encoding UTF8
    $darkMagic = 'COMPLUS_ApplicationMigrationRuntimeActivationConfigPath'
    $old = [Environment]::GetEnvironmentVariable($darkMagic)
    [Environment]::SetEnvironmentVariable($darkMagic, $cfgPath)
    & powershell.exe $MyInvocation.MyCommand.Definition $args
} finally {
    [Environment]::SetEnvironmentVariable($darkMagic, $old)
    $cfgPath | Remove-Item -Recurse
    return
}}
# ##############################################################################

# My script starts here:
echo "Your arguments are: $args "
echo "The CLR Major Version is : $($PSVersionTable.CLRVersion.Major)"

Он ставит проверку вначало сценария, и если это не .NET 4.0, он создает файл конфигурации, устанавливает переменную среды и повторно запускает сценарий powershell, чтобы он работал под .NET 4.0.

это налагает некоторый штраф времени запуска примерно на секунду или около того на моем компьютере, но по крайней мере это работает:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...