首页 > 解决方案 > 将信息数组传递给powershell中的单独脚本

问题描述

我有一个从 SQL 中获取一系列信息的脚本。然后它解析信息并将其传递给一系列数组。然后我想将每个数组传递给一个单独的脚本。

我已经看到 Start-job 应该能够做到这一点,但从我的测试来看,它似乎不起作用。这是我尝试过的。每个脚本单独工作,我目前只是使用 CVS 来传递信息。

一旦信息在脚本中,我需要能够从每个对象调用特定属性。我确实得到它只是将数组打印为字符串,但我不能调用任何特定的东西。

Invoke-Sqlcmd -Query $Q1 -ServerInstance $I -Database $DB | Export-Csv "$Files\Employees.csv"

$emps = Import-Csv "$Files\Employees.csv"
$newaccounts = @()
$deacaccounts = @()
$changedusers = @()
if(Test-Path -Path "$Files\Employees.csv"){
    foreach ($emp in $emps) {
        if ($emp.emp_num.trim() -ne $emp.EmpNum) {
           $newaccounts += $emp 
        }
        if ($emp.emp_num.trim() -eq $emp.EmpNum) {
            if ($emp.fname -ne $emp.GivenName -and $emp.lname -ne $emp.SurName) {
                $deacaccounts += $emp
                $newaccounts += $emp
            }
            else ($emp.dept -ne $emp.DepartmentNumber -or $emp.job_title -ne $emp.JobTitle) {
                $changedusers += $emp
            }
        }
    }
}

Start-job -path "script" -argumentlist (,$deacaccounts)
Start-job -path "script" -argumentlist (,$changedusers)
Start-job -path "script" -argumentlist (,$newaccounts )

编辑: 传递给脚本的信息将是多行员工数据。我需要能够在“子”脚本中获取该信息并根据它们执行操作。

例:Deacaccounts =

名称 名称 雇员人数
泰德 卡兹 1234
山姆 大车 245

标签: powershellautomation

解决方案


如果你真的需要后台作业——事实证明你不需要——请注意Start-Job没有-Path参数;你会用的-ScriptBlock { & "$script" }

要简单地在前台调用脚本,请按顺序使用以下内容(script代表您的.ps1文件路径):

& "script" $deacaccounts
& "script" $changedusers
& "script" $newaccounts

注意:&调用运算符仅在脚本/可执行路径被引用和/或包含变量引用(或子表达式)时才需要;例如,可以在没有;的情况c:\foo\bar.ps1下调用带有路径的脚本。例如 &
c:\foo\bar.ps1 $deacaccounts

请注意,您的脚本每个都将接收一个参数,其中包含一个值数组

相反,如果您想将数组元素作为单个(位置)参数传递,则必须使用splatting,其中使用 sigil@而不是$传递变量(例如,
& "script" @deaccounts)。

如果您需要枚举数组并将每个对象作为参数单独传递,请使用以下命令:

foreach ($obj in $deaccounts)   { & "script" $obj }
foreach ($obj in $changedusers) { & "script" $obj }
foreach ($obj in $newaccounts)  { & "script" $obj }

如果每个对象都应根据其属性值进行定位:

foreach ($obj in $deaccounts) { 
  $vals = $obj.psobject.Properties.Value
  & "script" @vals 
}
# ... ditto for $changeduser and $newaccounts

如果每个对象都应该按属性名称进行分割,则基于属性名称和值,您需要首先将每个对象转换为哈希表

foreach ($obj in $deaccounts) { 
  $params = @{}
  foreach ($prop in $obj.psobject.Properties) {
    $params[$prop.Name] = $prop.Value
  } 
  & "script" @params
}
# ... ditto for $changeduser and $newaccounts

顺便说一句:在循环中增量扩展数组+=效率低下,因为每次迭代都必须在幕后创建一个数组,因为数组的大小是固定的。

一般来说,一种更有效的方法是使用foreach循环作为表达式,并让 PowerShell 本身将输出收集到一个数组中:[array] $outputs = foreach (...) { ... }- 请参阅此答案

如果您需要手动创建数组,例如创建多个数组,例如 在您的情况下,请使用有效可扩展的列表类型,例如[System.Collections.Generic.List[object]]- 请参阅此答案


推荐阅读