繁体   English   中英

Powershell中具有阵列的多个ForEach

[英]Multiple ForEach with Arrays in Powershell

我正在尝试生成两个数据文件(每个文件第一个),并为每个文件生成一个文档(每个文件第二个)。 我可以很好地生成两个数据文件,但是,它会创建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++ }

好的,我已经将某些内容移到了循环之外,完全删除了一个循环,并将其更改为For循环。 这是正在发生的事情,以及我更改它的原因。

原始文件(简体):

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

因此,假设您要处理FileA.pdf和FileB.pdf,而temp.txt具有两行“ 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个pdf 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 

}

我添加了一些评论,以尝试使事情变得有意义。 让我知道这是否适合您,或者您对它的工作方式是否有任何具体疑问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM