web-dev-qa-db-ja.com

MacのMonoでProcess.Start()または同等のものを使用して引数を渡す方法

Process.Start(app,args);を使用してブラウザを起動するためのc#コードを記述しようとしています。ここで、appsはブラウザへのパスです。 /Applications/Google Chrome.app/Contents/MacOS/Google Chromeおよび引数は--no-default-browser-check

もしそうなら、これはWindowsとLinuxで動作します

Process.Start("/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","--no-first-run");

私は得る

open: unrecognized option `--no-first-run'
Usage: open [-e] [-t] [-f] [-W] [-n] [-g] [-h] [-b <bundle identifier>] [-a <application>] [filenames]
Help: Open opens files from a Shell.
      By default, opens each file using the default application for that file.  
      If the file is in the form of a URL, the file will be opened as a URL.
Options: 
      -a                Opens with the specified application.
      -b                Opens with the specified application bundle identifier.
      -e                Opens with TextEdit.
      -t                Opens with default text editor.
      -f                Reads input from standard input and opens with TextEdit.
      -W, --wait-apps   Blocks until the used applications are closed (even if they were already running).
      -n, --new         Open a new instance of the application even if one is already running.
      -g, --background  Does not bring the application to the foreground.
      -h, --header      Searches header file locations for headers matching the given filenames, and opens them.

私も試しました Monobjc でコードを実行してみました

// spin up the objective-c runtime
ObjectiveCRuntime.LoadFramework("Cocoa");
ObjectiveCRuntime.Initialize();
NSAutoreleasePool pool = new NSAutoreleasePool();

// Create our process
NSTask task = new NSTask();
NSPipe standardOut = new NSPipe();
task.StandardOutput = standardOut;
task.LaunchPath = @"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome";

// add some arguments
NSString argumentString = new NSString("--no-first-run");
NSArray arguments = NSArray.ArrayWithObject(argumentString);
task.Arguments = arguments;

// We should have liftoff
task.Launch();


// Parse the output and display it to the console
NSData output = standardOut.FileHandleForReading.ReadDataToEndOfFile;
NSString outString = new NSString(output,NSStringEncoding.NSUTF8StringEncoding);
Console.WriteLine(outString);

// Dipose our objects, gotta love reference counting
pool.Release();

しかし、NUnitを使用してコードを実行すると、NUnitが爆発します。

これはバグだと思いますが、証明することはできません。私はすべての助けに感謝します!

24
AutomatedTester

Process.Startでファイルを開くためにOSのメカニズムを使用する代わりに、execを直接使用するには、UseShellExecuteをfalseに設定する必要があります。これはLinuxとWindowsにも当てはまります。

Process.Start(new ProcessStartInfo (
    "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
    "--no-first-run")
    { UseShellExecute = false });

ユースケースに「open」を使用して、Chromeアプリバンドルを適切に実行することもできます。「-a」引数を使用して、特定のアプリを強制的に実行することもできます。 n '引数は新しいインスタンスを開き、'-args 'は引数を渡します。

Process.Start(new ProcessStartInfo (
    "open",
    "-a '/Applications/Google Chrome.app' -n --args --no-first-run")
    { UseShellExecute = false });
22

Processopen コマンドラインユーティリティを使用して起動するようです。

実行可能ファイルを直接呼び出すことは避けてください。アプリケーションがすでに実行されている場合、これは、すでに実行されているインスタンスをアクティブ化する代わりに、その2番目のインスタンスを起動します。それはおそらくあなたが望むものではなく、とにかくすべてのアプリケーションがこれを処理できるわけではありません。

Openの場合、起動する構文はChrome

open -a Chrome

MacOS XでProcessクラスがどのように機能するかはわかりませんが、パラメータは類似しているはずです。

Webページを開くだけの場合は、実行可能ファイルを指定しないでください。代わりに、URLを渡すだけで、ユーザーのデフォルトのブラウザで開かれます。これはすべてのプラットフォームに有効です。

Process.Start("http://www.google.com");
4
oefe

パラメータを個別に渡すのではなく、プロセス名に連結するようなことを試しましたか?

 var processName = "/ Applications/Google Chrome.app/Contents/MacOS/Google Chrome"; 
 var args = "--no-default-browser-check"; 
 Process.Start(String.Format( "{0} {1}"、processName、args)); 
1
tucaz

なぜあなたはこのようなことを試してはいけません:

Process P = new Process();                        
P.StartInfo.FileName = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome";
P.StartInfo.Arguments = "--no-default-browser-check";
P.UseShellExecute = false;            
P.Start();
0
caesay