Запуск EXE-файла с помощью PowerShell из каталога с пробелами в нем

Пытаюсь запустить MSTest.exe из C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE. Более того, я беру все сборки в моем текущем каталоге и устанавливаю их как отдельные аргументы / testcontainer. Я не могу понять, как это сделать без жалоб PowerShell.

$CurrentDirectory = [IO.Directory]::GetCurrentDirectory()

$MSTestCall = '"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe"'

foreach($file in Get-ChildItem $CurrentDirectory) 
{
    if($file.name -match "\S+test\S?.dll$" )
    {
        $MSTestArguments += "/TestContainer:" + $file + " "
    }
}

$MSTestArguments += " /resultsFile:out.trx"
$MSTestArguments += " /testsettings:C:\someDirectory\local64.testsettings"

Invoke-Expression "$MSTestCall $MSTestArguments"

Ошибка, которую я получаю из этого кода:

Invoke-Expression: вы должны предоставить выражение значения в правой части оператора '/'.

Я не получаю эту ошибку, когда пытаюсь вызвать mstest.exe в каталоге без пробела в имени (никаких дополнительных "" не требуется).

Когда я пытаюсь использовать &,

&$MSTestCall $MSTestArguments

Он передает $ MSTestArguments как единственный аргумент, который MSTest prompty выбрасывает. Предложения?


person user467384    schedule 05.10.2010    source источник
comment
Дополнительные кавычки здесь не нужны (и в этом случае вызывают проблемы) - $MSTestCall = '"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe"'. Как только вы поместите "foo bar.exe" в переменную $foo, она будет содержать эту строку с пробелом. Вызов & $foo работает должным образом, т. Е. Выполняет команду, названную строкой в ​​переменной $foo.   -  person Keith Hill    schedule 06.10.2010
comment
Еще одно замечание о строках и регулярных выражениях. Обычно, если мне не нужно указывать переменную PowerShell в регулярном выражении, я использую строки в одинарных кавычках, поэтому PowerShell не интерпретирует такие вещи, как $ 1. Также вы указываете .dll, и я подозреваю, что вы хотите \.dll. Всё это дело в одинарных кавычках - '\S+test\S?\.dll$'.   -  person Keith Hill    schedule 06.10.2010


Ответы (2)


Я бы порекомендовал вам использовать массив параметров и оператор &. См. Примеры в моем ответе здесь: Выполнение Команда, хранящаяся в переменной из Powershell

В этом случае код должен быть примерно таким:

$MSTestCall = "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe"
$MSTestArguments = @('/resultsFile:out.trx', '/testsettings:C:\someDirectory\local64.testsettings')

foreach($file in Get-ChildItem $CurrentDirectory)  
{ 
    if($file.name -match "\S+test\S?.dll$" ) 
    { 
        $MSTestArguments += "/TestContainer:" + $file
    } 
} 

& $MSTestCall $MSTestArguments
person Roman Kuzmin    schedule 06.10.2010
comment
Отлично. Это отличное решение. Спасибо. - person user467384; 07.10.2010

Это работает?

$MSTestCall = @'"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe"'@
person Andrew Cooper    schedule 05.10.2010
comment
Это не сработает, потому что вам нужно начинать новую строку после открывающей здесь строковой последовательности @'. - person Keith Hill; 06.10.2010