Barre oblique inverse et devis dans les arguments de ligne de commande
Est le comportement suivant une caractéristique ou d'un bug dans C# .NET?
Application de Test:
using System;
using System.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Arguments:");
foreach (string arg in args)
{
Console.WriteLine(arg);
}
Console.WriteLine();
Console.WriteLine("Command Line:");
var clArgs = Environment.CommandLine.Split(' ');
foreach (string arg in clArgs.Skip(clArgs.Length - args.Length))
{
Console.WriteLine(arg);
}
Console.ReadKey();
}
}
}
L'exécuter avec des arguments de ligne de commande:
a "b" "\\x\\" "\x\"
Dans le résultat je reçois:
Arguments:
a
b
\\x\
\x"
Command Line:
a
"b"
"\\x\\"
"\x\"
Il manque des barres obliques inverses et de la non-suppression de la citation dans les arguments passés à la méthode Main(). Est-ce la bonne solution sauf manuellement l'analyse Environment.CommandLine
?
- En général, il est beaucoup plus probable que c'est un bug dans votre code que d'un bug dans la langue.
- S'il vous plaît trouver un bug dans le programme, les sources sont indiqués dans le post original. Je vais vraiment l'apprécier.
- Il semble être une caractéristique: msdn.microsoft.com/en-us/library/... Si un guillemet double à la suite de deux ou d'un même nombre de barres obliques inverses, chaque instance de la barre oblique inverse paire est remplacé par une barre oblique inverse et le guillemet double est supprimé. Si un double guillemet suit un nombre impair de barres obliques inverses, dont l'un, précédent paire est remplacé par une barre oblique inverse et le reste de la barre oblique inverse est supprimé; toutefois, dans ce cas, les guillemets ne sont pas supprimés.
Vous devez vous connecter pour publier un commentaire.
Selon cette l'article de Jon Galloway, il peut y avoir des comportements bizarres connu lors de l'utilisation des barres obliques inverses dans les arguments de ligne de commande.
Plus particulièrement, il mentionne que "la Plupart des applications (y compris .NET applications) utilisation CommandLineToArgvW à décoder leurs lignes de commande. Il utilise fou échapper à des règles qui expliquent le comportement que vous vous voyez."
Il explique que le premier ensemble de barres obliques inverses ne nécessitent pas de s'échapper, mais les barres obliques inverses à venir après l'alpha (numérique peut-être trop?) personnages besoin de fuir et qu'il cite toujours besoin d'être échappé.
En fonction de ces règles, je crois me les arguments que vous voulez, vous auriez à passer comme:
"Déjanté" en effet.
J'ai échappé le problème d'une manière différente...
Au lieu de trouver les arguments qui ont déjà analysée je reçois les arguments de chaîne comme il est et puis je suis en utilisant ma propre parser:
Ce concept vous permet de taper des devis sans l'échapper préfixe.
Je suis tombé sur cette même question l'autre jour et a eu un moment difficile obtenir à travers elle. Dans ma recherche sur google, je suis tombé sur cet article concerne VB.NET (la langue de mon application) qui a résolu le problème sans avoir à changer tout mon code basé sur les arguments.
Dans cet article, il se réfère à la article original qui a été écrit en C#. Voici le code, vous passer
Environment.CommandLine()
:C#
VB.NET:
Après beaucoup d'expérimentation, cela a fonctionné pour moi. Je suis en train de créer une commande à envoyer à la ligne de commande de Windows. Un nom de dossier qui vient après la
-graphical
option dans la commande, et puisqu'il peut contenir des espaces, il doit être enveloppé dans des guillemets doubles. Lorsque j'ai utilisé des barres obliques inverses pour créer le devis ils sont venus comme des littéraux dans la commande. Donc, ce. . . .q
est une chaîne de caractères contenant juste un double caractère de devis. Il est précédé avec@
pour en faire un verbatim littéral de chaîne.La commande modèle est aussi un mot à mot littéral de chaîne et la chaîne.Format méthode est utilisée pour compiler le tout dans
strCmdText
.@"" + (char) 34
est en train de faire? Pourquoi ne pas simplement écrire"\""
? Et, pourquoi avez-vous besoin de l'utilisateurstring.Format
de les insérer dans le premier lieu? Vous pouvez écrire"
dans un verbatim chaîne@"-graphical ""{0}"" ..."
Cela fonctionne pour moi, et qu'elle fonctionne correctement avec l'exemple de la question.