单行命令用于打开其他程序(如Git,PowerShell或命令行)中的文件列表

问题描述 投票:1回答:3

我想从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

git powershell command-line visual-studio-code
3个回答
1
投票

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

逗号在开头creates是一个数组,其中包含一个传递给管道的单个元素。所以在foreach中,只有一个迭代将文件名数组传递给代码。

我没有用文件路径中的空格来测试它。

或者,不用推动管道就可以做到

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


1
投票

作为包含空格的文件名的另一个答案的替代方法:

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

此解决方案使用嵌入式引号,如果不需要,cmd解析器将剥离它。


1
投票

您可以将git命令的输出作为参数传递给code

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

PowerShell从数组中的外部程序收集stdout输出行。

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

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

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

code会看到如下命令行:

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.