为什么我不能使用powershell中的字符串中的参数执行命令行开关?

Geo*_*uer 6 powershell

在windows powershell中,我试图在一个字符串中存储一个move命令,然后执行它.有人能告诉我为什么这不起作用?

PS C:\Temp\> dir
    Directory: Microsoft.PowerShell.Core\FileSystem::C:\Temp

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         8/14/2009   8:05 PM       2596 sa.csproj
-a---         8/15/2009  10:42 AM          0 test.ps1


PS C:\Temp> $str = "mv sa.csproj sb.csproj"
PS C:\Temp> &$str
The term 'mv sa.csproj sb.csproj' is not recognized as a cmdlet, function, operable program, or script file. Verify the
 term and try again.
At line:1 char:2
+ &$ <<<< str
PS C:\Temp>
Run Code Online (Sandbox Code Playgroud)

存储任何带参数的命令时出现此错误.我如何克服这个限制?

Joe*_*oey 11

从帮助(about_Operators):

&  Call operator
  Description: Runs a command, script, or script block. Because the call
  operator does not parse, it cannot interpret command parameters.

您可以使用脚本块而不是字符串:

$s = { mv sa.csproj sb.csproj }
& $s
Run Code Online (Sandbox Code Playgroud)

或者您可以使用Invoke-Expression:

Invoke-Expression $str
Run Code Online (Sandbox Code Playgroud)

要么

iex $str
Run Code Online (Sandbox Code Playgroud)

相反&,Invoke-Expression 它会解析字符串内容,因此您可以在其中放置任何内容,而不仅仅是单个命令.

  • `&`用于执行单个命令,脚本或脚本块,就像帮助状态一样.它不进行任何解析,因此它只接受一个参数,然后假定它是一个可调用的命令.如果要添加参数,则将调用包装在脚本或脚本块中,或使用"Invoke-Expression".您可以在Powershell中键入"help about_operators"来找到描述运算符的帮助页面. (2认同)

Kei*_*ill 5

约翰内斯的所有建议都在现场,但我想让人们意识到在V2中有另一种选择.您像以前一样将命令放在字符串中,但是您将参数放在哈希表中并使用&例如调用:

$cmd = 'mv'
$params = @{Path = 'log.txt'; Destination = 'log.bak'}
&$cmd @params
Run Code Online (Sandbox Code Playgroud)

这使用了一个名为splatting的新V2功能.它有点像为命令使用响应文件,但是您将参数放在哈希表而不是文件中.

注意:您还可以将参数放在一个数组中,该数组将插入"按位置"而非名称插入参数,例如:

$cmd = "cpi"
$params = ('log.txt', 'log.bak')
&$cmd @params
Run Code Online (Sandbox Code Playgroud)

它可能不完全符合OP的问题,但这是一个值得了解的技巧.