I experience some problem with executing PowerShell command from CMD.
I have a function MyFunction in PowerShell which takes two parameters: Id and Text.
Example:
MyFunction 12345 "Name = Karl"
I need to call this function from CMD:
powershell -Command . { MyFunction $* }
where $*: 12345 "Name = Karl"
But I get error:
A positional parameter cannot be found that accepts argument 'Karl'
The cause of it is quotes are being removed from passing parameters
I figured out I need to escape all quotes in passing parameters but I really don't know how to do it within $*. I'm not expert in CMD, could you please help me to solve the issue?
Update (12/25/2019)
I forgot to mention I'm creating an alias via doskey and I don't know how to escaping quotes within $*
MyFunction=powershell -Command . { MyFunction $* }

doskeymacros do not support pre-processing of arguments passed ($*), which is what is required in your case.Preprocessing of the arguments is required, because you're using the PowerShell CLI's
-Commandparameter - of necessity, since you're calling a function - where the arguments undergo an additional round of parsing after PowerShell strips them of enclosing"...": the resulting values are concatenated and then interpreted as a piece of PowerShell code - and by that time what was originally"Name = Karl"is seen as 3 individual arguments,Name,=, andKarl. To solve that problem, you'd have to use embedded quoting, by passing"Name=Karl"as"\"Name = Karl\""(sic) instead.However, you wouldn't have that problem if you used
-Fileinstead of-Command, but that only works when you call a script file (*.ps1).Here's a workaround:
*.ps1file named, say,MyFunction.ps1, with the following content:Be sure that function
MyFunctionis actually defined in your PowerShell sessions. By virtue of being a function, it takes precedence over a script with the same base name.doskeymacro as follows (adjust the path as needed; if you placedMyFunction.ps1in a directory listed in$env:PATH, you don't need to specify a path):