Как назвать popen () с путем, содержащим пробелы в соответствии с Windows в C/C++?

Уже существует метод в ActiveSupport, который делает это.

['an array', 'of active record', 'objects'].index_by(&:id)

И только для справки, вот реализация:

def index_by
  inject({}) do |accum, elem|
    accum[yield(elem)] = elem
    accum
  end
end

, Который, возможно, был пересмотрен в (если Вы отчаянно нуждаетесь в остротах):

def index_by
  inject({}) {|hash, elem| hash.merge!(yield(elem) => elem) }
end
6
задан GabrieleV 12 October 2009 в 21:39
поделиться

2 ответа

Взгляните на Что эквивалентно posix popen в win32 api . Я давно отказался от попытки использовать _popen () под Windows. Решение на чистом WIN32 работает намного надежнее.

Если mingw передает ваши параметры в sh -c вместо cmd.exe / c , то вы, вероятно, захотите изменить эти обратные косые черты. на косую черту. Что-то вроде следующего должно помочь:

"\"C:/Program Files/CA/BrightStor ARCserve Backup/ca_qmgr.exe\" -list"
4
ответ дан 8 December 2019 в 16:05
поделиться

Согласно странице руководства для popen:

Аргумент команды является указателем на строка с завершающим нулем, содержащая командная строка оболочки. Эта команда передается в / bin / sh с помощью флага -c; интерпретация, если таковая имеется, выполняется оболочкой.

Итак, вы хотите экранировать строку для sh для синтаксического анализа. Вам не нужно экранировать аргумент -list , и вы можете попытаться экранировать пробелы вместо того, чтобы заключать в кавычки все имя программы. У меня нет системы Windows для тестирования, но я бы посоветовал

#define RUN_COMMAND "C:\\Program Files\\CA\\BrightStor\\ ARCserve\\ Backup\\ca_qmgr.exe -list"
int main() {
    outputPointer = popen(RUN_COMMAND, "r");
    ...
}
-1
ответ дан 8 December 2019 в 16:05
поделиться