2012-04-23 10 views
1

私はLinux用のコマンドでスターキャラクターに少し問題があります。ディストリビューションを探す必要があります。私はこのキャラクターの代わりに'fedora'なら、このコマンドは良い結果を出します。この場合は、次のように記述します。/ bin/cat:/ etc/* - release:ディレクトリまたはファイルが存在しません。Process.StartInfoに '*'文字が含まれている - Linuxのディストリビューションを見つける

私のコードは次のとおりです。あなたの答えを事前に

Process p = new Process(); 
    p.StartInfo.UseShellExecute = false; 
    p.StartInfo.RedirectStandardOutput = true; 
    p.StartInfo.FileName = "cat"; 
    p.StartInfo.Arguments = "/etc/*-release"; 
    p.Start(); 
    string output = p.StandardOutput.ReadToEnd(); 
    p.WaitForExit(); 

感謝。 マテイ

答えて

2

あなたのシェルからcat /etc/*-releaseを実行すると、もしあれば、シェルは、一致するファイルのリストに*を拡大する責任があります。

自分でプログラムを直接実行する場合(ここではProcessインターフェイスで行っているように)、シェルの動作を自分で再作成する必要があります。フル機能のプログラミング言語からファイルを読み取るためにcatを実行するために、少し愚かであるように、これは、最善のために実際にある - 確かに言語は、論理的同等のための簡単なものを提供しています。

list = glob(/etc/*-release) 
foreach file in (list): 
    fd = open(file, "read"); 
    contents = read(fd) 
    close(fd) 
    dosomething_with(contents) 

することができますそこにある​​3210ビットを置き換えたいどのようなメカニズムを使用してください。 a fellow stacker has provided his own glob() mechanism in another answer

+0

ありがとうございます。どのように私はこのようなコマンドを実行することができますいくつかのアイデアを持っている: 'iptables -L | grep Protect_blacklist | wc -l'?私は 'p.StartInfo.FileName =" iptables "を試した。 p.StartInfo.Arguments = "-L | grep Protect_blacklist | wc -l"; 'しかし、成功しません。前もって感謝します。 – matej148

+0

これらの '|'はコマンドの引数ではありません。それらはシェルメタキャラクターです。あなたのコマンドで 'sh -c" iptables -L | grep Protect_blacklist | wc -l "'を使うことができるかもしれませんが、 'iptables -L'だけを実行してからフィルタリングと行あなたのプログラミング言語に内部的に数えられます。 (どちらの方法でも問題ありません) – sarnold

関連する問題