Bisakah Anda membedakan antara angka mentah versus angka yang dikutip untuk argumen baris perintah tanpa keluar dari tanda kutip di C#?

Untuk aplikasi konsol C#, jika saya memberikan yang berikut ini, parameter saya akan ditafsirkan sebagai nilai yang sama:

myapp.exe "0" 0

Dan jadilah 0 dengan panjang 1 saat diperiksa.

Saya bertanya-tanya apakah ada cara untuk mendeteksi nomor yang dikutip versus nomor mentah di baris perintah untuk aplikasi konsol C# tanpa memaksa keluar dari tanda kutip untuk input pengguna.

Saya tahu Anda bisa melakukan ini,

myapp.exe \"0\" 0

Dan dapatkan kembali "0" 0 saat memeriksa argumen baris perintah dengan Environment.GetCommandLineArgs() seperti contoh di bawah ini.

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);
            }
        }
    }
}

Apakah ini mungkin dilakukan tanpa menghindari kutipan? Jika tidak, apakah itu batasan baris perintah Windows yang umum?


person kayleeFrye_onDeck    schedule 22.02.2018    source sumber
comment
Maksud Anda saya tidak boleh meluncur dengan satu panggilan API? Tidak masalah :)   -  person kayleeFrye_onDeck    schedule 23.02.2018


Jawaban (2)


Anda dapat menggunakan Environment.CommandLine untuk mendapatkan baris perintah sebagai string mentah, lalu lanjutkan dari sana.

person Blindy    schedule 22.02.2018

Mengutip string untuk memberikan spasi adalah sintaks baris perintah Windows standar, bukan batasan, hanya sintaksis. Selain itu, menghindari tanda kutip dengan \ juga merupakan standar. Inilah sebabnya .NET mencoba membantu dan mem-parsing argumen menggunakan aturan ini di Environment.GetCommandLineArgs() (dan static void Main(string[] args)).

Jika Anda ingin mengganti perilaku default ini, Anda perlu mengurai sendiri baris perintah mentah. Anda dapat mengambilnya dari Environment.CommandLine< /a>. Ini mengembalikan panggilan baris perintah yang sebenarnya, jadi sertakan nama program, mis. ConsoleApplication1.exe "0" 0.

person Rhumborl    schedule 22.02.2018
comment
Saya tidak akan mengatakan sintaksis, ini lebih merupakan konvensi. Sintaksnya menyiratkan bahwa hal itu mutlak harus diikuti, tetapi tidak ada yang menghentikan Anda untuk mengatakan, misalnya, app.exe ". Perhatikan bahwa contoh saya sebelumnya tidak diperbolehkan di Linux, di mana penerjemah perintah masuk dan mengubah baris perintah Anda bahkan sebelum Anda sempat melihatnya (misalnya globbing). - person Blindy; 23.02.2018