2015-07-12 2 views
1

Я пытаюсь написать программу, которая запускает другой исполняемый файл в той же папке с некоторыми аргументами, этот exe is pdftotext.exe из poppler-utils и создает текстовый файл.Запуск exe из другого exe

готовится строка передать его в качестве аргумента для system(), результат строки:

cd/D N:\folder0\folder1\folder2\foldern && pdftotext.exe data.pdf -layout -nopgbrk 

Сначала зайдите в директорию файла, а затем запустить исполняемый файл.

Когда я запускаю его я всегда получаю

sh: cd/D: No such file or directory 

но команда работает, если я запустить его непосредственно в режиме командной строки.

Я не думаю, что это важно, но это то, что я написал до сих пор:

#include <stdio.h> 
#include <stdlib.h> 
#include <windows.h> 
#include <string.h> 

// Function to get the base filename 
char *GetFileName(char *path); 

int main (void) 
{ 
    // Get path of the acutal file 
    char currentPath[MAX_PATH]; 

    int pathBytes = GetModuleFileName(NULL, currentPath, MAX_PATH); 
    if(pathBytes == 0) 
    { 
     printf("Couldn't determine current path\n"); 
     return 1; 
    } 

    // Get the current file name 
    char* currentFileName = GetFileName(currentPath); 

    // prepare string to executable + arguments 
    char* pdftotextArg = " && pdftotext.exe data.pdf -layout -nopgbrk"; 

    // Erase the current filename from the path 
    currentPath[strlen(currentPath) - strlen(currentFileName) - 1] = '\0'; 


    // Prepare the windows command 
    char winCommand[500] = "cd/D "; 
    strcat(winCommand, currentPath); 
    strcat(winCommand, pdftotextArg); 

    // Run the command 
    system(winCommand); 

    // Do stuff with the generated file text 

    return 0; 
} 
+1

Возможно, хотите создать процесс не в системе –

+0

@EdHeal, спасибо, я попробовал 'createProcess()', но не повезло, я не очень хорошо понимаю, что означает аргументы для этой функции, особенно последние два, любой пример приветствуется , – wallek876

+1

Множество примеров в Интернете, например https://msdn.microsoft.com/en-us/library/windows/desktop/ms682512(v=vs.85).aspx –

ответ

2

cd - это «оболочка», а не программа, которая может быть выполнена.

Чтобы применить его, запустите оболочку (cmd.exe под окнами) и передайте команды, которые вы хотите выполнить.

ли так м Сделайте содержание winCommand выглядеть следующим образом:

cmd.exe /C "cd/D N:\folder0\folder1\folder2\foldern && pdftotext.exe data.pdf -layout -nopgbrk" 

Пожалуйста, обратите внимание, что изменение диска и каталога, относится только к среде, используемой cmd.exe. Дисковод программы и каталог остаются такими, какими они были до звонка до system().


Update:

присмотревшись на сообщение об ошибке один замечает "sh: ...". Это явно указывает на то, что system() не вызывает cmd.exe, потому что он больше likley не будет префикс сообщения об ошибке вроде этого.

Из этого факта я смею заключить, что указанный код вызывается и работает под Cygwin.

Оболочка (ы), предоставленная и используемая Cygwin, не знает специфичную для Windows опцию /D команде оболочки cd, таким образом, ошибка.

Как однако снаряды, используемые Cygwin можно назвать cmd.exe мой orignally обеспечить подход работает, хотя я дал объяснений не так, как указал pmg «s comment ниже.

+0

Не является 'system()' предположил, что уже сделал это сам по себе? См. [7.22.4.8] (http://port70.net/~nsz/c/c11/n1570.html#7.22.4.8): * «... системная функция передает строку, указанную строкой, этому командному процессору который должен быть выполнен в соответствии с документом ... »* – pmg

+0

@pmg Hm ... - верно. Однако почему это ошибка 'cd/D: No такого файла или каталога'? – alk

+0

@pmg: см. Мой обновленный ответ. – alk

1

Ваш рабочий каталог может неправильно, и вы не можете изменить его из cd команды. Поскольку вы используете окна, я предлагаю вам использовать CreateProcess для выполнения pdftotext.exe, и вы можете указать CreateProcess в параметре lpCurrentDirectory, если вы хотите установить рабочий каталог.

+0

Спасибо, я пробовал, но не очень хорошо понимаю другие аргументы, особенно последние два, любой пример приветствуется. – wallek876

+0

@ wallek876 здесь [пример] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms682512 (v = vs.85) .aspx) – Freeznet

Смежные вопросы