function - 如何成功运行 2 个不同的 Powershell 脚本

标签 function powershell

我有两个不同的代码块。一个 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/

相关文章:

c++:将任意数量的参数传递给另一个函数

c++ - 将reinterpret_cast 指针传递为void *

powershell - 如何在正确访问 Windows 注册表的情况下在 WiX 中启动 PowerShell?

powershell - 分配给 $null 的对象属性不会为 $null 测试为真

c++ - 如何使这个函数递归

ruby - 如何在 Sinatra 中创建函数?

powershell - 如何使用Powershell 2.0将消息发布到ActiveMQ队列?

PowerShell ScriptBlock 变量范围

javascript 文档就绪函数

powershell - 如何在powershell中为windows进程重新启动docker?