在Powershell中处理工作

时间:2017-05-26 12:00:31

标签: powershell jobs

 $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

1 个答案:

答案 0 :(得分:2)

在第一个中使用字符串(将字符串数组传递给作业)。字符串没有displayname属性。第一个块可能会引发严格模式的错误(Set-StrictMode -Version“latest”)。您必须传递一组对象(具有displayname属性)才能使其正常工作。

在第二步中,您使用Import-CSV生成的对象。 Import-Csv的返回值取决于文件的内容。如果您使用Export-Csv,该文件可能包含“#TYPE”行和标题行。你的一个标题可能是“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