Использование PowerShell 2 в качестве стандартной версии для Windows 8

Я хотел бы использовать PowerShell 2 в качестве версии PowerShell по умолчанию в Windows 8 без указания переключателя -Version.

Я начал использовать RTM для Windows 8, который поставляется с PowerShell 3, и у меня есть сценарии, которые не совместимы с PowerShell 3.

Ответ 1

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

И версия PS идет до 3.0, если я комментирую app.config.

Ответ 2

Вы говорите, что у вас есть настраиваемое приложение, в котором размещается PowerShell, и что скрипты встроены в приложение. Предположим, что это приложение называется "MyApp.exe". Теперь PowerShell 3.0 требует .NET 4.0 (CLR4), поэтому способ заставить приложение использовать PowerShell 2.0 - заставить ваше приложение использовать .NET 3.5 (CLR2). Это приведет к загрузке версии 1.0.0.0 System.Management.Automation вместо версии 3.0.0.0, предназначенной только для CLR4. Создайте "MyApp.exe.config" в той же папке, что и приложение со следующим содержимым:

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

Теперь, если ваше приложение было создано против CLR4 и PowerShell 2.0, вам будет немного больше неприятностей. Надеюсь, это не так.