我正在更新一个管理一些. 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 ?
当前回答
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命令。
其他的答案来自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 1.0或2.0版本上,下面是我对Jason Stangroome的精彩回答的改进。
创建一个powershell4。CMD在你路径的某处,包含以下内容:
@echo off
:: http://stackoverflow.com/questions/7308586/using-batch-echo-with-special-characters
if exist %~dp0powershell.exe.activation_config goto :run
echo.^<?xml version="1.0" encoding="utf-8" ?^> > %~dp0powershell.exe.activation_config
echo.^<configuration^> >> %~dp0powershell.exe.activation_config
echo. ^<startup useLegacyV2RuntimeActivationPolicy="true"^> >> %~dp0powershell.exe.activation_config
echo. ^<supportedRuntime version="v4.0"/^> >> %~dp0powershell.exe.activation_config
echo. ^</startup^> >> %~dp0powershell.exe.activation_config
echo.^</configuration^> >> %~dp0powershell.exe.activation_config
:run
:: point COMPLUS_ApplicationMigrationRuntimeActivationConfigPath to the directory that this cmd file lives in
:: and the directory contains a powershell.exe.activation_config file which matches the executable name powershell.exe
set COMPLUS_ApplicationMigrationRuntimeActivationConfigPath=%~dp0
%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe %*
set COMPLUS_ApplicationMigrationRuntimeActivationConfigPath=
这将允许您启动在。net 4.0下运行的powershell控制台实例。
通过检查从cmd运行的以下两个命令的输出,您可以看到在我的PowerShell 2.0系统上的差异。
C:\>powershell -ExecutionPolicy ByPass -Command $PSVersionTable
Name Value
---- -----
CLRVersion 2.0.50727.5485
BuildVersion 6.1.7601.17514
PSVersion 2.0
WSManStackVersion 2.0
PSCompatibleVersions {1.0, 2.0}
SerializationVersion 1.1.0.1
PSRemotingProtocolVersion 2.1
C:\>powershell4.cmd -ExecutionPolicy ByPass -Command $PSVersionTable
Name Value
---- -----
PSVersion 2.0
PSCompatibleVersions {1.0, 2.0}
BuildVersion 6.1.7601.17514
CLRVersion 4.0.30319.18408
WSManStackVersion 2.0
PSRemotingProtocolVersion 2.1
SerializationVersion 1.1.0.1
我找到的最好的解决方案是在PowerShell中使用更新版本的。net的博文中。这允许powershell.exe与。net 4程序集一起运行。
只需修改(或创建)$pshome\powershell.exe。配置,使其包含以下内容:
<?xml version="1.0"?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0.30319"/>
<supportedRuntime version="v2.0.50727"/>
</startup>
</configuration>
另外,快速设置注意事项:
位置和文件多少依赖于平台;然而,将为您提供如何使解决方案为您工作的内联要点。
您可以通过在PowerShell窗口中执行cd $ phome来查找PowerShell在计算机上的位置(不能从DOS提示符中工作)。 路径将类似于(示例)C:\Windows\System32\WindowsPowerShell\v1.0\ 如果正在执行PowerShell.exe,则将配置放入的文件名为:PowerShell.exe .config(如果需要,则创建配置文件)。 如果PowerShellISE.Exe正在运行,那么您需要创建它的配套配置文件PowerShellISE.Exe.config
如果您只需要在。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