I just asked about a problem and the suggested code has some obscure points for me.
Specifically on this line of code
powershell.exe -c "Start-Process -Verb RunAs cmd /k, ('%~f0' -replace '[ &]', '^$0')"
I would like to know what the comma after the
cmd /krepresents. What's this? How does it work? Is there a link to the documentation explaining this ?What's is the
$0in the last part.'^$0')"
CodePudding user response:
The Start-Process call embedded in your Windows PowerShell CLI (powershell.exe) call uses positional parameter binding, for brevity:
cmd, as the first positional argument, binds to the-FilePathparameter, i.e. the name or path of the executable to launch./k, (...), as the second positional argument, binds to the-ArgumentListparameter, which accepts an array of arguments to pass the target executable, whose elements are separated with,
Start-Process then builds a command line behind the scenes, by joining the -FilePath argument and the -ArgumentList array elements with spaces, and launches it.
As an aside:
The way
Start-Processbuilds the command line is actually broken, because no on-demand quoting and escaping is performed - see this answer for background information; in your specific case, however, the problem doesn't surface.To work around the bug it is actually preferable in general to pass a single string to
-ArgumentListthat contains all arguments to pass; however, in this case that would have complicated quoting (you'd need an embedded"..."string or an explicit string-concatenation expression), so the simpler solution of enumerating the arguments with,was chosen.See this answer for how to discover a given cmdlet's positional parameters; in short: invoke it with
-?(Start-Process -?) and, in the relevant parameter set, look for the parameters whose names are enclosed in[...]; e.g.
Start-Process [-FilePath] <System.String> [[-ArgumentList] <System.String[]>] ...
