{"record":{"id":"6be84617db960d33","repo":"OrchardCMS/OrchardCore","slug":"invalid-switch-syntax-0-valid-syntax-is-switchname","errorCode":null,"errorMessage":"Invalid switch syntax: \"{0}\". Valid syntax is /<switchName>[:<switchValue>].","messagePattern":"Invalid switch syntax: \"(.+?)\"\\. Valid syntax is /<switchName>\\[:<switchValue>\\]\\.","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/OrchardCore/OrchardCore.Infrastructure/Commands/Parameters/CommandParametersParser.cs","lineNumber":24,"sourceCode":"{\n    [SecurityCritical]\n    public CommandParameters Parse(IEnumerable<string> args)\n    {\n        var arguments = new List<string>();\n        var switches = new Dictionary<string, string>();\n\n        foreach (var arg in args)\n        {\n            // Switch?\n            if (arg[0] == '/')\n            {\n                var index = arg.IndexOf(':');\n                var switchName = index < 0 ? arg[1..] : arg[1..index];\n                var switchValue = index < 0 || index >= arg.Length ? string.Empty : arg[(index + 1)..];\n\n                if (string.IsNullOrEmpty(switchName))\n                {\n                    throw new ArgumentException(string.Format(\"Invalid switch syntax: \\\"{0}\\\". Valid syntax is /<switchName>[:<switchValue>].\", arg));\n                }\n\n                switches.Add(switchName, switchValue);\n            }\n            else\n            {\n                arguments.Add(arg);\n            }\n        }\n\n        return new CommandParameters\n        {\n            Arguments = arguments,\n            Switches = switches,\n        };\n    }\n}\n","sourceCodeStart":6,"sourceCodeEnd":42,"githubUrl":"https://github.com/OrchardCMS/OrchardCore/blob/4306c0717fe573f6fca1b4955909ddab6a192807/src/OrchardCore/OrchardCore.Infrastructure/Commands/Parameters/CommandParametersParser.cs#L6-L42","documentation":"CommandParametersParser.Parse accepts switches in the form /<switchName>[:<switchValue>]. An argument starting with '/' that yields an empty switch name (e.g. a bare '/' or '/:value') fails this format and throws ArgumentException.","triggerScenarios":"Calling Parse with a command-line args array containing an empty switch like \"/\", \"/:\", or \"/:foo\".","commonSituations":"Typo in a command line; programmatic construction of args where a variable switch name is empty; scripted command invocations producing stray slashes.","solutions":["Correct the argument so it follows /name or /name:value syntax.","Guard programmatically built args: skip or fix any arg where the segment after '/' is empty.","Quote or escape slashes that are path prefixes rather than switches if the parser should treat them as values."],"exampleFix":"// before\nvar args = new[] { \"/\", \"Foo\" }; // empty switch name\nparser.Parse(args);\n// after\nvar args = new[] { \"/Foo\" };\nparser.Parse(args);","handlingStrategy":"validation","validationCode":"foreach (var arg in args.Where(a => a.StartsWith('/')))\n    if (arg.Length < 2 || arg[1] == ':') throw new FormatException($\"Invalid switch: {arg}\");","typeGuard":null,"tryCatchPattern":"try { parser.Parse(args); }\ncatch (ArgumentException ex) when (ex.Message.StartsWith(\"Invalid switch syntax\")) { /* print usage */ }","preventionTips":["Validate CLI args before parsing","Avoid building switch strings from possibly-empty variables","Show a usage example: /name[:value]"],"tags":["cli","parsing","invalid-cli-argument"],"backgroundTag":"invalid-cli-argument","analyzedSha":"4306c0717fe573f6fca1b4955909ddab6a192807","analyzedAt":"2026-09-13T17:41:05.024Z","contentChangedAt":"2026-09-13T17:41:05.024Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}