如何将参数传递给PowerShell脚本以匹配csv文件中的列

如何将参数传递给PowerShell脚本以匹配csv文件中的列,powershell,Powershell,CSV文件如下所示 $current_pc = "$env:computername" $filePath = "c:\users\Ara\Desktop\parameters.csv" $machineParams = Import-CSV $filePath $info = if($machineParams){$machineParams | where {$_.branch -eq $($current_pc.Substring($current_pc

CSV文件如下所示

$current_pc     = "$env:computername"
$filePath      = "c:\users\Ara\Desktop\parameters.csv"
$machineParams = Import-CSV $filePath
$info          = if($machineParams){$machineParams | where {$_.branch -eq $($current_pc.Substring($current_pc.length - 3,3))}}
             else{write-output "CSV not loaded"}
$info

Start-Process -FilePath "c:\users\Ara\Desktop\setup.msi"  -ArgumentList “/qf”, "DATABASE_ID=$($info.param1)" , "ODBC_DATABASE_NAME=$($info.ODBC_param2)" ,  "ODBC_ENGINE_NAME=$($info.param3)" -wait
我的问题是脚本中应该包含什么逻辑?
要运行
install.ps1-188
它需要csv文件中188旁边的值

我只读取
$current\u pc的参数

branch param1 param2  param3
------ ------ ------  ------
188    apr101 1.0.0.1 0
101    apr104 1.0.0.1 1
样本输出(此pcs名称以610结尾)

或者文件中没有匹配的分支

branch param1 param2  param3
------ ------ ------  ------
610    aprxxx 1.0.0.1 1

您可以使用
param
块并将默认ID定义为computername子字符串

no params for 610
然后,您可以调用脚本,当您定义ID参数时,它将覆盖默认方案,当不调用时,将使用computername方案

param (
    $ID = (@($ENV:computername) | ForEach-Object {$_.Substring($_.length - 3,3)})
)
$filePath      = "c:\users\Ara\Desktop\parameters.csv"
$machineParams = Import-CSV $filePath | Where-Object {$_.branch -eq $ID}
$info          = if ($machineParams) {
                    $machineParams
                } else {
                    # Use a throw to error out when invalid csv 
                    throw "no params for $ID"
                }
$info

Start-Process -FilePath "c:\users\Ara\Desktop\setup.msi"  -ArgumentList “/qf”, "DATABASE_ID=$($info.param1)" , "ODBC_DATABASE_NAME=$($info.ODBC_param2)" ,  "ODBC_ENGINE_NAME=$($info.param3)" -wait

编辑:使用@LotPings建议更新了早期的筛选

谢谢BenH,我正在尝试编辑,但是您能否尝试澄清您的问题?你到底在找什么?预期的结果是什么?我发布的脚本与computername匹配并相应地获取值,但我们确实有一些具有不同命名规则的机器。如果脚本名称为intasll.ps1。如果我运行install.ps1-188,它应该使用188s旁边的参数。由于lotPings,脚本运行良好。我想做的是编辑脚本。我想从命令窗口运行。如果我打开cmd和powershell。运行install.ps1-188命令。然后脚本在分支下面查找188,如果匹配,运行带有IITF旁边的参数的安装程序,我的答案可以解决您的问题,或者有助于考虑和/或Nope LotPings,它没有解决。正如我所说,我发布的脚本效果很好。但是我想将参数传递给脚本本身。我运行了代码,得到了术语“param”不能识别为cmdlet、函数、脚本文件或可操作程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试。函数参数列表中的“Missing')。第1行字符:36处不允许使用空管道元素。第1行字符:36“@dj3094已更新,将整个参数括在括号中以修复该错误消息。我将脚本保存为桌面上的install.ps1。效果良好。如果我不想将其与computername匹配怎么办。如果我运行install.ps1-ID 188,它将通过csv并获取参数,@dj3094如果你只运行
install.ps1
它将使用计算机名子字符串,如果你运行
install.ps1-ID 188
它将使用
188
而不是子字符串。我将它改为$ID=([INT32]$info.branch)我认为它可以工作,我会做一些测试,然后再给你回复,谢谢
param (
    $ID = (@($ENV:computername) | ForEach-Object {$_.Substring($_.length - 3,3)})
)
$filePath      = "c:\users\Ara\Desktop\parameters.csv"
$machineParams = Import-CSV $filePath | Where-Object {$_.branch -eq $ID}
$info          = if ($machineParams) {
                    $machineParams
                } else {
                    # Use a throw to error out when invalid csv 
                    throw "no params for $ID"
                }
$info

Start-Process -FilePath "c:\users\Ara\Desktop\setup.msi"  -ArgumentList “/qf”, "DATABASE_ID=$($info.param1)" , "ODBC_DATABASE_NAME=$($info.ODBC_param2)" ,  "ODBC_ENGINE_NAME=$($info.param3)" -wait
# Use computername scheme
install.ps1
# Use defined ID
install.ps1 -ID 188