如何使用具有多个文件名的shell脚本执行VSTest.Console.exe

时间:2016-05-09 19:13:18

标签: shell powershell-v3.0

我有一个文件夹,其中有一些dll包含单词“Tests”作为文件名

  

例如“C:\ Api \ Myfile.Tests.dll”

我需要获取其中包含名称“Tests”的文件,并使用power shell脚本将文件作为文件传递给VSTest.Console.exe。

我的代码是

$DirectoryName = "C:\api";
$Parameters = "";

Get-ChildItem  $DirectoryName -Filter "*Tests*" | ForEach-Object {
    $Parameters = $Parameters + $DirectoryName + "\" + $_ ;
}

$TestRunner = "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe";

$Parameters;

# & $TestRunner "C:\api\Base.Tests.dll" "C:\api\Model.Tests.dll";

& $TestRunner $Parameters;

$ Parameters提供包含“Tests”的所有文件名。形成的字符串带有

之类的空格
  

C:\ api \ Base.Tests.dll C:\ api \ Model.Tests.dll

但剧本仍无效。我认为它作为一个单一的路径,因为它在一个刺痛的变量。如果是这样,那么如何解决这个问题。

3 个答案:

答案 0 :(得分:2)

我认为可能存在两个问题:

  • Foreach-Object连接需要附加一个插入空间。
  • 文件路径需要用引号括起来。 (在我发现这个问题之前,我尝试调用vstest时遇到了同样的问题。)

此代码对我有用:

    Get-ChildItem $DirectoryName  -Filter "*Tests*" |
    ForEach-Object {$parameters = $parameters + "`"" + $directoryName + "\" + $_ + "`" ";}

答案 1 :(得分:1)

希望这能节省一些时间......但由于我的可执行路径包含空格,我遇到了麻烦......

所以,我必须将我的命令格式化为字符串。请注意转义'&'和逃脱的报价。显然,带空格的命令需要包含'&'...我也尝试通过'&'直接调用它...但是,它删除了dll参数列表的双引号并在整个混乱中引用了引号这不是vsTest.Console.exe所期望的......无论如何,这里的解决方案对我有用......

Function Get-AllTestDllsAsQuotedStrings {
    $parameters = ""

    Get-ChildItem `
        -Path "C:\code\git\YourProject\Source" `
        -File `
        -Recurse `
        -Filter *.dll |
        where-object FullName -Like *bin\debug\*test*.dll |
        ForEach-Object {
            $parameters = $parameters + "`"" + $_.FullName + "`" ";
        }

    return $parameters
}



$vsTestConsoleExe = "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe"

$command = "`& `"$vsTestConsoleExe`" $(Get-AllTestDllsAsQuotedStrings)"

write-host $command

invoke-expression $command

答案 2 :(得分:0)

如果有帮助,这是我的解决方案:

$Paths = Get-Childitem Test -recurse  | Where-Object {$_.PSIsContainer  -and $_.FullName -notmatch "obj" -and $_.name -like "net462"} | Select-Object -expandproperty fullname 

$Args = Get-ChildItem -Path $Paths -Filter "*Tests.dll"  | Select-Object -expandproperty fullname 

$Args = $Args + "/InIsolation" + "/Logger:trx;logfile=net462.trx" +"/Enablecodecoverage"

$exe = 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe'

echo $Args 

& $exe $Args