powershell - 将信息数组传递给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 |
解决方案
如果你真的需要后台作业——事实证明你不需要——请注意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]]
- 请参阅此答案。
推荐阅读
- touch - TFT LCD驱动和TFT LCD控制器有什么区别
- android - ListView Android 中的 SQLite 数据库
- solar - 这是恒压mppt充电控制器吗?
- c# - 通过触摸按钮或图像而不是 A - D 键在表面上左右移动 3d 块
- powerbi - 在 Power BI 中显示为另一列的百分比
- python - 函数变量的范围
- javascript - 添加列表项的 URL 并将其添加为按钮的链接
- html - 垂直和水平居中对齐容器 div 内的图像和文本
- hibernate - 如何通过仅访问数据库一次来将对象列表存储在数据库中?
- swift - 当应用程序在 iOS12 中进入后台时,URLSessionDelegate 的 didWriteData 不会调用