我正在尝试生成两个数据文件(每个文件首先生成)并为每个文件生成一个文档(每个文件第二个)。我可以很好地生成两个数据文件,但是,它会创建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++ }
答案 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
}
我添加了一些评论,试图帮助理解事物。如果这对你有用,或者你对它是如何运作有任何具体问题,请告诉我。