PowerShell Invoke-Command无法正确传递参数

时间:2019-07-16 08:47:10

标签: mongodb powershell

我有一个PowerShell脚本,它将在远程服务器上调用命令。我正在尝试设置此脚本,以便我可以传递一个service参数,它将在MongoDB中删除该特定表

$service = "DatabaseName"

$username = "username"
$password = "password"

$pass = ConvertTo-SecureString -AsPlainText $password -Force
$cred = New-Object System.Management.Automation.PSCredential -ArgumentList $username, $pass

Invoke-Command -ComputerName Remote-Server1 -Credential $cred -ArgumentList $service -ScriptBlock {
    param($service) 
    & 'C:\Program Files\MongoDB\Server\4.0\bin\mongo.exe' $service --eval 'db.dropDatabase()'
}

Invoke-Command -ComputerName Remote-Server2 -Credential $cred -ArgumentList $service -ScriptBlock {
    param($service) 
    & 'C:\Program Files\MongoDB\Server\4.0\bin\mongo.exe' $service --eval 'db.dropDatabase()'
}

如果要使用以下内容,它不会删除MongoDB数据库:

& 'C:\Program Files\MongoDB\Server\4.0\bin\mongo.exe' $service --eval 'db.dropDatabase()'

但是,如果我使用以下命令,它将按预期工作:

& 'C:\Program Files\MongoDB\Server\4.0\bin\mongo.exe' DatabaseName --eval 'db.dropDatabase()'

为什么我用硬代码编码数据库名称却不能使用变量时为什么起作用

1 个答案:

答案 0 :(得分:1)

由于您的代码仅以只读方式需要$service,因此您可以使用Using:-scope修饰符,请参阅其他信息here

基于此,您可以将代码更改为:

$service = "DatabaseName"
$username = "username"
$password = "password"

$pass = ConvertTo-SecureString -AsPlainText $password -Force
$cred = New-Object System.Management.Automation.PSCredential -ArgumentList $username, $pass

Invoke-Command -ComputerName Remote-Server1 -Credential $cred -ArgumentList $service -ScriptBlock {
    & 'C:\Program Files\MongoDB\Server\4.0\bin\mongo.exe' $Using:service --eval 'db.dropDatabase()'
}

Invoke-Command -ComputerName Remote-Server2 -Credential $cred -ArgumentList $service -ScriptBlock {
    & 'C:\Program Files\MongoDB\Server\4.0\bin\mongo.exe' $Using:service --eval 'db.dropDatabase()'
}

通过Invoke-Command执行远程命令时,我可以使用Using修饰符,将param块中变量的前缀为remote。基于此,我可以避免“不必要的”行为(如您在上文所述)。

所以另一种选择是:

Invoke-Command -ComputerName Remote-Server1 -Credential $cred -ArgumentList $service -ScriptBlock {
    param($remoteService)
    & 'C:\Program Files\MongoDB\Server\4.0\bin\mongo.exe' $remoteService --eval 'db.dropDatabase()'
}