Windowsコンソール:
- ツールAはバイナリデータをファイルに書き込むことができますが、stdoutを使用するように指示するオプションはありません。
- ツールBは、stdinからバイナリデータを読み取り、その中の情報を処理できます。
中間ファイルを使用せずにAからBにパイプされた出力を取得するにはどうすればよいですか?
言い換えると、Windowsの同等のものは何/dev/stdout
ですか?
-ジェロエン
Windowsコンソール:
中間ファイルを使用せずにAからBにパイプされた出力を取得するにはどうすればよいですか?
言い換えると、Windowsの同等のものは何/dev/stdout
ですか?
-ジェロエン
回答:
Windowsには、/ dev / stdout、CONの類似物があります。
マイクロソフトの進行中の「レガシー互換性」プログラムを考慮すると、まだ機能していると思います。
ああ..それを見つけました。 Microsoftサポートは予約名のリストを提供します。これらの名前をファイルに付けることはできません。また、入力または出力として使用する場合、特別な意味があります。
CONを出力デバイスとして使用して、stdoutに送信できる場合があります。
リスト:
Name Function
---- --------
CON Keyboard and display
PRN System list device, usually a parallel port
AUX Auxiliary device, usually a serial port
CLOCK$ System real-time clock
NUL Bit-bucket device
A:-Z: Drive letters
COM1 First serial communications port
LPT1 First parallel printer port
LPT2 Second parallel printer port
LPT3 Third parallel printer port
COM2 Second serial communications port
COM3 Third serial communications port
COM4 Fourth serial communications port
Unity.exe -batchmode -quit -projectPath "%cd%" -logFile CON -buildWindows64Player ".\GameBuild\Generic.exe"
です。コマンドはログファイルがなくても正常に機能しますが、ビルド出力は得られません。
program > file.txt
)、パイプで使用されることもありません(のようにデータを別のプログラムのstdinに渡すためprogram | another_program
)。CONに書き込まれた出力は常に表示されます。正しい答えは、「Windowsが相当ありませんの/ dev / STDOUT」
Windowsに直接相当するものはありません/dev/stdout
。
これは、名前付きパイプを作成するC#プログラムを作成する私の試みです。これは、プログラムAにファイル名として与えることができます。.NET v4が必要です。
(C#はコンパイラに.NETランタイムが付属しているため、最近はどのコンピューターに.NETがないのですか?)
PipeServer.cs
using System;
using System.IO;
using System.IO.Pipes;
class PipeServer {
static int Main(string[] args) {
string usage = "Usage: PipeServer <name> <in | out>";
if (args.Length != 2) {
Console.WriteLine(usage);
return 1;
}
string name = args[0];
if (String.Compare(args[1], "in") == 0) {
Pipe(name, PipeDirection.In);
}
else if (String.Compare(args[1], "out") == 0) {
Pipe(name, PipeDirection.Out);
}
else {
Console.WriteLine(usage);
return 1;
}
return 0;
}
static void Pipe(string name, PipeDirection dir) {
NamedPipeServerStream pipe = new NamedPipeServerStream(name, dir, 1);
pipe.WaitForConnection();
try {
switch (dir) {
case PipeDirection.In:
pipe.CopyTo(Console.OpenStandardOutput());
break;
case PipeDirection.Out:
Console.OpenStandardInput().CopyTo(pipe);
break;
default:
Console.WriteLine("unsupported direction {0}", dir);
return;
}
} catch (IOException e) {
Console.WriteLine("error: {0}", e.Message);
}
}
}
コンパイル:
csc PipeServer.cs /r:System.Core.dll
csc
で見つけることができます %SystemRoot%\Microsoft.NET\Framework64\<version>\csc.exe
たとえば、32ビットWindows XPで.NETクライアントプロファイルv4.0.30319を使用する場合:
"C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\csc.exe" PipeServer.cs /r:System.Core.dll
実行:
PipeServer foo in | programtwo
ウィンドウ1、および:
programone \\.\pipe\foo
ウィンドウ2で。
programone
伝えるためにpipe
それがで行われていること、\\.\pipe\foo
programone
データの出力が完了すると、使用していた出力ファイルが単純に閉じられます。(クライアント側からは、パイプは通常のファイルと同じように機能します。)そうすると、pipe.exe
より正確には、pipe.CopyTo(...)
EOFに到達して単純に終了します。
out
)方向(stdinをパイプにコピー)で使用すると、最初の1 kB後に「パイプが壊れています」エラーで死にます。in
ただし、パイプをstdout()にコピーする場合は発生しないため、プログラムに影響はありません。(彼らが言うように、パッチは歓迎します。)
grawityの回答に基づいて、複数のターミナルウィンドウを使用せずにプロセスを直接開始できる拡張バージョンを作成しました。
一般的な使用法:
PipeServer [in|out] [process name] [argument 1] [argument 2] [...]
文字列「{pipe}」はリダイレクトパスに置き換えられます。
実世界の例:
PipeServer.exe in "C:\Keil\UV4\Uv4.exe" -b "C:\Project\Project.uvproj" -j0 -o "{pipe}"
このコマンドラインを、たとえばEclipseに直接挿入して、特定の外部ビルダーのビルドログをStdOutにリダイレクトできます。
これはおそらく最高です...
Unity.exe -batchmode -projectPath C:\***\Application -logFile -buildWebPlayer web -quit
。引数(ファイル名)なし-logFile
-出力をコンソールに出力する必要がありますが、出力しません。CONを追加した後(つまり--logFile CON
)-: - )