Saya mencoba menjalankan file batch dalam C #, tapi saya tidak beruntung melakukannya.
Saya telah menemukan banyak contoh di Internet yang melakukannya, tetapi tidak berhasil untuk saya.
public void ExecuteCommand(string command)
{
int ExitCode;
ProcessStartInfo ProcessInfo;
Process Process;
ProcessInfo = new ProcessStartInfo("cmd.exe", "/c " + command);
ProcessInfo.CreateNoWindow = true;
ProcessInfo.UseShellExecute = false;
Process = Process.Start(ProcessInfo);
Process.WaitForExit();
ExitCode = Process.ExitCode;
Process.Close();
MessageBox.Show("ExitCode: " + ExitCode.ToString(), "ExecuteCommand");
}
String perintah berisi nama file batch (disimpan dalam system32
) dan beberapa file yang harus dimanipulasi. (Contoh:) txtmanipulator file1.txt file2.txt file3.txt
. Ketika saya menjalankan file batch secara manual, itu berfungsi dengan benar.
Ketika mengeksekusi kode, itu memberi saya sebuah **ExitCode: 1** (Catch all for general errors)
Apa yang saya lakukan salah?
c#
batch-file
process
processstartinfo
Wessel T.
sumber
sumber
command
itu. Jika itu berisi jalur dengan spasi, Anda harus memberi tanda kutip di sekitarnya.Jawaban:
Ini seharusnya bekerja. Anda bisa mencoba membuang konten dari output dan stream kesalahan untuk mengetahui apa yang terjadi:
* EDIT *
Dengan informasi tambahan dalam komentar Anda di bawah, saya dapat membuat ulang masalahnya. Tampaknya ada beberapa pengaturan keamanan yang menghasilkan perilaku ini (belum menyelidiki secara rinci).
Ini tidak bekerja jika file batch tidak terletak di
C:\Windows\System32
. Coba pindahkan ke lokasi lain, mis. Lokasi Anda yang bisa dieksekusi. Perhatikan bahwa menyimpan file batch kustom atau file yang dapat dieksekusi di direktori Windows adalah praktik yang buruk.* EDIT 2 * Ini Ternyata bahwa jika aliran dibaca serentak, kebuntuan dapat terjadi, baik dengan membaca serentak sebelum
WaitForExit
atau dengan membaca baikstderr
danstdout
sinkron satu demi satu.Ini seharusnya tidak terjadi jika menggunakan metode baca asinkron sebagai gantinya, seperti dalam contoh berikut:
sumber
baris sederhana ini akan mengeksekusi file batch.
sumber
Setelah bantuan besar dari steinar inilah yang bekerja untuk saya:
sumber
~%dp0
. MenambahkanProcessInfo.WorkingDirectory
memperbaikinya.command
jika Anda memanggil file BAT secara langsung?command
parameter mungkin digunakan untuk mengirim argumen ke file BAT, bukan itu yang ditunjukkan oleh kode di sini. Sebenarnya tidak digunakan sama sekali. Dan jika ya, mungkin harus dinamaiarguments
.command
digunakan dalamnew ProcessStartInfo
panggilan.Ini bekerja dengan baik. Saya mengujinya seperti ini:
Saya berkomentar mematikan jendela sehingga saya bisa MELIHAT menjalankannya.
sumber
Berikut adalah contoh kode c # yang mengirimkan 2 parameter ke file bat / cmd untuk menjawab pertanyaan ini .
Komentar: bagaimana saya bisa melewati parameter dan membaca hasil dari eksekusi perintah?
/ dari @Janatbek Sharsheyev
sumber
Kode di bawah ini berfungsi dengan baik untuk saya
sumber
sumber
Sudahkah Anda mencoba memulainya sebagai administrator? Mulai Visual Studio sebagai administrator jika Anda menggunakannya, karena bekerja dengan
.bat
file memerlukan hak istimewa itu.sumber
Saya menginginkan sesuatu yang lebih langsung dapat digunakan tanpa nilai string hard-kode khusus organisasi di dalamnya. Saya menawarkan yang berikut sebagai potongan kode yang dapat digunakan kembali secara langsung. Kelemahan minor perlu ditentukan dan dilewati folder yang berfungsi saat melakukan panggilan.
Disebut seperti ini:
Dalam contoh ini, dari dalam Visual Studio 2017, sebagai bagian dari uji coba, saya ingin menjalankan file kumpulan ulang lingkungan sebelum menjalankan beberapa tes. (SpecFlow + xUnit). Saya bosan dengan langkah-langkah tambahan untuk secara manual menjalankan file bat secara terpisah, dan ingin menjalankan file bat sebagai bagian dari kode pengaturan tes C #. File kumpulan ulang lingkungan memindahkan file kasus uji kembali ke folder input, membersihkan folder output, dll. Untuk mendapatkan status awal pengujian yang tepat untuk pengujian. Metode QuotesAround hanya menempatkan tanda kutip di sekitar baris perintah jika ada spasi dalam nama folder ("Program Files", ada orang?). Semua yang ada di dalamnya adalah ini: private string QuotesAround (input string) {return "\" "+ input +" \ "";}
Semoga beberapa menemukan ini berguna dan menghemat beberapa menit jika skenario Anda mirip dengan skenario saya.
sumber
Dengan solusi yang diusulkan sebelumnya, saya telah berjuang untuk mendapatkan beberapa perintah npm dieksekusi dalam satu lingkaran dan mendapatkan semua output di jendela konsol.
Akhirnya mulai bekerja setelah saya menggabungkan semuanya dari komentar sebelumnya, tetapi mengatur ulang alur eksekusi kode.
Apa yang saya perhatikan adalah bahwa acara berlangganan sudah terlambat (setelah proses sudah dimulai) dan oleh karena itu beberapa output tidak ditangkap.
Kode di bawah ini sekarang melakukan yang berikut:
Kode telah diuji terhadap deadlock, meskipun sinkron (satu proses eksekusi pada saat itu) jadi saya tidak dapat menjamin apa yang akan terjadi jika ini dijalankan secara paralel.
sumber
Menggunakan CliWrap :
sumber
System.Diagnostics.Process.Start(BatchFileName, Parameters);
Saya tahu ini akan berfungsi untuk file batch dan parameter, tetapi tidak ada ide cara mendapatkan hasil dalam C #. Biasanya, output didefinisikan dalam file batch.
sumber