Powershell中带有数组的多个ForEach

时间:2018-04-26 16:11:57

标签: arrays powershell foreach

我正在尝试生成两个数据文件(每个文件首先生成)并为每个文件生成一个文档(每个文件第二个)。我可以很好地生成两个数据文件,但是,它会创建2个文档并将其分配给每个文件。我只需要将一个文档分配给一个文件,然后将另一个文档分配给另一个文件。我一直在努力,并且没有能够提出解决方案(新手开发者)。我该怎么做才能做到这一点?

$filepath="C:\files\pdf\"
$data_files = Get-ChildItem $filepath
$filesss=$data_files | Write-Output

$Data2= $filesss -split "`n"
$i2=0
$var=@()

$gravy= Get-Content "C:\files\temp.txt"
$ia=0
$data44=@()


foreach  ($item2 in $Data2)
         {

          $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
          $headers.Add("Accept", 'application/pdf')

          $fileName="C:\files\pdf\$item2"
          $fileContent = get-content -Raw $fileName
          $fileContentBytes = [System.Text.Encoding]::Default.GetBytes($fileContent)
          $fileContentEncoded = [System.Convert]::ToBase64String($fileContentBytes)



foreach($id in $gravy){

                        $data44= ConvertTo-Json @{
                             encrypted="false";
                             allowSaveBinaryData="true";
                             binaryData="$fileContentEncoded"
                             divider="Expense Report";
                             extension="pdf";
                             name="$fileContentEncoded";
                             relProjectId="31";
                            }

           $var2[$i2]="https://XXXXXXX.com/v4/documents/$id/?guid=$AUTHtemp&fbsite=https://API/"

           Invoke-RestMethod -headers $headers -ContentType 'application/json' -Method PUT -body $data44 -Uri $var2 

           $ia++
                       }
$i2++ }

1 个答案:

答案 0 :(得分:1)

好的,我已经在你的循环之外移动了一些东西,完全删除了一个循环,并将其更改为For循环。这是发生了什么,以及为什么我改变它。

原创(简化):

ForEach($file in $files){
    <load file>
    ForEach($id in temp.txt){
        <Generate a document>
    }
}

所以假设您要处理FileA.pdf和FileB.pdf,而temp.txt有2行“ID1”和“ID2”。实际内容并不重要,行数更重要。

因此外循环开始,并加载FileA.pdf的数据 然后内循环启动,获取FileA.pdf的数据,并使用'ID1'来创建文件 用temp.txt中的第一项完成,它移动到下一个(它是一个循环,这就是循环所做的)。它获取FileA.pdf的数据,并使用“ID2”来创建文件 内部循环已完成temp.txt中的所有内容,因此我们现在返回外部循环 外部循环现在加载FileB.pdf的数据 然后内部循环再次启动,获取FileB.pdf的数据,并使用“ID1”创建文件。
内部循环移动到temp.txt中的下一个项目,使用FileB.pdf中的数据,并使用“ID2”生成另一个文件。
内循环完成,回到外循环,它也完成,脚本完成。

问题是内部循环处理外部循环的每次迭代的temp.txt中的所有内容,因此temp.txt中有2个pdfs x 2个ID = 4个文件总数。

现在,使用For循环,我们使用一个数字,根据temp.txt中有多少项,并使用该数字迭代文档列表和ID。这是我写的:

#Define the path to PDF files
$filepath="C:\files\pdf"
#Get list of PDF files
$data_files = Get-ChildItem $filepath
#Import the gravy! MMmm... gravy
$gravy= Get-Content "C:\files\temp.txt"

#Setup variables that won't change per file
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Accept", 'application/pdf')
$data44=@{}

#Loop through items in the gravy file, and load 1 pdf per item
for ($i = 0; $i -lt $gravy.count; $i++)
{
    #Get raw string data from PDF file
    $fileContent = get-content -Raw $data_files[$i].FullName
    #Convert the raw data to bytes
    $fileContentBytes = [System.Text.Encoding]::Default.GetBytes($fileContent)
    #Encode the bytes as a Base64String for uploading
    $fileContentEncoded = [System.Convert]::ToBase64String($fileContentBytes)

    #Get the id to use for this file
    $id = $gravy[$i]

    #Prep body to POST ...seriously though, you set the name to be the Base64 encoded string? Do you use binary in casual conversation as well?
    $data44= ConvertTo-Json @{
        encrypted="false";
        allowSaveBinaryData="true";
        binaryData="$fileContentEncoded"
        divider="Expense Report";
        extension="pdf";
        name="$fileContentEncoded";
        relProjectId="31";
    }

    #Define the URI to POST to
    $var2="https://XXXXXXX.com/v4/documents/$id/?guid=$AUTHtemp&fbsite=https://API/"

    #Post the data to the REST API
    Invoke-RestMethod -headers $headers -ContentType 'application/json' -Method PUT -body $data44 -Uri $var2 

}

我添加了一些评论,试图帮助理解事物。如果这对你有用,或者你对它是如何运作有任何具体问题,请告诉我。