(Node.js дочерний процесс) Нерестовый проводник с опцией / select не работает с пробелами в path

#node.js #windows #child-process #explorer

#node.js #Windows #дочерний процесс #проводник

Вопрос:

Я пишу скрипт узла, который выполняет функцию «Показать файл в проводнике». Мой код сводится к следующему:

 const {spawn} = require('child_process');

// This works (it opens C:/path/to/file and highlights the file named "WithoutSpaces"
spawn('explorer', ["C:\path\to\file\WithoutSpaces,", "/select"]);

// However, this does not work. It defaults to opening a file explorer window with my Documents folder.
spawn('explorer', ["C:\this path\has spaces,", "/select"]
spawn('explorer', ["C:\this path\has spaces\file.txt,", "/select"]

// Strangely, spaces DO work if I'm not doing the /select option:
spawn('explorer', ["C:\this path\has spaces,", "/select"]
  

Как ни странно, когда я использую аргумент /select для выбора файла, он работает только тогда, когда путь не содержит пробелов. Если в пути есть пробелы, то по умолчанию используется папка Documents .

Есть ли какой-либо способ обойти это? Возможно, есть способ закодировать пробел обратной косой чертой? Или, может быть, какие-то другие специальные аргументы для explorer команды?

Ответ №1:

Вам не хватает специфичной для Windows windowsVerbatimArguments: true опции, указанной в документации для обоих exec и spawn , но ее легко пропустить. Важно отметить, что по умолчанию для этого параметра установлено значение false, что противоположно тому, что вы хотите.

Следующее работает просто отлично:

 const path = require("path");
const {exec, spawn} = require("child_process");

spawn(`explorer`, [
  `/select,"${path.join(`C:`, `Program Files (x86)`, `Common Files`)}"`
], { windowsVerbatimArguments: true });