[.net] .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의 최신 버전 .NET을 PowerShell과 함께 사용하는 것 입니다. 이를 통해 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 검색 링크)를 통해 다운로드 할 수 있습니다 .