คุณสามารถแยกความแตกต่างระหว่างตัวเลขดิบกับตัวเลขที่ยกมาสำหรับอาร์กิวเมนต์บรรทัดคำสั่งโดยไม่ต้องหลีกเลี่ยงเครื่องหมายคำพูดใน C # ได้หรือไม่

สำหรับแอปพลิเคชันคอนโซล C# หากฉันระบุสิ่งต่อไปนี้ พารามิเตอร์ของฉันจะถูกตีความว่าเป็นค่าเดียวกัน:

myapp.exe "0" 0

และเพียง 0 มีความยาว 1 เมื่อตรวจสอบ

ฉันสงสัยว่ามีวิธีตรวจจับหมายเลขที่ยกมาเทียบกับตัวเลขดิบที่บรรทัดคำสั่งสำหรับแอปพลิเคชันคอนโซล C# โดยไม่บังคับให้ออกจากเครื่องหมายคำพูดสำหรับการป้อนข้อมูลของผู้ใช้หรือไม่

ฉันรู้ว่าคุณสามารถทำได้

myapp.exe \"0\" 0

และรับกลับ "0" 0 เมื่อตรวจสอบอาร์กิวเมนต์บรรทัดคำสั่งด้วย Environment.GetCommandLineArgs() ดังตัวอย่างด้านล่าง

using System;
using System.Collections.Generic;
using System.Linq;

namespace cl_app
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> arg_list = Environment.GetCommandLineArgs().ToList();
            foreach(var arg in arg_list)
            {
                Console.WriteLine(arg);
            }
        }
    }
}

เป็นไปได้ไหมที่จะทำโดยไม่ใช้เครื่องหมายคำพูด? ถ้าไม่เช่นนั้น นั่นเป็นข้อจำกัดบรรทัดคำสั่งทั่วไปของ Windows หรือไม่


person kayleeFrye_onDeck    schedule 22.02.2018    source แหล่งที่มา
comment
คุณหมายความว่าฉันไม่ควรเล่นสเก็ตด้วยการเรียก API เพียงครั้งเดียวใช่ไหม ไม่มีปัญหา :)   -  person kayleeFrye_onDeck    schedule 23.02.2018


คำตอบ (2)


คุณสามารถใช้ Environment.CommandLine เพื่อรับบรรทัดคำสั่งเป็นสตริงดิบ จากนั้นไปจากที่นั่น

person Blindy    schedule 22.02.2018

การอ้างอิงสตริงเพื่อเว้นวรรคคือไวยากรณ์บรรทัดคำสั่งมาตรฐานของ Windows ไม่ใช่ข้อจำกัด แต่เป็นไวยากรณ์เพียงอย่างเดียว นอกจากนี้ การหลีกเครื่องหมายคำพูดด้วย \ ก็เป็นมาตรฐานเช่นกัน นี่คือสาเหตุที่ .NET พยายามให้ความช่วยเหลือและแยกวิเคราะห์อาร์กิวเมนต์โดยใช้กฎเหล่านี้ใน Environment.GetCommandLineArgs() (และ static void Main(string[] args))

หากคุณต้องการแทนที่พฤติกรรมเริ่มต้นเหล่านี้ คุณจะต้องแยกวิเคราะห์บรรทัดคำสั่งดิบด้วยตนเอง คุณได้รับสิ่งนี้จาก Environment.CommandLine< /ก>. ซึ่งจะส่งคืนการเรียกบรรทัดคำสั่งจริง ดังนั้นจึงรวมชื่อโปรแกรมด้วย เช่น ConsoleApplication1.exe "0" 0.

person Rhumborl    schedule 22.02.2018
comment
ฉันจะไม่พูดไวยากรณ์ มันเป็นแบบแผนมากกว่า ไวยากรณ์บอกเป็นนัยว่าจะต้องปฏิบัติตามอย่างแน่นอน แต่ไม่มีสิ่งใดหยุดคุณจากการพูด เช่น app.exe " โปรดทราบว่าตัวอย่างก่อนหน้าของฉันไม่ได้รับอนุญาตใน Linux โดยที่ตัวแปลคำสั่งเข้ามาและเปลี่ยนบรรทัดคำสั่งของคุณก่อนที่คุณจะมีโอกาสดูมันด้วยซ้ำ (ตัวอย่างที่เป็นรูปวงกลม) - person Blindy; 23.02.2018