7

スイッチを指定せずに、PowerShell 2 を Windows 8 のデフォルトの PowerShell バージョンとして使用したいと考えています-Version

PowerShell 3 に付属する Windows 8 RTM を使い始めましたが、PowerShell 3 と互換性のないスクリプトがあります。

4

2 に答える 2

6

Powershell はパブリッシャー ポリシー(こちらも参照) を使用して、Powershell 2 に対してビルドされたホストを Powershell 3 ランタイム (利用可能な場合) に自動的にリダイレクトします。

ほとんどの場合、これで問題ありませんが、アプリで必要な場合は、発行元ポリシーを明示的に無効にすることができます。

これを app.config ファイルに追加して、System.Management.Automation (powershell ランタイム) のパブリッシャー ポリシーを無効にします。

<configuration>
  <runtime>
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
       <dependentAssembly>
         <assemblyIdentity name="System.Management.Automation" publicKeyToken="31bf3856ad364e35" />
         <publisherPolicy apply="no" />
      </dependentAssembly>
     </assemblyBinding>
  </runtime>
</configuration>

テスト (.NET 4.0 を対象とするコンソール アプリ、PS v2 ランタイムへの明示的な参照):

PowerShell ps = PowerShell.Create();
ps.AddScript("$psversiontable");
var result = ps.Invoke()[0].BaseObject as Hashtable;

Console.WriteLine("Powershell version: {0}", result["PSVersion"]);
Console.WriteLine(".NET version: {0}", typeof(string).Assembly.GetName().Version);

私のWin8ボックス(PSv3は間違いなくそこにあります)でこれを実行すると、次の結果が得られます

Powershell version: 2.0
.NET version: 4.0.0.0

app.config をコメントアウトすると、PS バージョンは 3.0 になります。

于 2012-08-21T21:34:32.450 に答える
0

PowerShell をホストするカスタム アプリケーションがあり、スクリプトがアプリケーションに埋め込まれているとします。このアプリケーションの名前を「MyApp.exe」とします。現在、PowerShell 3.0 には .NET 4.0 (CLR4) が必要であるため、アプリケーションに強制的に PowerShell 2.0 を使用させる方法は、アプリケーションに強制的に .NET 3.5 (CLR2) を使用させることです。これにより、CLR4 専用の 3.0.0.0 バージョンではなく、System.Management.Automation の 1.0.0.0 バージョンが読み込まれます。次の内容で、アプリケーションと同じフォルダーに「MyApp.exe.config」を作成します。

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

アプリケーションが CLR4 と PowerShell 2.0 に対してビルドされている場合は、さらに問題が発生します。そうではないことを願っています。

于 2012-08-21T20:17:29.180 に答える