C #: Problem çalıştıran kabuk komutları

6 Cevap

Benim kod üzerinden komutu çalıştırdığınızda, ancak hiçbir şey verir, bir sayfa çalıştırın ve sonra benim sunucuya sonuçlarını döndürmek için PHP çözümleyici almaya çalışıyorum. Ben aynı yolu ile el çalıştırırsanız, iyi çalışıyor, çünkü komut doğru olduğunu biliyorum. Buyrun bu benim kodu:

var p = new Process
{
      StartInfo = new ProcessStartInfo("C:\\xampp\\php\\php.exe", path)
      {
            RedirectStandardOutput = true,
            RedirectStandardError = true,
            UseShellExecute = false,
            CreateNoWindow = true
      }
};
var output = new StringWriter();
var error = new StringWriter();
p.OutputDataReceived += (sender, args) => output.WriteLine(args.Data);
p.ErrorDataReceived += (sender, args) => error.WriteLine(args.Data);
p.Start();
p.BeginOutputReadLine();
p.BeginErrorReadLine();
p.WaitForExit();
if (p.ExitCode != 0)
{
      throw new Exception(string.Format(
          "PHP failed with the following output:{0}{1}",
      /* {0} */ Environment.NewLine,
      /* {1} */ error.GetStringBuilder().ToString()));
}
var res = output.GetStringBuilder().ToString();
Console.WriteLine(res);

EDIT: With this current code, it throws the exception in the code with no output.

6 Cevap

Set WorkingDirectory Yolu

var p = new Process
            {
                StartInfo = new ProcessStartInfo("php", path)
                {
                    RedirectStandardOutput = true,
                    RedirectStandardError = true,
                    UseShellExecute = false,
                    CreateNoWindow = true,
                    WorkingDirectory = workingDir
                }
            };

Sorun programı bitmeden size çıktısını okuyarak olmasıdır. Sen çıkış işlemek için program çıkış için beklemek gerekir. Ayrıştırma tamamlanmadan önce aksi takdirde çıkış işleme olacak. Aşağıdaki satırı içeri ekle

p.Start();
p.WaitForExit();  // New line

EDIT OP hala sorunlar yaşıyorsanız söyledi.

Komutunun CMD kısmını kaldırmayı deneyin. Sadece doğrudan PHP komutunu çalıştırın. Ayrıca komutu çalışan çıkabilir hataları görebilirsiniz böylece hata ayıklama amacıyla bir pencere oluşturulmasını sağlamak için yararlı olabilir.

Işlemi çağırmak ve çıkışını veya hata yakalamak için en sağlam yol o aşağıdaki yolu denemek istiyorsunuz:

var p = new Process {
    StartInfo = new ProcessStartInfo("php", path) {
        RedirectStandardOutput = true,
        RedirectStandardError = true,
        UseShellExecute = false,
        CreateNoWindow = true
    }
};
var output = new StringWriter();
var error = new StringWriter();
p.OutputDataReceived += (sender, args) => output.WriteLine(args.Data);
p.ErrorDataReceived += (sender, args) => error.WriteLine(args.Data);
p.Start();
p.BeginOutputReadLine();
p.BeginErrorReadLine();
p.WaitForExit();
if (p.ExitCode != 0) {
    throw new Exception(string.Format(
        "PHP failed with the following output:{0}{1}",
        /* {0} */ Environment.NewLine,
        /* {1} */ error.GetStringBuilder().ToString()));
}
var res = output.GetStringBuilder().ToString();
Console.WriteLine(res);

Zaman içinde bu noktada gibi ReadToEnd() sadece akımının tüm içeriğini okur. Eğer Start(), dere olasılıkla boş hemen sonra bu aradığınız göz önüne alındığında. Sen birkaç seçenek var

  • Çağrı ReadLine() yerine, ama bu sadece bir satır okuyacak
  • p.WaitForExit() ardından ReadToEnd() diyoruz, ama bu açık akışı tutar emin değilim. Bunu yaparsa, o zaman bu en iyi seçenek olduğunu.

Sen) p.WaitForExit (eklemeniz gerekir; p.Start sonra (); Bunu okumaya çalıştığınızda başka çıkış hazır değil.

Eğer cmd yoluyla php çalışan bir sebebi var mı? Sadece doğrudan yürütmek değil miyiz?

Bu. NET aracılığıyla süreçlerinin yürütülmesi başka bir süreci yürütmek için kötü bir yol olduğunu benim bir deneyim oldu. unix altında fork () inanılmaz çok daha iyidir. Benim tavsiyem STRONGLY Process.BeginOutputReadLine() bakarak düşünün ve sizin okuma asenkron yol gitmek o kadar çok sorunları vardı. Yakalamak için uzun çıkışı varsa ReadToEnd ve ReadToLine özellikle süresiz asabilirsiniz.

Ben bir örnek yapıştırmak istiyorum ama oldukça uzundur.