備忘,或者留給暫未接觸但需要了解的人。
C#在一個進程內傳參數方法那是相當多,但是涉及到程序之間傳參數就不是那么方便了(當然socket,內存共享等方式屬於另一類,此處不討論),我們的C或者C#,亦或者Java等在Main的函數入口處都會有一個參數Arg或者Args就是留出來方便自己被第三方軟件調用的時候傳入參數的,俗稱啟動參數。
最近在使用的時候,我需要傳入一個路徑,並且路徑中存在一些空格之類的符號,接收方始終接受錯誤,這個如何處理呢?由於一般傳參時時輸入一個string,接收方可以時string arg或者時string[] args,所以默認是使用空格來分割string類型的參數為string[]的。所以如果傳入"D:\\Program files\\Baidu Yun\\Auto Update\\"這樣一個參數就會變成“D:\Program”,“files\Baidu”,“Yun\Auto”,“Update\”形式,那該怎么辦呢? 可以使用雙引號("")把一個參數括起來,這里面還需要注意參數末尾帶有“\”的問題。
做了如下實例驗證通過(都在C#里,沒有測試調用C/java程序測試):
調用方程序:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; namespace argTest1 { class Program { static void Main ( string[ ] args ) { Console.WriteLine ( "Begin test"); Process p=new Process ( ); p.StartInfo.FileName = ".\\argTest.exe"; p.StartInfo.UseShellExecute = true; ArgsBuilder arg=new ArgsBuilder ( ); arg.Add ( "hello"); arg.Add ( "D:\\小工具\\Assistant.exe" ); arg.Add ( AppDomain.CurrentDomain.BaseDirectory); arg.Add ( "D:\\Program files\\Baidu Yun\\Auto Update\\"); arg.Add ( "D:/Program files/Baidu Yun/Auto Update/" ); arg.Add ( "Arg Ends" ); p.StartInfo.Arguments = arg.ToString ( ); p.Start ( ); Console.ReadLine ( ); }
/// <summary>
/// 參數構建類
/// </summary> public class ArgsBuilder { StringBuilder _arg=new StringBuilder(); public ArgsBuilder() { _arg.Append ( ""); } /// <summary> /// 添加參數 /// </summary> /// <param name="str"></param> public void Add(string str) { if ( str.EndsWith ( "\\" ) ) //處理最后若為“\\”,會被轉義成“\”,然后變成轉義符。 { str += "\\"; }
_arg .AppendFormat( "\"{0}\"",str ); _arg.Append ( " "); //參數分割符號 } public override string ToString() { return _arg.ToString(); } } } }
被調用方:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace argTest { class Program { static void Main ( string[ ] args ) { if(args!=null && args.Length>0) //打印出參數 { foreach ( var item in args ) { Console.WriteLine (item ); } } if(File.Exists(args[1])) { System.Diagnostics.Process.Start ( args[1]); } string s=Console.ReadLine ( ); } } }
結果:

