Apakah ada cara untuk mengarahkan output standar dari suatu proses di konsol Win32 ke pipa bernama ? Named pipes dibangun untuk Windows dan meskipun mereka akan menjadi konsep yang berguna, saya belum pernah melihatnya menggunakan baris perintah.
Yaitu. seperti example.exe >\\.\mypipe
. (Sintaks ini mungkin tidak benar tetapi Anda mendapatkan intinya.) Saya ingin dapat mengarahkan stdout dan stderr ke pipa yang berbeda secara bersamaan.
Saya ingin menghindari menggunakan file fisik sebagai pengganti, untuk menghindari berurusan dengan kelambatan IO, buffer IO, kunci file, hak akses, ruang hard disk yang tersedia, keputusan untuk menimpa, kegigihan yang tidak berarti, dll.
Alasan lain adalah karena seperangkat alat Windows tradisional tidak dirancang di sekitar filosofi berbasis file (teks) sebanyak di Unix . Selain itu, pipa bernama tidak dapat dengan mudah dipasang di Windows, jika sama sekali.
Akhirnya, ada rasa ingin tahu jika konsep yang baik dapat dimanfaatkan dengan baik.
sumber
Jawaban:
Saya tidak yakin mengapa Anda tidak ingin mengalihkan ke file. Ada dua metode yang akan saya berikan di sini. Salah satu metode adalah untuk mengarahkan ulang dan membaca dari file, yang lain adalah serangkaian program.
Bernama pipa
Apa yang saya lakukan adalah menulis dua program untuk .NET 4. Satu mengirimkan output ke pipa bernama, yang lain membaca dari pipa ini dan menampilkan ke konsol. Penggunaannya cukup sederhana:
Di jendela konsol lain:
Sayangnya, ini hanya dapat mengarahkan ulang
stdout
(ataustdin
, atau dikombinasikan), bukanstderr
dengan sendirinya, karena keterbatasan dalam operator pipa (|
) di Prompt Perintah Windows. Jika Anda mengetahui cara mengirimstderr
melalui operator pipa itu, itu akan berhasil. Atau, server dapat dimodifikasi untuk meluncurkan program Anda dan secara khusus mengarahkan ulangstderr
. Jika itu perlu, beri tahu saya dalam komentar (atau lakukan sendiri); tidak terlalu sulit jika Anda memiliki pengetahuan pustaka C # dan .NET "Process".Anda dapat mengunduh server dan klien .
Jika Anda menutup server setelah koneksi, klien akan segera menutup. Jika Anda menutup klien setelah koneksi, server akan menutup segera setelah Anda mencoba mengirim sesuatu melaluinya. Tidak mungkin untuk menyambungkan kembali pipa yang rusak, terutama karena saya tidak dapat diganggu melakukan sesuatu yang begitu rumit sekarang. Ini juga terbatas pada satu klien per server .
Kode sumber
Ini ditulis dalam C #. Tidak banyak gunanya mencoba menjelaskannya. Mereka menggunakan .NET NamedPipeServerStream dan NamedPipeClientStream .
Server:
Klien:
Mengarahkan kembali ke file
stderr
output yang dapat dieksekusi dan arahkan ke file ituIni memberikan efek yang diinginkan dari satu jendela konsol untuk menonton
stdout
(dan menyediakanstdin
), dan lainnya untuk menontonstderr
.Apa pun yang meniru
tail
akan berhasil. Metode PowerShell bekerja secara asli di Windows, tetapi mungkin agak lambat (yaitu ada beberapa latensi antara penulisan ke file dan tampilan ke layar). Lihat pertanyaan StackOverflow ini untuktail
alternatif lain .Satu-satunya masalah adalah file sementara dapat tumbuh cukup besar. Solusi yang mungkin adalah menjalankan loop yang hanya mencetak jika file memiliki konten dan menghapus file segera setelahnya, tetapi itu akan menyebabkan kondisi balapan.
sumber
Saya terkejut bahwa ini belum dijawab dengan benar. Memang ada jalur UNC yang ditetapkan untuk pipa bernama oleh sistem, dapat diakses pada mesin apa pun dalam jaringan, yang dapat digunakan seperti file normal:
Dengan asumsi pipa bernama "StdOutPipe" dan "StdErrPipe" ada di mesin ini, ini mencoba menghubungkan dan menulis ke mereka. Bagian
pipe
inilah yang menentukan bahwa Anda menginginkan pipa bernama.sumber
Tidak dengan shell standar (CMD.EXE). Untuk programmer, ini cukup mudah . Hanya ambil dua pipa dari proses yang Anda mulai.
sumber
Preferensi Anda untuk pipa data Windows dari server ke jendela dos klien baik segera atau lambat mungkin puas dengan drive RAM kecil. Memori yang sama dialokasikan untuk data, ditulis / dibaca dengan nama seperti sistem file. Klien menghapus file yang sudah habis dan menunggu yang lain, atau membiarkannya menghilang ketika komputer dimatikan.
sumber