.NET 4 런타임으로 PowerShell을 어떻게 실행할 수 있습니까?
일부 .NET 어셈블리를 관리하는 PowerShell 스크립트를 업데이트하고 있습니다. 이 스크립트는 .NET 2 (PowerShell과 동일한 프레임 워크 버전)에 대해 작성된 어셈블리를 위해 작성되었지만 이제는 .NET 4 어셈블리 및 .NET 2 어셈블리와 함께 작동해야합니다.
.NET 4는 이전 버전의 프레임 워크를 기반으로 구축 된 응용 프로그램 실행을 지원하므로 가장 간단한 솔루션은 .NET 4 어셈블리에 대해 실행해야 할 때 .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
.NET 4.0을 사용하도록 ISE 만 업데이트하려면 구성 ($ psHome \ 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를 사용하는 응용 프로그램
내가 찾은 최고의 솔루션은 PowerShell에서 .NET의 최신 버전 사용 블로그 게시물에 있습니다. 따라서 powershell.exe는 .NET 4 어셈블리와 함께 실행될 수 있습니다.
$pshome\powershell.exe.config
다음을 포함하도록 간단히 수정 (또는 작성) 하십시오.
<?xml version="1.0"?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0.30319"/>
<supportedRuntime version="v2.0.50727"/>
</startup>
</configuration>
추가 빠른 설치 정보 :
위치와 파일은 플랫폼에 따라 다릅니다. 그러나 솔루션이 어떻게 작동하게하는지에 대한 인라인 요지를 제공 할 것입니다.
cd $pshome
Powershell 창에서 실행 하면 컴퓨터에서 PowerShell의 위치를 찾을 수 있습니다 (DOS 프롬프트에서는 작동하지 않음).- 경로는 (예)와 같습니다
C:\Windows\System32\WindowsPowerShell\v1.0\
- 경로는 (예)와 같습니다
- 의 구성을 넣어 파일 이름은 다음과 같습니다
powershell.exe.config
당신이 경우에PowerShell.exe
(필요하다면 설정 파일을 생성)가 실행되고있다.PowerShellISE.Exe
실행중인 경우 컴패니언 구성 파일을 다음과 같이 작성해야합니다.PowerShellISE.Exe.config
레지스트리 키 접근 방식을 사용할 때는 매우주의하십시오. 이 키는 컴퓨터 전체의 키이며 모든 응용 프로그램을 .NET 4.0으로 강제 마이그레이션 합니다.
강제로 마이그레이션하는 경우 많은 제품이 작동하지 않으며 이는 테스트 지원이며 생산 품질 메커니즘이 아닙니다. Visual Studio 2008 및 2010, MSBuild , turbotax 및 많은 웹 사이트, SharePoint 등은 자동 마이그레이션되지 않아야합니다.
4.0에서 PowerShell을 사용해야하는 경우 구성 파일을 사용하여 응용 프로그램별로 수행해야하며 정확한 권장 사항을 PowerShell 팀에 확인해야합니다. 이로 인해 기존 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
PowerShell v1.0 또는 v2.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
다음은 .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 함수 와 유사 ).
다른 답변은 2012 년 이전의 답변으로, 최신 버전의 .NET Framework 및 CLR (공용 언어 런타임)을 대상으로 PowerShell 1.0 또는 PowerShell 2.0을 "해킹"하는 데 중점을 둡니다.
그러나 많은 의견에서 작성된 것처럼 2012 년 이후 (PowerShell 3.0이 출시 된 이후) 훨씬 더 나은 솔루션은 최신 버전의 PowerShell 을 설치하는 것 입니다. 자동으로 CLR을 대상으로 v4.0.30319
합니다. 이는 .NET 4.0, 4.5, 4.5.1, 4.5.2 또는 4.6 (2015 년에 예상 됨)을 의미하며,이 모든 버전은 서로 대체 할 수 있기 때문입니다. PowerShell 버전 이 확실하지 않으면 설치된 PowerShell 버전 확인 스레드를 사용 $PSVersionTable
하거나 참조하십시오 .
글을 쓰는 시점에서 최신 버전의 PowerShell은 4.0이며 Windows Management Framework (Google 검색 링크)를 통해 다운로드 할 수 있습니다 .
실제로 다른 .NET 응용 프로그램에 영향을주지 않고 .NET 4 를 사용하여 PowerShell을 실행할 수 있습니다 . 새 HttpWebRequest "Host"속성을 사용하려면 이렇게해야했지만 "OnlyUseLatestCLR"을 변경하면 Fiddler가 .NET 4에서 사용할 수 없으므로 Fiddler가 중단되었습니다.
PowerShell 개발자는 분명히 이런 일이 발생했을 것으로 예상하고 레지스트리 키를 추가하여 사용할 Framework 버전을 지정했습니다. 약간의 문제는 관리자조차도 액세스 권한이 없기 때문에 레지스트리 키를 변경하기 전에 소유권을 가져와야한다는 것입니다.
- HKLM : \ Software \ Microsoft \ Powershell \ 1 \ PowerShellEngine \ RuntimeVersion (64 비트 및 32 비트)
- HKLM : \ Software \ Wow6432Node \ Microsoft \ Powershell \ 1 \ PowerShellEngine \ RuntimeVersion (64 비트 시스템에서 32 비트)
해당 키의 값을 필요한 버전으로 변경하십시오. 일부 스냅인은 .NET 4 호환 가능하지 않으면 더 이상로드되지 않을 수 있습니다 (WASP는 문제가있는 유일한 도구이지만 실제로는 사용하지는 않습니다). VMWare , SQL Server 2008 , PSCX, Active Directory (Microsoft 및 Quest Software ) 및 SCOM 모두 잘 작동합니다.
레지스트리 또는 app.config 파일을 수정하지 않으려는 경우 다른 방법은 PowerShell.exe의 기능을 모방하고 PowerShell ConsoleShell을 호스팅하는 간단한 .NET 4 콘솔 앱을 만드는 것입니다.
옵션 2 – 직접 Windows PowerShell 호스팅을 참조하십시오.
먼저 % programfiles % \ Reference Assemblies \ Microsoft \ WindowsPowerShell \ v1.0 에있는 System.Management.Automation 및 Microsoft.PowerShell.ConsoleHost 어셈블리 에 대한 참조를 추가하십시오.
그런 다음 다음 코드를 사용하십시오.
using System;
using System.Management.Automation.Runspaces;
using Microsoft.PowerShell;
namespace PSHostCLRv4
{
class Program
{
static int Main(string[] args)
{
var config = RunspaceConfiguration.Create();
return ConsoleShell.Start(
config,
"Windows PowerShell - Hosted on CLR v4\nCopyright (C) 2010 Microsoft Corporation. All rights reserved.",
"",
args
);
}
}
}
다른 옵션과 마찬가지로 최신 PoshConsole 릴리스에는 구성없이 .NET 4 RC (RTM 릴리스와 잘 작동 함)를 대상으로하는 바이너리가 포함되어 있습니다.
COMPLUS_version
환경 변수를로 설정하여 powershell.exe를 실행하십시오 v4.0.30319
. 예를 들어 cmd.exe 또는 .bat 파일에서 :
set COMPLUS_version=v4.0.30319
powershell -file c:\scripts\test.ps1
참고 URL : https://stackoverflow.com/questions/2094694/how-can-i-run-powershell-with-the-net-4-runtime
'Programing' 카테고리의 다른 글
팬더에서 데이터 프레임의 열 조각을 가져 오는 방법 (0) | 2020.04.15 |
---|---|
iOS info.plist 파일에서 문자열을 현지화하는 방법은 무엇입니까? (0) | 2020.04.15 |
Visual Studio의 솔루션을 TFS에서 온라인으로 다시 가져 오려면 어떻게해야합니까? (0) | 2020.04.15 |
Java Streams가 왜 일회용입니까? (0) | 2020.04.15 |
PostgreSQL GROUP_CONCAT에 해당합니까? (0) | 2020.04.15 |