我正在更新一个管理一些. net程序集的PowerShell脚本。该脚本是为在。net 2(与PowerShell运行的框架相同版本)上构建的程序集编写的,但现在需要使用。net 4程序集以及。net 2程序集。
由于. net 4支持运行基于旧版本框架构建的应用程序,因此似乎最简单的解决方案是在需要针对. net 4程序集运行PowerShell时,使用。net 4运行时启动PowerShell。
如何使用。net 4运行时运行PowerShell ?
我正在更新一个管理一些. net程序集的PowerShell脚本。该脚本是为在。net 2(与PowerShell运行的框架相同版本)上构建的程序集编写的,但现在需要使用。net 4程序集以及。net 2程序集。
由于. net 4支持运行基于旧版本框架构建的应用程序,因此似乎最简单的解决方案是在需要针对. net 4程序集运行PowerShell时,使用。net 4运行时启动PowerShell。
如何使用。net 4运行时运行PowerShell ?
当前回答
如果您只需要在。net 4中执行单个命令、脚本块或脚本文件,请尝试使用。net 4中的激活配置文件,使用CLR版本4仅启动单个PowerShell实例。
详情:
http://blog.codeassassin.com/2011/03/23/executing-individual-powershell-commands-using-net-4/
PowerShell模块示例:
https://gist.github.com/882528
其他回答
其他的答案来自2012年之前,他们专注于“破解”PowerShell 1.0或PowerShell 2.0,以瞄准更新版本的。net框架和公共语言运行时(CLR)。
However, as has been written in many comments, since 2012 (when PowerShell 3.0 came) a much better solution is to install the newest version of PowerShell. It will automatically target CLR v4.0.30319. This means .NET 4.0, 4.5, 4.5.1, 4.5.2, or 4.6 (expected in 2015) since all of these versions are in-place replacements of each other. Use $PSVersionTable or see the Determine installed PowerShell version thread if you are unsure of your PowerShell version. Edit: Also thread Which .NET version is my PowerShell script using?
在撰写本文时,PowerShell的最新版本是4.0,可以通过Windows管理框架(谷歌搜索链接)下载。
PowerShell(引擎)在。net 4.0下运行良好。PowerShell(控制台主机和ISE)没有,因为它们是根据旧版本的。net编译的。有一个注册表设置将改变系统范围内加载的。net框架,这将反过来允许PowerShell使用。net 4.0类:
reg add hklm\software\microsoft\.netframework /v OnlyUseLatestCLR /t REG_DWORD /d 1
reg add hklm\software\wow6432node\microsoft\.netframework /v OnlyUseLatestCLR /t REG_DWORD /d 1
要更新ISE以使用。net 4.0,你可以更改配置文件($ phome \powershell_ise.exe.config),使其具有如下块:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0.30319" />
</startup>
</configuration>
您可以使用PowerShell API (System.Management.Automation.PowerShell)构建调用PowerShell的。net 4.0应用程序,但是这些步骤将有助于使PowerShell主机在。net 4.0下工作。
当您不再需要注册表项时,请删除它们。这些是机器范围内的键,强制将所有应用程序迁移到。net 4.0,甚至包括使用。net 2和。net 3.5的应用程序
请谨慎使用注册表项方法。这些是机器范围的键,强制将所有应用程序迁移到。net 4.0。
如果强制迁移,许多产品不能工作,这是一种测试辅助,而不是一种生产质量机制。Visual Studio 2008和2010,MSBuild, turbotax,以及大量的网站,SharePoint等等都不应该被自动化。
如果您需要使用PowerShell 4.0,这应该在每个应用程序的基础上使用配置文件完成,您应该与PowerShell团队核实准确的建议。这可能会破坏一些现有的PowerShell命令。
作为另一种选择,最新的PoshConsole发行版包括针对. net 4 RC的二进制文件(它可以很好地对抗RTM发行版),无需任何配置。
下面是我用来支持。net 2.0和。net 4程序集的配置文件的内容:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!-- http://msdn.microsoft.com/en-us/library/w4atty68.aspx -->
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" />
<supportedRuntime version="v2.0.50727" />
</startup>
</configuration>
此外,这是一个简化版本的PowerShell 1.0兼容代码,我用来执行我们的脚本从传递的命令行参数:
class Program {
static void Main( string[] args ) {
Console.WriteLine( ".NET " + Environment.Version );
string script = "& " + string.Join( " ", args );
Console.WriteLine( script );
Console.WriteLine( );
// Simple host that sends output to System.Console
PSHost host = new ConsoleHost( this );
Runspace runspace = RunspaceFactory.CreateRunspace( host );
Pipeline pipeline = runspace.CreatePipeline( );
pipeline.Commands.AddScript( script );
try {
runspace.Open( );
IEnumerable<PSObject> output = pipeline.Invoke( );
runspace.Close( );
// ...
}
catch( RuntimeException ex ) {
string psLine = ex.ErrorRecord.InvocationInfo.PositionMessage;
Console.WriteLine( "error : {0}: {1}{2}", ex.GetType( ), ex.Message, psLine );
ExitCode = -1;
}
}
}
除了上面所示的基本错误处理之外,我们还在脚本中注入了一个trap语句,以显示额外的诊断信息(类似于Jeffrey Snover的Resolve-Error函数)。