我有两个不同的代码块。一个 block 针对一个端点运行,另一个 block 针对不同的端点运行。如果它们单独运行,则运行良好。但我需要让它们在一个文件中的另一个之后成功运行。有人能帮助我吗?
第一个 block :
[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls"
$url = "https://FIRSTENDPOINT.com/Integration-Server/XXXXXXIntegrations?requestJobDescription={""type"":""file"",""credentials"":{""partnerUserID"":""XXXXX"",""partnerUserSecret"":""XXXXXX""},""onReceive"":{""immediateResponse"":[""returnRandomFileName""]},""inputSettings"":{""type"":""combinedReportData"",""filters"":{""startDate"":""2018-01-01""}},""outputSettings"":{""fileExtension"":""pdf"",""includeFullPageReceiptsPdf"":""False"",""fileBasename"":""ExpenseReimbursementReport""}}"
$template = '<#if addHeader == true>
Employee Name, Amount, Status, Report Date, Employee Email, Report ID<#lt>
</#if>
<#list reports as report>
<#setting date_format="MM/dd/yyyy">
<#setting locale="en_US">
<#assign total = report.total/100>
${report.submitter.fullName},<#t>
${total},<#t>
${report.status},<#t>
${report.submitted?date("yyyy-MM-dd HH:mm:ss")},<#t>
${report.accountEmail},<#t>
${report.reportID}<#lt>
</#list>'
$encode = [System.Web.HttpUtility]::UrlEncode($template)
Invoke-RestMethod -ContentType 'application/json' -Method Post -Uri $url'&template='$encode -OutVariable temp
$Data=$temp.split(",")
$var= @{}
$i=0
foreach ($item in $Data)
{$var[$i] = "https://XXXXX.com/Integration-Server/XXXXIntegrations?requestJobDescription={""type"":""download"",""credentials"":{""partnerUserID"":""XXXXX"",""partnerUserSecret"":""XXXXXX""},""fileName"":"+$item+"}"
$output = "C:\files\$item"
Invoke-RestMethod -ContentType 'application/json' -Method Post -Uri $var[$i] -Outfile $output
$i++
第二 block :
[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls"
$obj = New-Object psobject
$obj | Add-Member -MemberType NoteProperty -Name "username" -Value "XXXXX"
$obj | Add-Member -MemberType NoteProperty -Name "password" -Value "XXXXX"
$body = ConvertTo-Json -InputObject $obj
$login="https://2ndENDPOINT.com/v4/login?fbsite=https://XXXXX.com/"
Invoke-RestMethod -ContentType 'application/json' -Method Post -Body $body -Uri $login -OutVariable AUTHtemp
$filepath="C:\files\"
$data_files = Get-ChildItem $Folder_file_path
$filesss=$data_files | Write-Output
$Data2= $filesss -split "`n"
$var2= @{}
$i2=0
foreach ($item2 in $Data2)
{
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Accept", 'application/pdf')
$fileName="C:\files\$item2"
$fileContent = get-content -Raw $fileName
$fileContentBytes = [System.Text.Encoding]::Default.GetBytes($fileContent)
$fileContentEncoded = [System.Convert]::ToBase64String($fileContentBytes)
$data = ConvertTo-Json @{
encrypted="false";
allowSaveBinaryData="true";
binaryData="$fileContentEncoded"
divider="Expense Report";
extension="pdf";
name="$fileContentEncoded";
relProjectId="31";
fileID="597"
}
$var2[$i2]="https://XXXXXX.com/v4/documents/597?guid=$AUTHtemp&fbsite=https://XXXXXX.com/"
Invoke-RestMethod -headers $headers -ContentType 'application/json' -Method PUT -body $data -Uri $var2[$i2]}
$i2++
编辑:
当我尝试在同一个文件中运行它们时,无论是作为一个 block 还是作为函数,都会引发大量错误。在第 12 个错误之后我不得不停止它,因为它每次都会不断创建空文件并抛出错误:
get-content : Cannot find path 'C:\files\Box Sync' because it does not exist.
At C:\Users\USER\Documents\ExpenseReimbursement_Powershell\Expense_GetReports.ps1:65 char:16
+ $fileContent = get-content -Raw $fileName
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\files\Box Sync:String) [Get-Content], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand
Exception calling "GetBytes" with "1" argument(s): "Array cannot be null.
Parameter name: chars"
At C:\Users\USER\Documents\ExpenseReimbursement_Powershell\Expense_GetReports.ps1:66 char:1
+ $fileContentBytes = [System.Text.Encoding]::Default.GetBytes($fileCon ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ArgumentNullException
Exception calling "ToBase64String" with "1" argument(s): "Value cannot be null.
Parameter name: inArray"
At C:\Users\USERNAME\Documents\ExpenseReimbursement_Powershell\Expense_GetReports.ps1:67 char:1
+ $fileContentEncoded = [System.Convert]::ToBase64String($fileContentBy ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ArgumentNullException
最佳答案
最直接的方法是将整个第二个代码块放在第一个代码块之后,放在同一个文件中。
此时程序会自然地从第一个流到第二个。
但是由于每个 block 似乎都代表一个特定的操作,因此这可能是一个将每个 block 放入一个函数中对其进行封装的好机会。
这还允许您将代码转变为一种"template",因为您可以将可能更改的值作为参数传递,然后您将获得一组很好的可重用操作,您可以将其作为一个整体调用。我暂时不会讨论这个问题,但这是值得考虑的事情。
我不完全确定你的第一个 block 应该做什么(作为高级操作),但我将猜测并将其描述为“集成后结果”,所以我将调用此函数Register-IntegrationResult
(这遵循 PowerShell Verb-Noun
命名约定,使用经过批准的动词和单数名词,但您可以为该函数命名任何您想要的名称):
function Register-IntegrationResult {
[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls"
$url = "https://FIRSTENDPOINT.com/Integration-Server/XXXXXXIntegrations?requestJobDescription={""type"":""file"",""credentials"":{""partnerUserID"":""XXXXX"",""partnerUserSecret"":""XXXXXX""},""onReceive"":{""immediateResponse"":[""returnRandomFileName""]},""inputSettings"":{""type"":""combinedReportData"",""filters"":{""startDate"":""2018-01-01""}},""outputSettings"":{""fileExtension"":""pdf"",""includeFullPageReceiptsPdf"":""False"",""fileBasename"":""ExpenseReimbursementReport""}}"
$template = '<#if addHeader == true>
Employee Name, Amount, Status, Report Date, Employee Email, Report ID<#lt>
</#if>
<#list reports as report>
<#setting date_format="MM/dd/yyyy">
<#setting locale="en_US">
<#assign total = report.total/100>
${report.submitter.fullName},<#t>
${total},<#t>
${report.status},<#t>
${report.submitted?date("yyyy-MM-dd HH:mm:ss")},<#t>
${report.accountEmail},<#t>
${report.reportID}<#lt>
</#list>'
$encode = [System.Web.HttpUtility]::UrlEncode($template)
Invoke-RestMethod -ContentType 'application/json' -Method Post -Uri $url'&template='$encode -OutVariable temp
$Data=$temp.split(",")
$var= @{}
$i=0
foreach ($item in $Data)
{
$var[$i] = "https://XXXXX.com/Integration-Server/XXXXIntegrations?requestJobDescription={""type"":""download"",""credentials"":{""partnerUserID"":""XXXXX"",""partnerUserSecret"":""XXXXXX""},""fileName"":"+$item+"}"
$output = "C:\files\$item"
Invoke-RestMethod -ContentType 'application/json' -Method Post -Uri $var[$i] -Outfile $output
$i++
}
}
与第二个 block 类似,我不知道它在做什么,但我猜它正在上传某种报告,所以我将其称为Send-ImportantReport
:
function Send-ImportantReport {
[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls"
$obj = New-Object psobject
$obj | Add-Member -MemberType NoteProperty -Name "username" -Value "XXXXX"
$obj | Add-Member -MemberType NoteProperty -Name "password" -Value "XXXXX"
$body = ConvertTo-Json -InputObject $obj
$login="https://2ndENDPOINT.com/v4/login?fbsite=https://XXXXX.com/"
Invoke-RestMethod -ContentType 'application/json' -Method Post -Body $body -Uri $login -OutVariable AUTHtemp
$filepath="C:\files\"
$data_files = Get-ChildItem $Folder_file_path
$filesss=$data_files | Write-Output
$Data2= $filesss -split "`n"
$var2= @{}
$i2=0
foreach ($item2 in $Data2)
{
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Accept", 'application/pdf')
$fileName="C:\files\$item2"
$fileContent = get-content -Raw $fileName
$fileContentBytes = [System.Text.Encoding]::Default.GetBytes($fileContent)
$fileContentEncoded = [System.Convert]::ToBase64String($fileContentBytes)
$data = ConvertTo-Json @{
encrypted="false";
allowSaveBinaryData="true";
binaryData="$fileContentEncoded"
divider="Expense Report";
extension="pdf";
name="$fileContentEncoded";
relProjectId="31";
fileID="597"
}
}
}
那么这有什么意义呢?现在,当您想要一个接一个地调用时,您的代码如下所示:
Register-IntegrationResult
Send-ImportantReport
如果您需要多次执行这些操作,只需叫出名字即可。
作为 future 的更改,您可能需要添加参数,这样可以传入可以更改的部分,例如凭据、URL 或本地文件路径。然后您的调用可能如下所示:
Register-IntegrationResult -JobID 1234
Send-ImportantReport -Path C:\Reports
关于function - 如何成功运行 2 个不同的 Powershell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49844395/