Sunday 27 August 2017

Output Standar Readtoend Waitforexit


Klien WinSCP Free SFTP, SCP dan FTP untuk transfer file Windows SFTP dalam Techniques yang ditunjukkan oleh artikel ini diimplementasikan untuk Anda di majelis WinSCP. Menggunakan majelis adalah pendekatan yang disarankan untuk menerapkan teknik ini sendiri. Panduan ini menjelaskan cara menerapkan transfer SFTP dalam aplikasi menggunakan WinSCP. WinSCP adalah klien SFTP dengan antarmuka scripting yang dapat Anda gunakan untuk mengotomatisasi banyak operasi yang didukungnya, termasuk transfer file, sinkronisasi dan lainnya. Jadi WinSCP sendiri bukanlah sebuah perpustakaan (misalnya perakitan) yang bisa Anda hubungi langsung. Meskipun panduan ini menunjukkan kepada Anda bagaimana menggunakannya secara mulus dari kode. Sebelum Memulai Sebelum memulai Anda harus: Menggunakan WinSCP dari Kode Berjalan Proses WinSCP Untuk menjalankan winscp gunakan System. Diagnostics. Process. Kelas ini memungkinkan menjalankan executable apapun, mungkin mengarahkan input dan output standarnya ke aliran yang dapat diakses dari kode. Kode di bawah ini mengharapkan bahwa winscp (ProcessStartInfo. FileName) dapat ditemukan di direktori kerja saat ini atau di jalur pencarian. Anda perlu memberikan path lengkap jika tidak. Memakan perintah skrip menggunakan input standar Anda dapat menggunakan pengalihan standar (ProcessStartInfo. RedirectStandardInput) untuk memberi makan perintah skrip. Kebutuhan hemat untuk merakit file skrip temporer.1) Untuk memberi makan perintah ke input standar, gunakan stream Process. StandardInput: Menangkap keluaran dari proses WinSCP Meskipun Anda dapat mengarahkan keluaran standar proses WinSCP, sebenarnya tidak terlalu berguna, karena output dari WinSCP tidak Memiliki bentuk yang telah ditentukan sebelumnya (tidak bisa diurai). Meskipun bisa berguna untuk menangkapnya, jika Anda ingin menampilkannya ke pengguna di GUI atau untuk tujuan diagnostik. Jika Anda ingin mengumpulkan output, redirect output standar sebelum memulai WinSCP (ProcessStartInfo. RedirectStandardOutput) dan membaca dari output stream (Process. StandardOutput). Anda perlu terus mengumpulkan output saat skrip sedang berjalan. Aliran output memiliki kapasitas terbatas. Setelah itu terisi, WinSCP hang menunggu ruang bebas, tidak pernah selesai. Itu berarti Anda tidak bisa menggunakan Process. WaitForExit sendiri untuk menunggu skrip selesai. Alternatif yang mudah adalah StreamReader. ReadToEnd. Menggunakan file log Untuk menangkap hasil skrip, Anda dapat menggunakan XML logging. Untuk ini, Anda perlu menginstruksikan WinSCP untuk menyimpan file log menggunakan parameter baris perintah xmllog (ProcessStartInfo. Arguments). Perhatikan bahwa sebelum Anda dapat dengan aman memulai membaca dan mengurai file log XML menggunakan parser berbasis pohon (seperti XmlDocument atau XPathDocument), Anda harus menunggu WinSCP selesai. Lihat contoh di bawah ini. Jika Anda perlu membaca file log secara terus menerus, Anda perlu menggunakan stream-based parser (seperti XmlReader). Lihat contoh Contoh berikut menunjukkan bagaimana menggunakan parsing berbasis pohon menggunakan XPathDocument. Jika terjadi kesalahan, Anda dapat memeriksa elemen pesan untuk menangkap pesan kesalahan terkait: Jika berhasil, Anda dapat mis. Ekstrak daftar direktori yang dihasilkan oleh perintah ls di dalam elemen ls: Menunggu skrip menyelesaikan Proses. WaitForExit untuk menunggu proses WinSCP selesai. Jika Anda memiliki aliran output yang dialihkan, Anda harus terlebih dahulu membaca arus keluaran sampai akhir. Praktik yang baik adalah menutup input stream juga, jika Anda memilikinya diarahkan kembali. Memeriksa kode keluar Setelah skrip WinSCP selesai, periksa kode keluar (Process. ExitCode) dari prosesnya: Elina: terima kasih atas jawaban Anda. Ada beberapa catatan di bagian bawah dok MSDN ini (msdn. microsoften-uslibraryhellip) yang memperingatkan tentang potensi kebuntuan jika Anda membaca sampai akhir aliran stdout dan stderr yang diarahkan ulang secara bersamaan. Sulit untuk mengetahui apakah solusi Anda rentan terhadap masalah ini. Juga, nampaknya Anda mengirim output prosesststoutstderr kembali sebagai masukan. Mengapa. ) Ndash Matius Piatt 26 Sep 16 at 4:42 Ini adalah solusi berbasis Task Parallel Library (TPL) yang lebih modern, yang dapat diprediksi selama 4.5 dan yang lebih tinggi. Contoh Penggunaan Implementasi dijawab 5 Okt 16 at 10:54 Saya hal ini pendekatan yang sederhana dan lebih baik (kita tidak memerlukan AutoResetEvent): dijawab 14 Jun 12 at 14:29 Benar, tapi seharusnya tidak Anda lakukan. FileName Path quotggsci. exequot quot lt Obeycommand. txtquot untuk menyederhanakan kode Anda juga Atau mungkin sesuatu yang setara dengan perintah quotecho quot Pathmarkggsci. exequot jika Anda benar-benar tidak ingin menggunakan file obeycommand. txt yang terpisah. Ndash Amit Naidu 13 Jun 13 at 22:03 Solusi Anda tidak memerlukan AutoResetEvent tapi polling Anda. Bila Anda melakukan polling daripada menggunakan event (jika tersedia) maka Anda menggunakan CPU tanpa alasan dan itu menunjukkan bahwa Anda adalah programmer yang buruk. Solusi Anda sangat buruk bila dibandingkan dengan yang lain menggunakan AutoResetEvent. (Tapi saya tidak memberi Anda - karena Anda mencoba membantu). Ndash Eric Ouellet Nov 7 14 at 18:38 Saya memiliki masalah yang sama, tapi alasannya berbeda. Namun akan terjadi di bawah Windows 8, tapi tidak di bawah Windows 7. Baris berikut tampaknya telah menyebabkan masalah. Solusinya adalah TIDAK menonaktifkan UseShellExecute. Saya sekarang menerima jendela popup Shell, yang tidak diinginkan, tapi jauh lebih baik daripada program yang menunggu sesuatu yang tidak pasti terjadi. Jadi saya menambahkan pekerjaan berikut-sekitar untuk itu: Sekarang satu-satunya hal yang mengganggu saya adalah mengapa hal ini terjadi di bawah Windows 8 di tempat pertama. Menjawab 13 Jan 15 at 10:35 Saya mencoba membuat sebuah kelas yang bisa memecahkan masalah Anda dengan menggunakan aliran asynchronous, dengan mencatat jawaban Mark Byers, Rob, stevejay. Dengan melakukan itu, saya menyadari bahwa ada bug yang berhubungan dengan arus keluaran proses asinkron yang dibaca. Anda tidak dapat melakukannya: Anda akan menerima System. InvalidOperationException. StandardOut belum dialihkan atau prosesnya belum dimulai. Kemudian Anda harus memulai output asinkron yang dibaca setelah proses dimulai: Melakukannya, membuat kondisi balapan karena arus keluaran dapat menerima data sebelum Anda menyetelnya ke asinkron: Kemudian beberapa orang dapat mengatakan bahwa Anda hanya perlu membaca arus sebelum Anda Atur ke asinkron. Tapi masalah yang sama terjadi. Akan ada kondisi balapan antara membaca sinkron dan mengatur aliran ke mode asinkron. Tidak ada cara untuk mencapai pembacaan asynchronous yang aman dari arus keluaran suatu proses dengan cara yang sebenarnya Proses dan ProsesStartInfo telah dirancang. Sebaiknya Anda menggunakan asynchronous read seperti yang disarankan oleh pengguna lain untuk kasus Anda. Tapi Anda harus sadar bahwa Anda bisa kehilangan beberapa informasi karena kondisi balapan.

No comments:

Post a Comment