PowerShell ConsoleShell在.NET 4.0上是否可以用于生产环境?

3
阅读了几篇博客文章和文章后(参考文献如下),似乎有几种方法可以在.NET 4.0上运行PowerShell,但很少有适用于我们目的的方法。由于我们部署软件的方式,我们无法更新注册表或更改添加应用程序。这使我们有两个选择,使用ConsoleShell创建自己的shell或覆盖PSHost。我们想使用第一种选项ConsoleShell,因为它很简单,但想知道可能会遇到哪些问题以及是否建议这样做。

参考资料

基于我看到的其他问题,您可以使用以下方法之一在.NET 4.0上运行PowerShell。这些方法似乎都没有得到微软的正式认可,但下面显示的第一个方法包含在this微软连接问题的解决方法中。

在.NET 4.0中运行PowerShell的选项似乎包括:

  1. 更新app.config以支持.NET 4.0
  2. 添加注册表设置以切换版本
  3. 使用ConsoleShell来托管自己的PowerShell控制台
  4. 实现你自己的PowerShell主机PSHost,就像PoshConsoleNuget一样

还有第五个选项:安装使用CLRVersion: 4.0.30319.1的Powershell 3.0 CTP。(然而,在生产环境中,这可能不是最佳解决方案) - jon Z
1
这绝对不是我们的解决方案,因为据我所知,CTP不支持Windows Server 2003。 - smaclell
2个回答

2
只要它没有得到官方批准(据我所知),那么除了你之外没有人可以批准它。如果您的方案可行并通过了合理的测试,请批准并使用它。我在.NET 4.0上使用PowerShell,但选择了选项4,并曾经使用过选项1(个人不喜欢选项2)。因此,无论是否生产,我都批准了它,我经常使用它并且它有效。我仍然在.NET 2.0上使用PowerShell,原因有两个:1)PowerShell.exe启动更快(特别是x64);2)确保我的PowerShell开发的一部分与.NET 2兼容。另一个想法。如果PowerShell在.NET 2.0上某些情况下无法正常工作(确实存在一些问题,请参见Connect),则“已批准用于生产”的事实本身并没有太大帮助。必须克服现有的问题,无论是.NET 2还是.NET 4都无关紧要。附言:我也尝试了选项3。我没有找到适用于我的场景使用它的用例。但我在使用ConsoleShell时没有遇到任何问题。再说一个选项。复制PowerShell.exe,将其重命名为MyConsoleShell.exe,并与为.NET 4配置的MyConsoleShell.exe.config一起使用。只要您将要使用单独的应用程序,那么为什么不考虑这个呢?

非常感谢您的回答。由于我们的测试没有任何问题,我决定使用ConsoleShell并开始实现我们自己的简化主机。 - smaclell

0

我有点 Powershell 新手,但我把这个东西拼凑在一起,作为一种强制任意脚本在我的脚本中使用 .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下运行。

在我的电脑上,它确实会产生大约一秒钟左右的启动时间惩罚,但至少它可以工作 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接