Я хочу использовать класс Process для выполнения метода command.exe, чтобы вернуть количество файлов в родительском каталоге.

Он должен использовать команду .exe (по разным причинам).

Это мой код:

    private static Int64 GetFileCount(string path)
    {
        Int64 ct = 0;
        Process process = new Process();
        process.StartInfo = new System.Diagnostics.ProcessStartInfo("cmd.exe");
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.RedirectStandardError = true;
        process.StartInfo.CreateNoWindow = true;
        process.StartInfo.Arguments = "dir \"" + path + "\" /s/a-d | find /c \".dat\"";
        process.StartInfo.WorkingDirectory = path;
        process.Start();
        string output = process.StandardOutput.ReadToEnd();
        if (output != "")
        {
            ct = Convert.ToInt64(output);
        }
        process.WaitForExit();
        return ct;
    }

переменная пути:

d:\Cloud\Catalogues\0\2015

Я скопировал это и выполнил в командной строке DOS, и он работает хорошо, поэтому я знаю, что работает DOS.

Это то, что я скопировал и запустил в командной строке DOS:

dir "d:\Cloud\Catalogues\0\2015" /s/a-d | find /c ".dat"

Я использовал другие команды DOS в своем приложении C #, и все это работает хорошо.

Результатом всегда является пустая строка {""}.

Именно с этой функцией 'find' у меня возникла проблема.

Я знаю, что могу использовать файл bat, но для простоты я предпочел бы использовать вышеупомянутое.

Я что-то пропустил?

1 ответ1

1

Редактировать: похоже, что проблема в том, что вы используете неправильные аргументы. добавьте '/k' или '/c', когда вы хотите выполнить команды, которые вы поместили в строку аргументов.

Старый, все еще может иметь значение: если у вас есть веские причины не использовать Систему.Пространство имен ввода-вывода, чтобы получить информацию, которую вы хотите, не хакерским способом, я думаю, это тот факт, что вы пытаетесь запустить без ShellExecute, что означает, что вы должны предоставить полный путь к исполняемому файлу, который вы пытаетесь выполнить ( в этом случае cmd.exe), поскольку команда не выполняется в оболочке и поэтому не имеет доступных переменных среды, необходимых для расширения расположения cmd.exe.

Тем не менее, я не проверял это, я на Linux и в целом развиваться в Mono. SuperUser не позволил бы мне добавить свои два цента без полного ответа, потому что у меня недостаточно репутации, но я все еще чувствовал, что должен добавить свои два цента.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .