محاولة لقراءة في بعض وسائط سطر الأوامر لتطبيق وحدة

StackOverflow https://stackoverflow.com/questions/1078172

سؤال

ولقد حصلت على بسيط جدا تطبيق وحدة التحكم .NET. وأود أن تمر في بعض وسائط سطر الأوامر ... لا شيء صعبة هناك.

والآن، كيكر هو، وعادة ما يكون لها قائمة من البنود أتمنى أن يمر في لوسيطة واحدة. في هذه الحالة، وقائمة من الملفات. لست متأكدا من أفضل طريقة للقيام بذلك.

eg. myapp.exe files=aaa.txt,bbb.txt,ccc.txt 

ولكن ماذا عن أسماء الملفات مع مسافات؟ ينبغي لي فاصلة delimate ذلك؟

ولجعل الامور مثيرة للاهتمام، لقد حصلت على وسائط أخرى، التي تقبل القيم واحدة .. لذلك أنا لست متأكدا مما إذا كان ينبغي وضع كل البيانات وسيطة في التنصيص ..

eg. myapp.exe files=aaa.txt,bbb.txt formatting=true foo=hello

أو

eg myapp.exe files="aaa.txt","bbb.txt" formatting="true" foo="hello"
هل كانت مفيدة؟

المحلول

وربما متأخرا بعض الشيء عن البرنامج الذي تعمل عليه، ولكن هنا كيف يمكنك أن تفعل ذلك باستخدام Mono.Options

static void Main(string[] args)
{
    //let's try this mono.options thing shall we?
    string xapfile = null;
    var files = new List<string>();
    var p = new Mono.Options.OptionSet()
    {
        { "xap=", v => xapfile =v },
        { "file:", v => files.Add(v)}
    };
    List<string> extra = p.Parse(args);


    Console.WriteLine(@"
    xap = '{0}', 
    file(s)= {1}", 
         xapfile, 
         string.Join(",", files.ToArray())
    );
    Console.WriteLine(@"
    left overs: {0}", 
        string.Join(Environment.NewLine, extra.ToArray())
    );
    // rest of your Main here

وسوف استدعاء جملة تكون

وmyapp.exe --file="file 1" --file="file 2" --file="file 3"

هل يمكن حتى التخلي كلها ملفات متغير ومجرد علاج المبالغ اليسار مثل الملفات، والذي يطلق عليه مثل myapp.exe "file 1" "file 2" "file 3" ونتف الملفات من قائمة إضافية.

وMono.Options هي قوية جدا. لم يكن لديك حتى لاستخدام -، يبدو يمكنك استخدام /file= أو -file=

ولسوء الحظ، ويندوز لا تفعل globbing لك (إلا إذا كنت تمر الخيارات لأمر cmdlet بوويرشيل)، ولذلك عليك أن تفعل ذلك بنفسك. فإنه من السهل جدا على الرغم من هنا هو قليلا من التعليمات البرمجية لقد استعملت في الماضي لتوسيع *.foo أو "c:\temp\*.bar|c:\temp\*.txt"

وأيضا، إلا إذا كنت التفاف أسماء الملفات في أجهزة اللاسلكي، وأنا ربما لن فاصلة فصل القائمة، كما فاصلة صالحة في اسم الملف. أنت تعرف أن واحد هو الذهاب لدغة لك يوم واحد :-) الأنابيب يجعل خيار جيد، ولكن فقط إذا كنت التفاف التعبير كله في اللاسلكي، وإلا النوافذ تعتقد تفعلونه الأنابيب. آه، مباهج معالجة سطر الأوامر: -)

نصائح أخرى

و، إذا كان يحتوي يجب وضع كل حجة أية مسافات في الاقتباس. خلاف ذلك أود أن ترك نقلت للخروج منه.

وبالنظر إلى أن قذيفة الخاص بك ربما يدعم بطاقة البرية globbing فمن الأفضل السماح لل ملفات الإدخال ليكون الفضاء قائمة مفصولة سهل وتفترض أنه إذا كان اسم الملف يحتوي على المساحات التي سيكون قد تم نجا بالفعل إما عن طريق المحيطة مع اقتباسات أو عن طريق \ حرفا. بواسطة سهل أعني لا تحتوي على --f أو / النمط و التبديل.

وهناك تقنية قليلا أقل شيوعا، ولكن ولا تدعمها جميع المكتبات القيام قيادة خط التوزيع، هو السماح مداخل متعددة من النموذج -f foo.txt -f bar.txt. هذا لا يلعب بشكل جيد مع سطر الأوامر globbing (على عكس الحل أعلاه).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top