如何从字符串调用命令?

时间:2019-01-08 01:39:05

标签: powershell

每当我尝试从字符串调用命令时,都会出现语法错误。

这是针对某些用户的临时控制台,但我只希望允许某些自定义命令。

我已经尝试了以下方法: &$ functionName $ paramater1 $ paramater2 调用命令-ScriptBlock {$ functionName $ paramater1 $ paramater2}

Write-Host 'READY>' -NoNewline -ForegroundColor Magenta;$inputx = Read-Host;$input = $inputx.Split()
if (Get-Command $cmdName -errorAction SilentlyContinue){ # Checks if function is available
    # Execute exact string
}

期望的是:

说我们输入"Write-Host 'Hello World!' -NoNewLine" 要执行的命令:Write-Host 'Hello World!' -NoNewLine

返回的内容:

At line:1 char:44 + Invoke-Command -ScriptBlock {$functionName $paramater1 $paramater2} + ~~~~~~~~~~~ Unexpected token '$paramater1' in expression or statement. At line:1 char:56 + Invoke-Command -ScriptBlock {$functionName $paramater1 $paramater2} + ~~~~~~~~~~~ Unexpected token '$paramater2' in expression or statement. + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : UnexpectedToken

1 个答案:

答案 0 :(得分:0)

解决方案:根据分隔的字符串创建一个联合字符串,然后使用Invoke-Expression $ command。

这对我来说确实是一些块状和可怕的编程,可以轻松简化,但这是原始的块修复程序。

Write-Host 'READY>' -NoNewline -ForegroundColor Magenta;$inputx = Read-Host;$input = $inputx.Split()
if (Get-Command $cmdName -errorAction SilentlyContinue){
    if($input[0] -eq $null){
        write error 'Empty command'
    }else{
    if($input[1] -eq $null){
        $command = $input[0]
        Invoke-Expression $command
    }else{
    if($input[2] -eq $null){
        $command = $input[0]+" "+$input[1]
        Invoke-Expression $command
    }else{
    if($input[3] -eq $null){
        $command = $input[0]+" "+$input[1]+" "+$input[2]
        Invoke-Expression $command
    }else{
    if($input[4] -eq $null){
        $command = $input[0]+" "+$input[1]+" "+$input[2]+" "+$input[3]
        Invoke-Expression $command
    }else{
        $command = $input[0]+" "+$input[1]+" "+$input[2]+" "+$input[3]+" "+$input[4]
        Invoke-Expression $command
    if($input[5] -eq $null){
        $command = $input[0]+" "+$input[1]+" "+$input[2]+" "+$input[3]+" "+$input[4]+" "+$input[5]
        Invoke-Expression $command
    }else{
    if($input[6] -eq $null){
        $command = $input[0]+" "+$input[1]+" "+$input[2]+" "+$input[3]+" "+$input[4]+" "+$input[5]+" "+$input[6]
        Invoke-Expression $command
    }else{
    if($input[7] -eq $null){
        $command = $input[0]+" "+$input[1]+" "+$input[2]+" "+$input[3]+" "+$input[4]+" "+$input[5]+" "+$input[6]+" "+$input[7]
        Invoke-Expression $command
    }else{
    if($input[8] -eq $null){
        $command = $input[0]+" "+$input[1]+" "+$input[2]+" "+$input[3]+" "+$input[4]+" "+$input[5]+" "+$input[6]+" "+$input[7]+" "+$input[8]
        Invoke-Expression $command
    }else{
    if($input[9] -eq $null){
        $command = $input[0]+" "+$input[1]+" "+$input[2]+" "+$input[3]+" "+$input[4]+" "+$input[5]+" "+$input[6]+" "+$input[7]+" "+$input[8]+" "+$input[9]
        Invoke-Expression $command
    }else{
    if($input[10] -eq $null){
        $command = $input[0]+" "+$input[1]+" "+$input[2]+" "+$input[3]+" "+$input[4]+" "+$input[5]+" "+$input[6]+" "+$input[7]+" "+$input[8]+" "+$input[9]+" "+$input[10]
        Invoke-Expression $command
    }}}}}}}}}}}
}