Bagaimana cara menjalankan program baris perintah dari C # dan mendapatkan kembali hasil STD OUT? Secara khusus, saya ingin menjalankan DIFF pada dua file yang dipilih secara terprogram dan menulis hasilnya ke kotak teks.
c#
command-line
Sayap
sumber
sumber
Jawaban:
Kode berasal dari MSDN .
sumber
{YourProcessObject}.StartInfo.Arguments
string.p.StandardError
aliran. Ketika aliran menjadi penuh, tampaknya proses akan berhenti sampai data dikonsumsi, jadi saya harus membaca keduanyaStandardError
danStandardOutput
untuk memastikan bahwa tugas dijalankan dengan benar.Berikut ini contoh cepat:
sumber
Ada satu parameter lain yang saya temukan berguna, yang saya gunakan untuk menghilangkan jendela proses
ini membantu untuk menyembunyikan jendela konsol hitam dari pengguna sepenuhnya, jika itu yang Anda inginkan.
sumber
sumber
process.StartInfo.RedirectStandardError = true;
danif (process.ExitCode == 0)
jawaban yang diterima tidak ada.Jawaban yang diterima di halaman ini memiliki kelemahan yang merepotkan dalam situasi yang jarang terjadi. Ada dua file menangani program yang menulis dengan konvensi, stdout, dan stderr. Jika Anda baru saja membaca satu pegangan file seperti jawaban dari Ray, dan program yang Anda mulai tulis output yang cukup untuk stderr, itu akan mengisi buffer dan blok stderr output. Kemudian kedua proses Anda menemui jalan buntu. Ukuran buffer mungkin 4K. Ini sangat jarang terjadi pada program yang berumur pendek, tetapi jika Anda memiliki program yang berjalan lama yang berulang kali menghasilkan stderr, pada akhirnya akan terjadi. Ini sulit untuk di-debug dan dilacak.
Ada beberapa cara yang baik untuk mengatasi ini.
Salah satu caranya adalah dengan mengeksekusi cmd.exe daripada program Anda dan menggunakan argumen / c untuk cmd.exe untuk memanggil program Anda bersama dengan argumen "2> & 1" ke cmd.exe untuk memerintahkannya menggabungkan stdout dan stderr.
Cara lain adalah dengan menggunakan model pemrograman yang membaca kedua pegangan pada saat yang sama.
sumber
sumber
Anda akan perlu menggunakan
ProcessStartInfo
denganRedirectStandardOutput
diaktifkan - maka Anda dapat membaca aliran output. Anda mungkin merasa lebih mudah menggunakan ">" untuk mengarahkan ulang output ke file (melalui OS), dan kemudian cukup membaca file.[edit: seperti yang dilakukan Ray: +1]
sumber
RedirectStandardOutput
sebenarnya.Jika Anda tidak keberatan memperkenalkan dependensi, CliWrap dapat menyederhanakan ini untuk Anda:
sumber
Ini mungkin bukan cara terbaik / termudah, tetapi mungkin opsi:
Ketika Anda mengeksekusi dari kode Anda, tambahkan "> output.txt" dan kemudian baca di file output.txt.
sumber
Anda dapat meluncurkan program baris perintah apa pun menggunakan kelas Proses, dan mengatur properti StandardOutput dari instance Proses dengan pembaca aliran yang Anda buat (baik berdasarkan string atau lokasi memori). Setelah proses selesai, Anda dapat melakukan apa pun yang perlu dilakukan pada aliran itu.
sumber
Ini mungkin berguna bagi seseorang jika Anda mencoba untuk menanyakan cache ARP lokal pada PC / Server.
sumber
Perintah jalankan satu-liner:
Baca output dari perintah dalam jumlah terpendek dari kode yang dapat digunakan kembali:
sumber
Ada Kelas ProcessHelper di kode sumber terbuka PublicDomain yang mungkin menarik bagi Anda.
sumber
Jika Anda juga perlu menjalankan beberapa perintah di cmd.exe, Anda dapat melakukan hal berikut:
Ini hanya mengembalikan output dari perintah itu sendiri:
Anda juga dapat menggunakan
StandardInput
alih-alihStartInfo.Arguments
:Hasilnya terlihat seperti ini:
sumber
Hanya untuk bersenang-senang, inilah solusi lengkap saya untuk mendapatkan output PYTHON - di bawah klik tombol - dengan pelaporan kesalahan. Cukup tambahkan tombol yang disebut "butPython" dan label yang disebut "llHello" ...
sumber
Karena sebagian besar jawaban di sini tidak menerapkan
using
statemant untukIDisposable
dan beberapa hal lain yang saya pikir bisa jadi perlu saya akan menambahkan jawaban ini.Untuk C # 8.0
sumber