スイッチを指定せずに、PowerShell 2 を Windows 8 のデフォルトの PowerShell バージョンとして使用したいと考えています-Version
。
PowerShell 3 に付属する Windows 8 RTM を使い始めましたが、PowerShell 3 と互換性のないスクリプトがあります。
スイッチを指定せずに、PowerShell 2 を Windows 8 のデフォルトの PowerShell バージョンとして使用したいと考えています-Version
。
PowerShell 3 に付属する Windows 8 RTM を使い始めましたが、PowerShell 3 と互換性のないスクリプトがあります。
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 になります。
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 に対してビルドされている場合は、さらに問題が発生します。そうではないことを願っています。