StandardInputEncoding для ProcessStartInfo? - PullRequest
9 голосов
/ 08 июня 2011


Когда я добавляю службу в Windows вручную, набираю в CMD что-то вроде этого:

"C: \ Program Files (x86) \ Windows Resource Kits \ Tools \ instsrv.exe" "some-pl-char-ąźńćńół" "C: \ Program Files (x86) \ Windows Resource Kits \ Tools \ srvany.exe "

... все хорошо с именем службы, но когда я пытаюсь сделать это в c #:

ProcessStartInfo startInfo = new ProcessStartInfo();
Process myprocess = new Process();

startInfo.FileName = "cmd"; 
startInfo.RedirectStandardInput = true;
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;

myprocess.StartInfo = startInfo; 
myprocess.Start();

StreamWriter sw = myprocess.StandardInput;
StreamReader sr = myprocess.StandardOutput;

Thread.Sleep(200);

string command = ...
       ^ "C:\Program Files (x86)\Windows Resource Kits\Tools\instsrv.exe" "some-pl-char-ąźńćńół" "C:\Program Files (x86)\Windows Resource Kits\Tools\srvany.exe"

sw.WriteLine(command);
sw.WriteLine("exit");

Thread.Sleep(200);

sw.Close();
sr.Close();

тогда название создаваемого сервиса: some-pl-char-¦č˝Š˝ˇ-

Почему существует проблема с кодовой страницей?
Есть что-то вроде StandardInputEncoding для ProcessStartInfo?
Моя активная кодовая страница в CMD (с использованием chcp) - 852. (Польский)

Ответы [ 2 ]

9 голосов
/ 08 июня 2011

Аргументы принадлежат свойству Arguments, и обратный слеш должен быть исключен другим. \ -> \\

Обновлен:

using (var process = new Process())
{
    var encoding = Encoding.GetEncoding(852);

    var psi = new ProcessStartInfo();
    psi.FileName = "cmd";
    psi.RedirectStandardInput = true;
    psi.RedirectStandardOutput = true;
    psi.UseShellExecute = false;
    psi.StandardOutputEncoding = encoding;

    process.StartInfo = psi;

    process.Start();

    using (var sr = process.StandardOutput)
    using (var sw = new StreamWriter(process.StandardInput.BaseStream, encoding))
    {
        var command = "....";
        sw.WriteLine(command);
        // etc..                   
    }
}
0 голосов
/ 08 июня 2011

У меня была очень похожая проблема.Хотя я работал с VB.net, это исправило мою проблему.Я не мог выполнить команду, если она не была установлена.

startInfo.FileName = "cmd.exe /c";  

вместо

startInfo.FileName = "cmd";  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...