Почему PowerShell не удается создать мои решения .NET? (“файл используется другим процессом”),

Я записал сценарий PowerShell для создания нескольких решений .NET один за другим. Это просто выполняет несколько вызовов к tfget (для получения последним) сопровождаемый вызовами к devenv.exe (для создания .sln файлов).

Вот код:

tfget -item $SolutionPath -overwrite -recurse -ev +errors
...
$out = invoke-expression "devenv.com /rebuild debug $SolutionPath"

Почти каждый раз, когда я запускаю скрипт, одному из решений не удается создать, и я получаю ошибку от высказывания CSC.exe(?):

ошибка CS1606: подписание Блока перестало работать; вывод не может быть подписан - процесс не может получить доступ к файлу, потому что он используется другим процессом.

Это происходит даже при том, что я закрыл все экземпляры Visual Studio, содержащей эти решения, и у меня нет ни одной из их работы exes моей машины.

Подобный пакетный файл, который я записал, работает просто великолепно. Это - только PowerShell, который жалуется на файл, используемый другим процессом.

Как я могу постараться не иметь, это происходит? Есть ли какие-либо лучшие примеры там создания решений .NET через PowerShell?

5
задан urig 27 December 2011 в 11:41
поделиться

2 ответа

Не используйте выражение-вызов. Просто вызовите devenv.exe непосредственно в файле SLN (или, если на то пошло, просто используйте MSBuild.exe, если у вас нет установки или других неподдерживаемых типов проектов). Одна из прелестей использования языка сценариев оболочки заключается в том, что они разработаны для довольно беспроблемной работы с консольными exes. Мы делаем это все время в сценариях PowerShell:

msbuild.exe "R:\Source\Foo.sln" /t:build /p:Configuration=Debug `
    /v:detailed 2>&1 | Out-String -stream -width 1024 > $DebugBuildLogFile

Мы запускаем вывод через Out-String, чтобы вывод файла журнала не переносился на 80 или 120 символов (ширина по умолчанию консоли, на которой запускается сценарий).

14
ответ дан 18 December 2019 в 11:55
поделиться

Это потому, что devenv работает в фоновом режиме. Вы должны запустить его и дождаться завершения.

Это должно сработать:

$p = Start-Process -FilePath devenv -ArgumentList $solutionPath,"/Rebuild Debug" -PassThru
$null = $p.WaitForExit(-1)

Я также использую его для создания своих решений.

3
ответ дан 18 December 2019 в 11:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: