| import { splitArgsPreservingQuotes } from "./arg-split.js"; | |
| import { assertNoCmdLineBreak } from "./cmd-set.js"; | |
| export function quoteCmdScriptArg(value: string): string { | |
| assertNoCmdLineBreak(value, "Command argument"); | |
| if (!value) { | |
| return '""'; | |
| } | |
| const escaped = value.replace(/"/g, '\\"').replace(/%/g, "%%").replace(/!/g, "^!"); | |
| if (!/[ \t"&|<>^()%!]/g.test(value)) { | |
| return escaped; | |
| } | |
| return `"${escaped}"`; | |
| } | |
| export function unescapeCmdScriptArg(value: string): string { | |
| return value.replace(/\^!/g, "!").replace(/%%/g, "%"); | |
| } | |
| export function parseCmdScriptCommandLine(value: string): string[] { | |
| // Script renderer escapes quotes (`\"`) and cmd expansions (`%%`, `^!`). | |
| // Keep all other backslashes literal so Windows drive/UNC paths survive. | |
| return splitArgsPreservingQuotes(value, { escapeMode: "backslash-quote-only" }).map( | |
| unescapeCmdScriptArg, | |
| ); | |
| } | |