Как бороться с пробелами в пути, используя boost :: process :: child? - PullRequest
0 голосов
/ 08 апреля 2019

Мне нужно выполнить пакетный скрипт Windows.В соответствии с политикой компании я должен использовать boost::process::child в этом отношении.Путь к пакетному сценарию Windows содержит пробелы (например, C:\Foo Bar\batch.bat).

Я использую следующий код:

namespace bp = boost::process;
error_code errorCode;
bp::ipstream errorStream;
auto child = bp::child("C:\\Foo Bar\\batch.bat",
    errorCode,
    bp::std_out > bp::null,    // ignore standard output
    bp::std_err > errorStream, // capture standard error
    bp::windows::hide,        // hide window
    bp::shell);               // use shell

  vector<string> errorData;
  string errorLine;

  while (child.running() && getline(errorStream, errorLine) && !errorLine.empty())
  {
    errorData.push_back(errorLine);
  }
  child.wait();

Проблема в том, что система (boost :: process)не нашел пути.Сообщение об ошибке будет выглядеть следующим образом:

'C: \ Foo' не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл.

У меня также естьпробовал следующие варианты маскировки:

  • C:\\Foo Bar\\batch.bat
  • C:\\Foo\ Bar\\batch.bat
  • "C:\\Foo Bar\\batch.bat"
  • C:\\Foo~1\\batch.bat

Как правильно маскировать пробелы, чтобы child() мог правильно найти / выполнить пакетный скрипт?

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

Предлагаю подписаться на ответ Максима.

Либо выйдите из пробела, используя обратную косую черту:

"C:\\Foo\\ Bar\\batch.bat"
0 голосов
/ 08 апреля 2019

Оберните "C:\\Foo Bar\\batch.bat" в boost::filesystem::path(), чтобы она цитировала строку для вас:

auto child = bp::child(boost::filesystem::path("C:\\Foo Bar\\batch.bat"),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...