如何在扩展命令中从文件资源管理器中获取多选文件

How to get the Multi Selected files from the File Explorer in an extension command

package.json 中,您可以向文件资源管理器上下文菜单添加命令。

在文件资源管理器中,您可以 select 多个文件,但我的命令仅获取最后一个 selected 文件 URI 作为参数。

我可以在文件资源管理器中获取所有 selected 文件的列表吗?

您可以查看我的扩展 Find and Transform 以了解在触发资源管理器上下文菜单命令时我如何解析多个文件。 [那里有一些额外的代码,因为该命令可以通过键绑定或 explorer/editor/tab 菜单触发,因此必须以不同的方式处理它们。]

let contextMenuCommandFile = vscode.commands.registerCommand('find-and-transform.searchInFile', async (...commandArgs) => {

    let args = {};

    if (commandArgs?.length === 1 && !(commandArgs[0] instanceof vscode.Uri)) {   // if from keybinding
      let argsArray = Object.entries(commandArgs[0]).filter(arg => {
        return searchCommands.getKeys().includes(arg[0]);
      });
      Object.assign(args, Object.fromEntries(argsArray));
    }

    args.filesToInclude = await parseCommands.parseArgs(commandArgs, "file");
    args.triggerSearch = true;
        searchCommands.useSearchPanel(args);
    });

    context.subscriptions.push(contextMenuCommandFile);

您可能缺少此 async (...commandArgs) => { 以将所有可用的传递参数放入数组中。

...commandArgs 如果来自键绑定,长度为 1,如果从上下文菜单触发,长度为 2 不管 之前在资源管理器中选择了多少文件右键单击其中一个并选择命令。

commandArgs[0] 是我右键单击的单个文件(即最后一个文件)。
commandsArgs[1] 本身就是资源管理器中所有选定文件的数组。

然后我将要解析的 commandArgs 数组(因为我只需要一个以逗号分隔的所选文件列表)发送到 parseCommands.parseArgs() [好吧,名字奇怪的函数!]。 =20=]

那里的操作位是:

    else if (commandArgs[1][0] instanceof vscode.Uri) {              // explorer/context
      for (const resource of commandArgs[1]) {
        const thisResource = vscode.workspace.asRelativePath(resource.fsPath);
        resources += `${ thisResource }, `;
      }
      resources = resources.substring(0, resources.length - 2);  // strip ', ' off end
      return resources;
    }