单行命令以打开另一个程序(如Git,PowerShell或命令行)中的文件列表

时间:2018-11-09 16:53:22

标签: git powershell command-line visual-studio-code

我想从VS Code中的一个分支中打开所有更改的文件。

现在我分两个步骤进行操作。

// copy the file list
PS> git diff master... --name-only | clip

// paste the file list
PS> code file1 file2 file3 ... fileN 

如何(如果有的话)我们可以在一排中做到这一点?我尝试过的是以下两种方法:

PS> git diff master... --name-only | code 
PS> git diff master... --name-only | code -

参考VS Code CLI docs

3 个答案:

答案 0 :(得分:1)

,(git diff master... --name-only) | % { code $_ }

creates开头的逗号,该数组具有沿流水线传递的单个元素。因此,在foreach中,只有一次迭代将文件名数组传递给代码。

我尚未在文件路径中使用空格对此进行测试。

或者,您无需做任何事情就可以做到

code (git diff signage-theme... --name-only)

答案 1 :(得分:1)

在文件名包含空格的情况下作为其他答案的替代方法:

#requires -Version 4
$files = @(& git.exe diff master... --name-only).
    ForEach{"""$PSItem"""} -join ' '
& code.cmd $files

此解决方案利用了嵌入式引号,cmd解析器会在不需要时将其删除。

答案 2 :(得分:1)

您可以git命令的输出作为自变量 传递给code

code (git diff master... --name-only)

PowerShell从外部程序中以 array 收集标准输出输出行。

假设git命令仅输出文件路径,每个文件路径都在其单独的行上,将该数组传递给另一个外部程序,例如code自动传递数组的元素为单个适当引用的参数。

例如,在Windows上,如果您运行以下命令:

code (cmd /c echo file1`& echo "file 2")

code将看到如下命令行:

...\code.cmd "file1" "file 2"

请注意,(直接)管道code并不是一种选择,因为code不接受文件路径< / em>来自stdin;您可以使用stdin传递(新)文件的内容,但是('Text for new doc' | code -)。

在此处通过PowerShell的ForEach-Object cmdlet使用管道没有好处。