微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从在调用命令外部定义的映射传递变量值并在调用命令之后使用

如何解决如何从在调用命令外部定义的映射传递变量值并在调用命令之后使用

我正在用 powershell 编写一个脚本,在系统上以用户 1 登录后,它将切换到用户 2,然后与该用户建立与数据库的连接。但是,要在 invoke 命令中传递的 dbinstance 详细信息、端口号和计算机名称将被定义为第二个 invoke 命令之前的映射,即当它将调用该命令以使用第二个用户(db 用户)打开 powershell 时。在这种情况下,它可以使用 userid,即何时调用与第二个用户的 powershell 连接,但是它无法将 dbinstance 和 port 的值传递给下一个 sqlcmd 调用。下面是代码供参考。在这代码中,它在获取 $inputMap.UserNameP 时运行良好,但在传递 $inputMap.DBInstance,$inputMap.PortNo 时失败。

$UserName =  'User1' 
$securekey = @'
securekey1
'@ |ConvertTo-securestring -AsPlainText -Force;
$concreds=New-Object System.Management.Automation.PSCredential -ArgumentList $UserName,$securekey;
Invoke-Command -Credential $concreds -ComputerName 'abc.domainname'-Authentication Credssp -ScriptBlock {
function checkFaultHighutilization() {
$local:ExecStdOperatorOut=Invoke-Command -ScriptBlock {
$inputMap=@{"UserNameP"="User2";"DBInstance"="databaseinstancename";"PortNo"="portnumber";};
$securekey1 = "securekey1"
$finalresult = @()
$securekey2 = $securekey1 | ConvertTo-securestring -AsPlainText -Force;
$concreds=New-Object System.Management.Automation.PSCredential -ArgumentList $inputMap.UserNameP,$securekey2;
Invoke-Command -Credential $concreds -ComputerName 'computername' -Authentication Credssp  -ScriptBlock {
$var1=Invoke-sqlcmd  -query "
Begin
select  * from db
End" -ServerInstance "$inputMap.DBInstance,$inputMap.PortNo"
##if (($var1.count) -gt 0) {
foreach($row in $var1){
$finalresult+=$row.a+':'+$row.b+':'+$row.c
echo $finalresult
}
}
}
$local:ExecStdOperatorRet=if($local:ExecStdOperatorOut) {0} else {1}
return $local:ExecStdOperatorRet,$local:ExecStdOperatorOut;
};
$ESExecReturn,$ESExecOutput=checkFaultHighutilization
$ESExecOutput=($ESExecOutput | Out-String).Trim();
Write-output "ESExecOutput:";
Write-output $ESExecOutput;
Write-output ":ESExecOutput";Write-output $("ESExecError:" + $Error + ":ESExecError");
Write-output $("ESExecReturn:" + $ESExecReturn + ":ESExecReturn");
}

解决方法

$scriptBlockOne = {
    $variableA = "Hello World"
    return $variableA
}

$scriptBlockTwo = {
    param (
        $inputString
    )
    Write-host $inputString
}

$invokeCommandReturn = Invoke-Command -ScriptBlock $scriptBlockOne
Invoke-Command -ScriptBlock $scriptBlockTwo -ArgumentList $invokeCommandReturn

,

您正在尝试在 可扩展字符串中按原样使用表达式,例如 $inputMap.DBInstance 原样 strong> ("..."),在语法上不受支持。

  • 要使用表达式,您必须将它们括在 $(...)subexpression operator 中。
  • 有关 PowerShell 中字符串插值的全面讨论,请参阅 this answer

因此:

# ...

$var1 = Invoke-Sqlcmd -Query "
Begin
select  * from db
End" -ServerInstance "$($inputMap.DBInstance),$($inputMap.PortNo)" # Note the $()

# ...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。