Сборка TFS с использованием PowerShell x86 для запуска

#powershell #tfs #tfsbuild

#powershell #tfs #tfsbuild

Вопрос:

В настоящее время у меня есть настройка определения сборки, в которой я вызываю скрипт PowerShell для выполнения некоторых «дополнительных действий», таких как использование пользовательского номера версии и подписание DLL. Проблема, с которой я сталкиваюсь, заключается в том, что в моем сценарии PowerShell я пытаюсь загрузить сборку, чтобы я мог создать объект определенного типа, и я получаю сообщение об ошибке при попытке загрузки сборки. Я обнаружил, что сборка, которую мне нужно загрузить, требует, чтобы скрипт запускался как процесс x86.

Я обнаружил это, когда запустил свой сценарий PowerShell как Windows Powershell x86 вместо обычного процесса Windows PowerShell. Есть ли способ в моем определении сборки, где я могу указать, какой процесс я могу запустить как? Например, в шаблоне процесса сборки или даже в самом скрипте?

Ответ №1:

Я делал это однажды в прошлом, так что убедитесь сами, работает ли он все еще.

 # Get the path where powershell resides.  If the caller passes -use32 then  
# make sure we are returning back a 32 bit version of powershell regardless 
# of the current machine architecture 
function Get-PowerShellPath() { 
    param ( [switch]$use32=$false, 
            [string]$version="1.0" ) 

    if ( $use32 -and (test-win64machine) ) { 
        return (join-path $env:windir "syswow64WindowsPowerShellv$versionpowershell.exe") 
    } 

    return (join-path $env:windir "System32WindowsPowerShellv$versionpowershell.exe") 
} 


# Is this a Win64 machine regardless of whether or not we are currently  
# running in a 64 bit mode  
function Test-Win64Machine() { 
    return test-path (join-path $env:WinDir "SysWow64")  
} 

# Is this a Wow64 powershell host 
function Test-Wow64() { 
    return (Test-Win32) -and (test-path env:PROCESSOR_ARCHITEW6432) 
} 

# Is this a 64 bit process 
function Test-Win64() { 
    return [IntPtr]::size -eq 8 
} 

# Is this a 32 bit process 
function Test-Win32() { 
    return [IntPtr]::size -eq 4 
} 

function Get-ProgramFiles32() { 
    if (Test-Win64 ) { 
        return ${env:ProgramFiles(x86)} 
    } 

    return $env:ProgramFiles 
} 

function Exec-Script32
{
    param(
        [string] $scriptPath
    )

    $scriptName = Split-Path -Leaf $scriptPath
    $innerLogFilename = Join-Path $env:TEMP $scriptName
    $innerLogFilename  = ".log"
    $dataFilename = Join-Path $env:TEMP $scriptName
    $dataFilename  = ".data"
    Export-Clixml -Path $dataFilename -InputObject $Args
    $ps32 = Get-PowershellPath -use32
    Write-Verbose "### Re-entering '$scriptPath' in 32-bit shell"
    Write-Verbose "### Logging to '$innerLogFilename'"
    # call this exact file
    amp; $ps32 -File $scriptPath $dataFilename 2>amp;1 > $innerLogFilename
    $succeeded = $?
    Write-Output (Get-Content $innerLogFilename)
    Remove-Item $innerLogFilename
    if (!$succeeded) {
        #forward
        throw "$scriptPath failed"
    }
}
  

Ответ №2:

Почему вы не запускаете версию PowerShell для x86 из MSBuild?

 <Exec Command="$(WinDir)SysWOW64WindowsPowerShellv1.0powershell.exe myscript.ps1"/>
  

Если вы используете вариант TeamBuild для рабочего процесса, просто запустите PowerShell.exe из пути SysWOW64.