在 Powershell 中处理作业
Working with jobs in Powershell
$contacts1 = Import-Csv "C:\temp\gal\gal1.csv"
Start-Job -Name Loop1 -ScriptBlock {
param([string[]]$contacts1)
foreach ($c1 in $contacts1){
$name = $c1.displayname
New-Item -Path "C:\Temp\GAL" -Name "$name" -ItemType "file"
}
} -ArgumentList (,$contacts1)
Wait-Job -Name Loop1 | Receive-Job
Get-Job -Name Loop1 | Remove-Job
以上是使用从 CSV 内部创建的名称创建一个文件,但接下来的三个循环只是尝试创建相同的名称。但是,如果我注释掉所有与作业有关的内容,如下所示,循环本身会成功创建具有正确名称的四个文件。
$contacts1 = Import-Csv "C:\temp\gal\gal1.csv"
#Start-Job -Name Loop1 -ScriptBlock {
#param([string[]]$contacts1)
foreach ($c1 in $contacts1){
$name = $c1.displayname
New-Item -Path "C:\Temp\GAL" -Name "$name" -ItemType "file"
}
#} -ArgumentList (,$contacts1)
#Wait-Job -Name Loop1 | Receive-Job
#Get-Job -Name Loop1 | Remove-Job
在第一个中,您使用字符串(将字符串数组传递给作业)。字符串没有显示名称 属性。第一个块可能会在严格模式下引发错误(Set-StrictMode -Version "latest")。您必须传递一个 objects 数组(具有显示名称 属性)才能正常工作。
第二个你使用 Import-CSV 制作的 objects。 Import-Csv 的 return 值取决于文件的内容。如果您使用 Export-Csv,该文件可能包含一个“#TYPE”行和一个 header 行。您的 header 之一可能是 "displayname"。
示例:
PS C:\> Get-ChildItem -Filter "windows" | Select-Object "FullName","Name" | Export-Csv -Path "c:\myfolder\test.csv"
PS C:\> Get-Content ".\myfolder\test.csv"
#TYPE Selected.System.IO.DirectoryInfo
"FullName","Name"
"C:\Windows","Windows"
PS C:\> Import-Csv -Path "C:\myfolder\test.csv"
FullName Name
-------- ----
C:\Windows Windows
PS C:\> (Import-Csv -Path "C:\myfolder\test.csv").fullname
C:\Windows
编辑:
这可能取决于 csv 的内容(未提供)。但是,如果您只更改参数类型,您的工作示例可能会起作用。像这样:
$contacts1 = Import-Csv "C:\temp\gal\gal1.csv"
Start-Job -Name Loop1 -ScriptBlock {
param([pscustomobject[]]$contacts1)
foreach ($c1 in $contacts1){
$name = $c1.displayname
New-Item -Path "C:\Temp\GAL" -Name "$name" -ItemType "file"
}
} -ArgumentList (,$contacts1)
Wait-Job -Name Loop1 | Receive-Job
Get-Job -Name Loop1 | Remove-Job
$contacts1 = Import-Csv "C:\temp\gal\gal1.csv"
Start-Job -Name Loop1 -ScriptBlock {
param([string[]]$contacts1)
foreach ($c1 in $contacts1){
$name = $c1.displayname
New-Item -Path "C:\Temp\GAL" -Name "$name" -ItemType "file"
}
} -ArgumentList (,$contacts1)
Wait-Job -Name Loop1 | Receive-Job
Get-Job -Name Loop1 | Remove-Job
以上是使用从 CSV 内部创建的名称创建一个文件,但接下来的三个循环只是尝试创建相同的名称。但是,如果我注释掉所有与作业有关的内容,如下所示,循环本身会成功创建具有正确名称的四个文件。
$contacts1 = Import-Csv "C:\temp\gal\gal1.csv"
#Start-Job -Name Loop1 -ScriptBlock {
#param([string[]]$contacts1)
foreach ($c1 in $contacts1){
$name = $c1.displayname
New-Item -Path "C:\Temp\GAL" -Name "$name" -ItemType "file"
}
#} -ArgumentList (,$contacts1)
#Wait-Job -Name Loop1 | Receive-Job
#Get-Job -Name Loop1 | Remove-Job
在第一个中,您使用字符串(将字符串数组传递给作业)。字符串没有显示名称 属性。第一个块可能会在严格模式下引发错误(Set-StrictMode -Version "latest")。您必须传递一个 objects 数组(具有显示名称 属性)才能正常工作。
第二个你使用 Import-CSV 制作的 objects。 Import-Csv 的 return 值取决于文件的内容。如果您使用 Export-Csv,该文件可能包含一个“#TYPE”行和一个 header 行。您的 header 之一可能是 "displayname"。
示例:
PS C:\> Get-ChildItem -Filter "windows" | Select-Object "FullName","Name" | Export-Csv -Path "c:\myfolder\test.csv"
PS C:\> Get-Content ".\myfolder\test.csv"
#TYPE Selected.System.IO.DirectoryInfo
"FullName","Name"
"C:\Windows","Windows"
PS C:\> Import-Csv -Path "C:\myfolder\test.csv"
FullName Name
-------- ----
C:\Windows Windows
PS C:\> (Import-Csv -Path "C:\myfolder\test.csv").fullname
C:\Windows
编辑:
这可能取决于 csv 的内容(未提供)。但是,如果您只更改参数类型,您的工作示例可能会起作用。像这样:
$contacts1 = Import-Csv "C:\temp\gal\gal1.csv"
Start-Job -Name Loop1 -ScriptBlock {
param([pscustomobject[]]$contacts1)
foreach ($c1 in $contacts1){
$name = $c1.displayname
New-Item -Path "C:\Temp\GAL" -Name "$name" -ItemType "file"
}
} -ArgumentList (,$contacts1)
Wait-Job -Name Loop1 | Receive-Job
Get-Job -Name Loop1 | Remove-Job