programing

에서 PowerShell을 실행하는 방법NET 4 런타임?

elecom 2023. 4. 23. 10:05
반응형

에서 PowerShell을 실행하는 방법NET 4 런타임?

를 관리하는 PowerShell 스크립트를 업데이트하고 있습니다.NET 어셈블리이 스크립트는 에 대해 빌드된 어셈블리용으로 작성되었습니다.NET 2(PowerShell이 실행되는 프레임워크와 동일한 버전)이지만 이제 와 함께 작동해야 합니다.및 NET 4 어셈블리.NET 2 어셈블리

.NET 4는 이전 버전의 프레임워크에 대해 구축된 애플리케이션을 실행할 수 있도록 지원하므로 가장 간단한 해결책은 를 사용하여 PowerShell을 실행하는 것입니다.에 대해서 실행할 필요가 있는 경우는, NET 4 런타임입니다.NET 4 어셈블리

에서 PowerShell을 실행하는 방법NET 4 런타임?

제가 찾은 최고의 솔루션은 블로그 게시물 Using New Version(s)에 있습니다.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> 

기타 빠른 셋업 노트:

장소와 파일은 플랫폼에 따라 다소 다릅니다.다만, 솔루션을 어떻게 기능시킬지에 대한 인라인 요지가 표시됩니다.

  • PowerShell을 실행하면 수 .cd $pshome (DOS 프롬프트에서는 동작하지 않습니다)
    • 경로는 다음과 같습니다(예시).C:\Windows\System32\WindowsPowerShell\v1.0\
  • 과 같습니다.powershell.exe.config PowerShell.exe실행 중입니다(필요한 경우 구성 파일을 만듭니다).
    • ifPowerShellISE.Exe 중일 경우 .이 파일을 작성하려면 , 「동행 Configuration파일을 작성해야 합니다.PowerShellISE.Exe.config

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에서는 다음과 같이 구성 파일($psHome\powershell_ise.exe.config)을 변경할 수 있습니다.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup>
      <supportedRuntime version="v4.0.30319" />
    </startup>
</configuration>

을 빌드할 수 있습니다.PowerShell API(시스템)를 사용하여 PowerShell을 호출하는 NET 4.0 애플리케이션.관리.자동화PowerShell)은 문제 없습니다만, 이러한 단계를 통해 기본 제공 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 명령이 중단될 수 있습니다.

에서 명령어, 스크립트블록 또는 스크립트파일을 1개만 실행할 필요가 있는 경우NET 4, 에서 Activation Configuration Files 를 사용해 보십시오.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=

그러면 에서 실행되는 powershell 콘솔의 인스턴스를 시작할 수 있습니다.NET 4.0.

PowerShell 2.0을 탑재한 시스템에서 cmd에서 실행되는 다음 두 명령어의 출력을 조사하면 차이를 확인할 수 있습니다.

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

다음은 양쪽을 지원하기 위해 사용한 Configuration파일의 내용을 나타냅니다.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년 이전이며 PowerShell 1.0 또는 PowerShell 2.0을 새로운 버전의 대상으로 "해킹"하는 데 중점을 두고 있습니다.NET Framework and Common Language Runtime(CLR; 공통 언어 런타임)입니다.

그러나 많은 의견에서 언급되었듯이 2012년(PowerShell 3.0이 출시된 이후)부터 최신 버전의 PowerShell을 설치하는 것이 훨씬 더 나은 솔루션입니다.자동으로 CLR을 대상으로 합니다.v4.0.30319. 즉,NET 4.0, 4.5, 4.5.1, 4.5.2 또는 4.6(2015년 예상)은 모두 서로 인플레이스 치환된 버전이기 때문입니다.사용하다$PSVersionTable또는 설치된 PowerShell 버전 확인 스레드를 참조하십시오.편집: 스레드화.PowerShell 스크립트에서 사용하는 NET 버전

작성 시점의 PowerShell 최신 버전은 4.0이며 Windows Management Framework(Google 검색 링크)사용하여 다운로드할 수 있습니다.

실제로 를 사용하여 PowerShell을 실행할 수 있습니다.NET 4(다른 것에 영향을 주지 않습니다).NET 어플리케이션새로운 HttpWebRequest "Host" 속성을 사용하려면 이 작업을 수행해야 하는데, "OnlyUseLatestCLR"을 변경하면 Fiddler가 고장났습니다.넷 4

PowerShell 개발자는 이러한 상황을 예견하고 사용할 Framework 버전을 지정하는 레지스트리 키를 추가했습니다.한 가지 사소한 문제는 레지스트리 키를 변경하기 전에 소유권을 취득해야 한다는 것입니다.관리자라도 액세스 권한이 없기 때문입니다.

  • HKLM:\소프트웨어\마이크로소프트\PowerShell\1\PowerShell엔진\RuntimeVersion (64비트 및 32비트)
  • HKLM:\소프트웨어\Wow6432 노드\Microsoft\PowerShell\1\PowerShell엔진\RuntimeVersion (64비트 머신에서는 32비트)

해당 키의 값을 필요한 버전으로 변경합니다.단, 일부 스냅인은 이 아니면 로딩되지 않을 수 있습니다.NET 4 대응 (WASP만이 문제가 있었습니다만, 어쨌든 잘 사용하지 않습니다.)VMware, SQL Server 2008, PSCX, Active Directory(Microsoft 및 Quest 소프트웨어) 및 SCOM은 모두 정상적으로 동작합니다.

레지스트리 파일 또는 app.config 파일을 수정하지 않을 경우 단순 파일을 작성하는 방법도 있습니다.PowerShell.exe 기능을 모방하여 PowerShell ConsoleShell을 호스트하는 NET 4 콘솔 앱.

옵션 2 – Windows PowerShell 호스팅을 직접 참조하십시오.

먼저 시스템에 대한 참조를 추가합니다.관리.자동화Microsoft.PowerShell.%programfiles%\에 있는 ConsoleHost 어셈블리참조 어셈블리\Microsoft\Windows PowerShell\v1.0

그런 다음 다음 코드를 사용합니다.

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 릴리스에서는 정상적으로 동작)를 설정하지 않습니다.

powershell를 powershell.exe와 함께 .COMPLUS_version가 「」로 되어 있다.v4.0.30319 cmd 또는 입니다. "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

반응형