我有一个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()'
为什么我用硬代码编码数据库名称却不能使用变量时为什么起作用
答案 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()'
}