powershell - PowerShell:迭代多个变量未按预期工作
问题描述
我正在尝试遍历一个数组$dailyTasks
以在列中查找“空白”即''
值,并将EmployeeName
另一个数组中的名称注入到这些空值中。
数组开始前的样子示例for loop
:
| Task | EmployeeName | EmployeeName2 |
|-------|--------------|---------------|
| Task1 | | |
| Task2 | Person Y | |
| Task3 | | |
| Task4 | Person Z | Person X |
这是我的 for 循环代码,会产生不希望的结果。$randomisedUsers
是一个对象[]
$randomisedUsers | Group-Object { $_ -in ($randomisedUsers | Select-Object -Last 2) } | ForEach-Object {
if ($_.Name -eq 'True') {
for ($i = 0; $i -lt $dailyTasks.Count; $i++) {
if ($dailyTasks[$i].Task -eq 'Task4') {
$dailyTasks[$i].EmployeeName = $_.Group.EmployeeName[0]
$dailyTasks[$i].EmployeeName2 = $_.Group.EmployeeName[1]
}
}
} else {
for ($i = 0; $i -lt $dailyTasks.Count; $i++) {
if ($dailyTasks[$i].EmployeeName -eq '') {
if ($_.Count -gt '1') {
for ($x = 0; $x -lt $_.Group.EmployeeName.Count; $x++) {
$dailyTasks[$i].EmployeeName = $_.Group.EmployeeName[$x]
}
} else {
$dailyTasks[$i].EmployeeName = $_.Group.EmployeeName
}
}
}
}
}
结果:
| Task | EmployeeName | EmployeeName2 |
|-------|--------------|---------------|
| Task1 | Person A | |
| Task2 | Person Y | |
| Task3 | Person A | |
| Task4 | Person Z | Person X |
这里的问题是它$_.Group.EmployeeName
包含两个对象,但无论出于何种原因,结果表都没有在数组中填充 Person B:
$_.Group.EmployeeName
{Person A, Person B}
在这种情况下,期望的结果是:
| Task | EmployeeName | EmployeeName2 |
|-------|--------------|---------------|
| Task1 | Person A | |
| Task2 | Person Y | |
| Task3 | Person B | |
| Task4 | Person Z | Person X |
我不完全确定我的 for 循环哪里出错了,我已经被困了一段时间......
TIA
解决方案
我个人会使用这样的东西:
$csv = @'
Task,EmployeeName,EmployeeName2
Task1,,
Task2,Person Y,
Task3,,
Task4,Person Z,Person X
'@ | ConvertFrom-Csv
$fillEmployees = [System.Collections.ArrayList]@(
'Person A'
'Person B'
)
foreach($line in $csv)
{
if([string]::IsNullOrWhiteSpace($line.EmployeeName))
{
$line.EmployeeName = $fillEmployees[0]
$fillEmployees.RemoveAt(0)
}
}
流程非常简单,如果循环在EmployeeName中找到一个值为 null 或有空格的值,它将用索引 0 替换该值,$fillEmployees
然后从列表中删除该索引 0。
很难说出您要使用代码完成什么,但是如果您有一个System.Array
填充了随机名称的类型的数组,这些名称将用于填充EmployeeName上的空值,您可以将其转换Array
为ArrayList
允许您使用.RemoveAt(..)
方法:
PS /> $fillEmployees = 0..10 | ForEach-Object {"Employee {0}" -f [char](Get-Random -Minimum 65 -Maximum 90)}
PS /> $fillEmployees
Employee J
Employee S
Employee D
Employee P
Employee O
Employee E
Employee M
Employee K
Employee R
Employee F
Employee A
PS /> $fillEmployees.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
尝试从 an 中删除项目Array
将导致以下结果:
PS /> $fillEmployees.RemoveAt(0)
Exception calling "RemoveAt" with "1" argument(s): "Collection was of a fixed size."
At line:1 char:1
...
...
但是,如果将其转换为ArrayList
(不是转换而是复制它):
PS /> $fillEmployees = [System.Collections.ArrayList]$fillEmployees
PS /> $fillEmployees.RemoveAt(0)
推荐阅读
- python - 电影评分 user_id 索引
- mysql - 选择一个值,该值是另一个 id 相等的表的最大值
- angular - 根据语言环境设置 html dir 属性
- php - 简单的 php cURL GET 请求根本不起作用
- java - 创建tasks[]任务数组
- spring - spring - oauth2 重定向到未知 url
- android - ContextThemeWrapper 无法在 DialogFragment 的水平位置强制转换为 android.app.Activity
- html - 主页翻译链接是静态的,不用于翻译所有页面
- batch-file - 如何批量添加数字变量前的 0
- swift - 仅在从 Firebase 数据库 Swift 下载所有内容后重新加载 TableView 数据