在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 它会解析字符串内容,因此您可以在其中放置任何内容,而不仅仅是单个命令.
约翰内斯的所有建议都在现场,但我想让人们意识到在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的问题,但这是一个值得了解的技巧.
| 归档时间: |
|
| 查看次数: |
4386 次 |
| 最近记录: |