Windowsファイルパラメータをstdoutにリダイレクトする方法 (Windowsでの `/ dev / stdout`と同等)


12

Windowsコンソール:

  • ツールAはバイナリデータをファイルに書き込むことができますが、stdoutを使用するように指示するオプションはありません。
  • ツールBは、stdinからバイナリデータを読み取り、その中の情報を処理できます。

中間ファイルを使用せずにAからBにパイプされた出力を取得するにはどうすればよいですか?

言い換えると、Windowsの同等のものは何/dev/stdoutですか?

-ジェロエン

回答:


18

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

1
おかげで、本当に機能します(Win 8.1でも)。Unityでビルドをバッチモードで実行しますUnity.exe -batchmode -projectPath C:\***\Application -logFile -buildWebPlayer web -quit。引数(ファイル名)なし-logFile-出力をコンソールに出力する必要がありますが、出力しません。CONを追加した後(つまり- -logFile CON)-: - )
setevoy

@setevoyこれはWindows上のUnityで実際に動作しますか?詳細を教えてください。を使用して、Windows 7および10でUnityがクラッシュするだけUnity.exe -batchmode -quit -projectPath "%cd%" -logFile CON -buildWindows64Player ".\GameBuild\Generic.exe"です。コマンドはログファイルがなくても正常に機能しますが、ビルド出力は得られません。
-bbodenmiller

@bbodenmiller申し訳ありませんが、これ以上情報を提供することはできません-このプロジェクトはほぼ2年前に終了しました:
setevoy

1
@bbodenmillerログファイルを標準出力に出力することは、現時点では壊れているようです。参照:issuetracker.unity3d.com/issues/...
Verox

2
答えは間違っています。CONデバイスが表示されます。CONへの書き込みはリダイレクトされることも(のようにprogram > file.txt)、パイプで使用されることもありません(のようにデータを別のプログラムのstdinに渡すためprogram | another_program)。CONに書き込まれた出力は常に表示されます。正しい答えは、「Windowsが相当ありませんの/ dev / STDOUT」
Egor Skriptunoff

5

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で。


+1今ではそれはクールなソリューションです!すぐに試して、お知らせします。今、最初のいくつかのZzzzzzz :-)
Jeroen Wiert Pluimers

Zzzzを実行する前にもう1つ考えました:パイプを閉じることはどうですか?最適なシグナリングメカニズムが何であるかを考えますprogramone伝えるためにpipeそれがで行われていること、\\.\pipe\foo
イェルーンWiert Pluimers

@Jeroen:programoneデータの出力が完了すると、使用していた出力ファイルが単純に閉じられます。(クライアント側からは、パイプは通常のファイルと同じように機能します。)そうすると、pipe.exeより正確には、pipe.CopyTo(...)EOFに到達して単純に終了します。
user1686

@Jeroen:また、私が理解していないことが1つあります。ツールを反対(out)方向(stdinをパイプにコピー)で使用すると、最初の1 kB後に「パイプが壊れています」エラーで死にます。inただし、パイプをstdout()にコピーする場合は発生しないため、プログラムに影響はありません。(彼らが言うように、パッチは歓迎します。
user1686

おかげで、この後の来週、プロジェクト内の何かが(あなたはそれが<G>突き出愛していない)高いPRIOを思い付いしようとします
イェルーンWiert Pluimers

4

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にリダイレクトできます。

これはおそらく最高です...

リンク

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.