在PowerShell中,如何使用读取主机输入来获取参数值

在PowerShell中,如何使用读取主机输入来获取参数值,powershell,Powershell,我有一个脚本,其中包含一些数据库连接字符串的参数列表。脚本执行以下操作: 使用“读取主机”将数据库名称作为输入 使用输入满足任何If/ElseIf条件,并。。。 连接到数据库 运行SQL脚本以更新数据库 下面是一些示例代码: param ( # Connection Strings [string] $TestDb1_ConnectStr = "username/pwd@//hostname1:port1/sid1", [string] $TestDb2_ConnectStr =

我有一个脚本,其中包含一些数据库连接字符串的参数列表。脚本执行以下操作:

  • 使用“读取主机”将数据库名称作为输入
  • 使用输入满足任何If/ElseIf条件,并。。。
    • 连接到数据库
    • 运行SQL脚本以更新数据库
下面是一些示例代码:

param (
# Connection Strings
  [string] $TestDb1_ConnectStr = "username/pwd@//hostname1:port1/sid1",
  [string] $TestDb2_ConnectStr = "username/pwd@//hostname2:port2/sid2",
  [string] $TestDb3_ConnectStr = "username/pwd@//hostname2:port3/sid3",
  [string] $SQL_Path = "C:\bin\sql"
)

$Environment = Read-Host "Please enter environment name..."

If ($Environment -eq "TestDb1")
{
  function Invoke-SqlPlus($file) { (gc $file) | sqlplus $TestDb1_ConnectStr }
  new-alias sql Invoke-SqlPlus
  sql $SQL_Path\$Environment"_sometable.sql"
}
ElseIf ($Environment -eq "TestDb2")
{
  function Invoke-SqlPlus($file) { (gc $file) | sqlplus $TestDb2_ConnectStr }
  new-alias sql Invoke-SqlPlus
  sql $SQL_Path\$Environment"_sometable.sql"
}
ElseIf ($Environment -eq "TestDb3")
{
  function Invoke-SqlPlus($file) { (gc $file) | sqlplus $TestDb3_ConnectStr }
  new-alias sql Invoke-SqlPlus
  sql $SQL_Path\$Environment"_sometable.sql"
}
...
我实际上有14个数据库可以连接,而不是14个单独的If/ElseIf条件,我希望能够使用readhost的输入来传递连接字符串和SQL脚本。目前,我可以使用输入传入SQL脚本,但无法传入db连接字符串

我想这样做:

function Invoke-SqlPlus($file) { (gc $file) | sqlplus $Environment_ConnectStr }
new-alias sql Invoke-SqlPlus
sql $SQL_Path\$Environment"_sometable.sql"

但是,我不确定如何使用readhost的输入从连接字符串的参数列表中获取值。我如何才能做到这一点?

您所做的与此等效:

(gc $SQL_Path\$Environment"_sometable.sql") | 
    sqlplus (get-variable "$($Environment)_ConnectStr").value

您应该将这些参数中的每一个重构为必填:[Parameter(mandatory=$true)],并使它们成为ValueFromPipelineByPropertyName。然后,您可以使用导入CSV之类的方法从数据文件中读取这些内容


希望这有帮助

$文件是SQL脚本:$SQL\U Path\$环境“\u一张桌子。sql@Keith-你看到我的答案了吗?@manojlds-是的,我看到了你的答案。非常感谢你。我需要尝试一下您的解决方案,并让您知道。@Keith为什么要将SQL脚本管道化到SQLPlus,而不是仅将其作为以下参数提供:
SQLPlus.exe'username/pwd@//hostname1:port1/sid1'@C:\MyScript.SQL'
?@AndyArismendi-我之前尝试过您的方法,但与数据库的连接保持打开状态。顺便说一句:我上面的代码缺少一个“exit”命令,这会终止数据库连接。下面是使用manojlds的建议修改的代码:
函数Invoke SqlPlus($file){(gc$file)+“exit”| SqlPlus(获取变量“$($Environment)ConnectStr”).value}新别名sql Invoke SqlPlus sql$sql\u Path\$Environment“\u db\u table.sql”
我不明白这是如何回答这个问题的。问题的核心是,这个脚本的设计(有点糟糕)是为了接受用户从脚本中输入的内容。在使用读取主机的大多数情况下,最好利用内置提示。他应该使用一个数据文件,一个接一个的提示不是道路。就设计糟糕的部分达成一致。问题是它们不能被强制。首先,它们不必是参数。必须根据所选环境选择其中一个。使用用户输入并在脚本中存储参数/值目前只是一个选项。理想情况下,我希望将db连接字符串和其他db信息存储在一个单独的数据库表中,从db表中读取,并将值传递到脚本中,但我现在不在那里。也许我现在可以尝试数据文件(导入CSV)方法。让我也为我试图解决的问题添加一些上下文。我们有一个web应用程序,我们必须手动指定目标数据库、连接字符串、用户名/pwd信息等。我尝试的是自动执行手动步骤。最终,我的自动化脚本将链接到一个更大的端到端流程,在该流程中需要用户输入(例如,目标数据库、使用的数据库连接字符串等)。在我的脚本链接到端到端流程之前,它需要独立运行,这就是为什么我选择使用
readhost
获取用户输入的原因。如果有更好的办法,请告诉我。