備忘,或者留給暫未接觸但需要瞭解的人。 C#在一個進程內傳參數方法那是相當多,但是涉及到程式之間傳參數就不是那麼方便了(當然socket,記憶體共用等方式屬於另一類,此處不討論),我們的C或者C#,亦或者Java等在Main的函數入口處都會有一個參數Arg或者Args就是留出來方便自己被第三方軟體調用 ...
備忘,或者留給暫未接觸但需要瞭解的人。
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 ( ); } } }
結果: