Я не знаком с Дженкинсом, но похоже, что это 32-битный процесс.
Можете ли вы указать местоположение исполняемого файла PowerShell? Если это так, попробуйте использовать этот путь: C:\Windows\SysNative\WindowsPowerShell\v1.0\powershell.exe
Если вы не можете этого сделать, вы можете сделать это в коде в своей «последовательности выполнения» с помощью Invoke-Command
:
Invoke-Command -ComputerName . -ScriptBlock { [Environment]::Is64BitProcess }
Весь код в скриптблоке будет запущен в отдельном 64-битном процессе, и результаты будут сериализованы и возвращены.
В 32-разрядной ОС Windows системная папка C:\Windows\System32
. В 64-битной ОС Windows 64-битная системная папка также C:\Windows\System32
. Но системная папка для 32-битных процессов при установке 64-битной Windows фактически C:\Windows\SysWOW64
.
Для совместимости 32-разрядный процесс на 64-битной ОС будет иметь любые вызовы C:\Windows\System32
, прозрачно перенаправленные на C:\Windows\SysWOW64
, без ведома процесса.
Чтобы включить 32 битный процесс для ссылки на real System32
на 64-битной ОС, вы можете использовать C:\Windows\SysNative
.
Поскольку PowerShell имеет 32-битную и 64-битную версию и он живет внутри системных папок, вам нужно использовать приведенные выше правила для ссылки на правильный исполняемый файл в зависимости от того, вызываете ли вы его из 64- или 32-битного процесса.
Типичный сценарий (вы хотите вызвать версия той же битности) проще всего (просто назовите powershell.exe
или обратитесь к ней через System32
), но она становится волосатой, если вы хотите ссылаться на другую версию .
Invoke-Command
Метод Командлет Invoke-Command
позволяет запускать код, как правило, на другом компьютере, но вы можете запускать его на том же компьютере. Это вызовет совершенно отдельный процесс, и любой вывод будет сериализован и отправлен обратно в вызывающий процесс.
Предостережение этому методу заключается в том, что вы должны включить удаленное управление PowerShell на машине через Enable-PSRemoting
или Групповая политика (бесстыдный автозапуск).
Профиль по умолчанию (Microsoft.PowerShell
), к которому вы подключаетесь на 64-битной машине, будет 64-разрядной версией PowerShell, независимо от того, OS вызывающего абонента.
Кстати, если вы хотите использовать Invoke-Command
для подключения к 32-битной версии, вы можете сделать это, явно указав профиль Microsoft.PowerShell32
.
с практическими рекомендациями VB:
Public Function GetOSVersion() As String
Select Case Environment.OSVersion.Platform
Case PlatformID.Win32S
Return "Win 3.1"
Case PlatformID.Win32Windows
Select Case Environment.OSVersion.Version.Minor
Case 0
Return "Win95"
Case 10
Return "Win98"
Case 90
Return "WinME"
Case Else
Return "Unknown"
End Select
Case PlatformID.Win32NT
Select Case Environment.OSVersion.Version.Major
Case 3
Return "NT 3.51"
Case 4
Return "NT 4.0"
Case 5
Select Case _
Environment.OSVersion.Version.Minor
Case 0
Return "Win2000"
Case 1
Return "WinXP"
Case 2
Return "Win2003"
End Select
Case 6
Select Case _
Environment.OSVersion.Version.Minor
Case 0
Return "Vista/Win2008Server"
Case 1
Return "Win7/Win2008Server R2"
Case 2
Return "Win8/Win2012Server"
Case 3
Return "Win8.1/Win2012Server R2"
End Select
Case 10 //this will only show up if the application has a manifest file allowing W10, otherwise a 6.2 version will be used
Return "Windows 10"
Case Else
Return "Unknown"
End Select
Case PlatformID.WinCE
Return "Win CE"
End Select
End Function
<час> public string GetOSVersion()
{
switch (Environment.OSVersion.Platform) {
case PlatformID.Win32S:
return "Win 3.1";
case PlatformID.Win32Windows:
switch (Environment.OSVersion.Version.Minor) {
case 0:
return "Win95";
case 10:
return "Win98";
case 90:
return "WinME";
}
break;
case PlatformID.Win32NT:
switch (Environment.OSVersion.Version.Major) {
case 3:
return "NT 3.51";
case 4:
return "NT 4.0";
case 5:
switch (Environment.OSVersion.Version.Minor) {
case 0:
return "Win2000";
case 1:
return "WinXP";
case 2:
return "Win2003";
}
break;
case 6:
switch(Environment.OSVersion.Version.Minor) {
case 0:
return "Vista/Win2008Server";
case 1:
return "Win7/Win2008Server R2";
case 2:
return "Win8/Win2012Server";
case 3:
return "Win8.1/Win2012Server R2";
}
break;
case 10: //this will only show up if the application has a manifest file allowing W10, otherwise a 6.2 version will be used
return "Windows 10";
}
break;
case PlatformID.WinCE:
return "Win CE";
}
return "Unknown";
}
Существует пример C++ в msdn http://msdn.microsoft.com/en-us/library/ms724429 (По сравнению с 85) .aspx, наряду с примечанием, которое кто-то добавил о том, как обернуть его для использования в .NET [VB]. Это похоже на "недостающий" бит, в котором Вы нуждаетесь, функция Win32 GetProductInfo ( ссылка PInvoke.net для этого ).
Между этим и ответом от Avram, необходимо смочь собрать строку полной версии.
Вы можете использовать WMI, чтобы получить дружественное название продукта ("Microsoft® Windows Server® 2008 Enterprise"):
using System.Management;
var name = (from x in new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem").Get().OfType<ManagementObject>()
select x.GetPropertyValue("Caption")).First();
return name != null ? name.ToString() : "Unknown";