2009-06-17 2 views
2

У меня есть сценарий MSBuild, который я хочу вызвать из сценария PowerShell как часть процесса развертывания. Если я вызываю скрипт сборки через файл bat, все работает хорошо. Если я сделаю то же самое в PowerShell, я получаю ошибку CS1668 для поиска странных и замечательных путей, которые не существуют на моей машине. Я знаю, что я попадаю в сценарий MSBuild, поскольку эти ошибки происходят из-за целей сценария MSBuild (это показывает вывод журнала). Файл bat и сценарий PowerShell находятся в том же месте, рядом с скриптом сборки.MSBuild не работает при запуске через Powershell

Ошибки:

ошибка CS1668: Предупреждение как ошибка: Неверный путь поиска 'C: \ Program Files \ Microsoft Visual Studio \ VC \ AtlMfc \ Lib' указан в «LIB переменная среды '-' Система не может найти указанный путь. ' ошибка CS1668: предупреждение как ошибка: Неверный путь поиска 'C: \ Program Files \ Microsoft Visual Studio \ VC \ PlatformSDK \ Lib' указан в 'переменной окружения LIB' -' Система не может найти путь указан. '

Я проверил, и ни один из этих путей не существует на моей машине. Почему запуск с PowerShell изменит пути, которые ищет MSBuild?

Заранее спасибо

RhysC

Edit- добавление в код: NB имя сценария MSBuild является AutomatedDebug.build Powershell SCRIPT:

#Begining of script 
$CurrentPath = Split-Path (Split-Path $myinvocation.mycommand.path) 
#Assign the Build script paths. 1 is for building and testsing, 1 is for deployment (to keep things clean) 
$MSBuildScriptBuildAndTestPath = $CurrentPath + "\Tools\AutomatedDebug.build" 
$MSBuildScriptDeployPath = $CurrentPath + "\Tools\Deploy.build" 

#Run the automated build with tests 
Write-Host "*** Run the automated build with tests ***" 
C:\Windows\Microsoft.NET\Framework\v3.5\MSbuild.exe $MSBuildScriptBuildAndTestPath "/t:AllTests" "/l:FileLogger,Microsoft.Build.Engine;logfile=AllTests.log" 
if($LastExitCode -ne 0) 
{ 
    throw "AllTests failed" 
} 
Write-Host "*** FINISHED: Run the automated build with tests ***" 

Bat Файл

@C:\Windows\Microsoft.NET\Framework\v3.5\MSbuild.exe AutomatedDebug.build /t:AllTests /l:FileLogger,Microsoft.Build.Engine;logfile="AllTests.log" 
@pause 
enter code here 

ответ

0

Это, скорее всего, связано с тем, как вы проходите метров в сценарий MSBuild. Существует несколько ключевых различий разбора параметров между CMD и PowerShell и с помощью пакетного файла вы неявно используете механизм анализа синтаксиса CMD для передачи параметров в MSBuild. Если вы опубликуете используемую вами командную строку, один из гуру PowerShell здесь, вероятно, поможет отладке, когда параметры путаются.

+0

Я уверен, что это не параметры, потому что есть только цель сборки и логгер, определенные из которых принимаются, когда цель запущена, и она отображается в указанном файле журнала. спасибо. – RhysC

+0

Поскольку ошибки касаются содержимого переменных среды, использующих cmd или powershell, здесь не должно быть никакого значения. Анализ в оболочке не имеет ничего общего с envvars, поскольку они просто копируются в порожденный процесс. – Joey

+0

Я знаю, что у меня ничего не получается, но я предположил, что это путь, который можно переписать в любом виде. Johannes; вы говорите, что они должны быть одинаковыми? какие-либо идеи, почему его неудача? – RhysC

0

Мне интересно, в основном вы получаете здесь «Предупреждение как ошибку». Вы можете попытаться отключить обработку предупреждений как ошибок (я имею в виду, что наличие пути lib, который не существует, не звучит , что плохо для меня), или вы позволяете вашим сценариям распечатывать соответствующие переменные среды (используя echo %LIB% и $Env:LIB соответственно) из сценариев и искать различия.

Однако, поскольку envvars для VS не установлены глобально по умолчанию (поэтому есть три команды командной строки Visual Studio), вы должны где-то указать все переменные. Если вы делаете это в скриптах, у вас может быть опечатка где-нибудь?

+0

Хорошо спасибо. Я не эксплицитно задаю env varibles в любом из скриптов, так что возможно ли, что строка cmd и powershell будут искать переменные окружения differnt? – RhysC

+0

Хорошо, я вхожу в мой профиль.ps1, и похоже, что там могут быть vv2005 env vars ... путь VS8 должен был быть подсказкой, поскольку я использую vs2008 (vs9) – RhysC

+0

По умолчанию ни одна из оболочек не использует переменные среды, такие как переменные _environment_, а не переменные оболочки, поэтому независимо от используемой программы. Каждый процесс имеет локальную копию глобальных переменных, которые он может модифицировать и распространяться по своему вкусу (что и есть SET в cmd или $ Env: Foo = "Bar" в PS), но это остается полностью в приложении, хотя копия этих переменных процесса распространяется на порожденные процессы, поэтому они наследуют переменные своего вызывающего. Очистите пути в вашем $ PROFILE, и он должен работать, я думаю. – Joey

2

Хорошо, что на самом деле происходит то, что я загрузил расширения сообщества Powershell (http://pscx.codeplex.com) много лет назад, и там есть файл Environment.VisualStudio2005.ps1, который добавляет EnvVars, который не существует. Это (я предполагаю), потому что я не использую VS2005. Я сделал это, и все хорошо.Я попытался найти эквивалент 2008 года, но у него слишком много удачи. Честно говоря, я не использую powershell для его полного потенциала, поэтому я сомневаюсь, что мне даже нужен PSCX на моей машине.

Спасибо, ребята, за вашу помощь.

Смежные вопросы