【问题标题】:How to execute VSTest.Console.exe using a shell script with multiple filenames如何使用具有多个文件名的 shell 脚本执行 VSTest.Console.exe
【发布时间】:2016-05-09 19:13:17
【问题描述】:

我有一个包含一些 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

但脚本仍然无法正常工作。我猜它是一个单一的路径,因为它在一个变量中。如果是这样,那么如何解决这个问题。

【问题讨论】:

    标签: shell powershell-3.0


    【解决方案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】:

      我认为可能有两个问题:

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

      这段代码对我有用:

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

      【讨论】:

        【解决方案3】:

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

        $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 
        

        【讨论】:

          猜你喜欢
          • 2014-05-30
          • 1970-01-01
          • 1970-01-01
          • 2021-11-30
          • 1970-01-01
          • 2019-12-02
          • 1970-01-01
          • 1970-01-01
          • 2018-06-09
          相关资源
          最近更新 更多