2017-05-25 7 views
0

Ich versuche, eine Azure-Funktion zu erstellen, die PowerShell mit einem Speicherwarteschlangen-Trigger ausführt. Zu Testzwecken möchte ich, dass diese Funktion eine Datei in meinem OneDrive for Business-Konto bearbeitet. Um die Datei unter aapdftoimage/ThreePages.pdf zu aapdftoimage/output_ThreePages.pdf zu kopieren.Azure-Funktion mit PowerShell, Speicherwarteschlangen-Trigger und OneDrive for Business

Wenn OneDrive for Business als Eingabe integriert ist, erhalte ich Fehler, wenn die Funktion durch eine neue Nachricht in der Warteschlange ausgelöst wird. Wenn ich OneDrive als Eingabe abbringe, erhalte ich keine Fehler und $triggerInput enthält die Nachricht.

Die Fehler sind:

2017-05-25T22:24:38.484 Function started (Id=a0c37fdf-ed3c-473c-9c79-236d63531e7e) 
2017-05-25T22:24:38.499 Function completed (Failure, Id=a0c37fdf-ed3c-473c-9c79-236d63531e7e, Duration=1ms) 
2017-05-25T22:24:38.562 Exception while executing function: Functions.QueueTriggerPowerShell1. Microsoft.Azure.WebJobs.Host: No value for named parameter 'file'. 

Hier ist meine Powershell:

$inData = Get-Content $triggerInput 
$inFile = Get-Content $inputFile 

Write-Output "PowerShell script processed queue message '$inData'" 
Write-Output "inFile: $inFile" 

hier function.json:

{ 
    "bindings": [ 
    { 
     "name": "triggerInput", 
     "type": "queueTrigger", 
     "direction": "in", 
     "queueName": "samples-powershell-pdftoimage", 
     "connection": "<storageaccount>_STORAGE" 
    }, 
    { 
     "type": "apiHubFile", 
     "name": "inputFile", 
     "path": "aapdftoimage/{file}", 
     "connection": "onedriveforbusiness1_ONEDRIVEFORBUSINESS", 
     "direction": "in" 
    } 
    ], 
    "disabled": false 
} 

Als ich dies schreibe, denke ich, ein Teil meiner Verwirrung ist über die Integration von OneDrive for Business für die Eingabe und Ausgabe (nicht in meinem Test verbunden).

Ich weiß was $triggerInput ist. Es ist der Inhalt der Nachricht. Aber was ist $inputFile? Und woher kommt {file}?

Ich dachte, vielleicht würde ich folgendes tun, aber es funktioniert auch nicht (gleiche Fehler):

$file = Get-Content $triggerInput 

Ich dachte, das $inputFile als „aapdftoimage/$ file“ definieren könnte, aber es tut nichts von der Sortieren.

Unnötig zu sagen, ich bin im Stillstand. Kann mir jemand eine Anleitung geben und mich aufrichten?

Antwort

2

@Henry Hamid Safi ist richtig. Mit C# können Sie das Binder-Objekt verwenden, um die Datei dynamisch zu benennen.

In Ihrem Anwendungsfall besteht die einzige Möglichkeit, den Namen der Datei dynamisch anzugeben, darin, sie als JSON-Objekt in Ihrer Trigger-Nutzlast zu übergeben. Hier ist eine Beispielkonfiguration, die für mich funktioniert hat.

function.json:

{ 
    "bindings": [ 
    { 
     "name": "triggerInput", 
     "type": "queueTrigger", 
     "direction": "in", 
     "queueName": "samples-powershell", 
     "connection": "AzureWebJobsStorage" 
    }, 
    { 
     "type": "apiHubFile", 
     "name": "inputFile", 
     "path": "aapdftoimage/{file}", 
     "connection": "onedriveforbusiness_ONEDRIVEFORBUSINESS", 
     "direction": "in" 
    }, 
    { 
     "type": "apiHubFile", 
     "name": "outputFile", 
     "path": "aapdftoimage/output_{file}", 
     "connection": "onedriveforbusiness_ONEDRIVEFORBUSINESS", 
     "direction": "out" 
    } 
    ], 
    "disabled": false 
} 

laufen.ps1:

$in = Get-Content $triggerInput 
Write-Output "PowerShell script processed queue message '$in'" 
Copy-Item $inputFile $outputFile 

Anfrage Körper (wenn Prüfscheibe in Portals) oder Queue-Trigger Nutzlast:

{ 
    "file":"ThreePages.pdf" 
} 

Log-Einträge:

2017-05-26T22:27:53.984 Function started (Id=032c4469-8378-44ce-af9e-5a941afb0d82) 
2017-05-26T22:27:54.875 PowerShell script processed queue message '{ "file":"ThreePages.pdf" }' 
2017-05-26T22:27:54.891 Function completed (Success, Id=032c4469-8378-44ce-af9e-5a941afb0d82, Duration=899ms) 

Microsoft Onedrive Ordner Bildschirm Schuss: enter image description here

+0

Vielen Dank! Es funktioniert! Ich denke, das ist eine Menge Magie. Viele Dinge passieren automatisch. Ich würde lieber den Inhalt explizit abrufen, von JSON konvertieren, zu {file} zuweisen und dann wissen, was inputFile und outputFile sind. – Chris76786777

+0

Ja, Ihre Beobachtung ist richtig. Es ist in diesem Stadium eine bekannte Einschränkung, dass Sie {Datei} nicht innerhalb Ihres Codes zuweisen können. Dies gilt für alle Sprachen, die in Azure-Funktionen unterstützt werden, die sich im experimentellen Stadium befinden. Wir planen, dies in zukünftigen Releases anzugehen, aber es gibt derzeit keine ETA. –

+0

Das ist großartig. Froh das zu hören. – Chris76786777

1

Arbeitsbeispiel

Function.json:

{ 
    "bindings": [ 
    { 
     "name": "triggerInput", 
     "type": "queueTrigger", 
     "direction": "in", 
     "queueName": "test", 
     "connection": "AzureWebJobsDashboard" 
    }, 
    { 
     "type": "apiHubFile", 
     "name": "inputFile", 
     "path": "aapdftoimage/ThreePages.pdf", 
     "connection": "onedrive_ONEDRIVE", 
     "direction": "in" 
    }, 
    { 
     "type": "apiHubFile", 
     "name": "outputFile", 
     "path": "aapdftoimage/output_ThreePages.pdf", 
     "connection": "onedrive_ONEDRIVE", 
     "direction": "out" 
    } 
    ], 
    "disabled": false 
} 

run.ps1:

$in = Get-Content $triggerInput 
Write-Output "PowerShell script processed queue message '$in'" 

Copy-Item $inputFile $outputFile 
+0

Vielen Dank für Ihre Antwort. In function.json haben Sie die Datei angegeben, die verschoben werden soll. Ist das nicht dynamisch möglich? – Chris76786777

+0

Hier ist ein Beispiel für etwas ähnliches mit C#: https://stackoverflow.com/questions/43348985/dynamic-output-file-name-of-apihubfile-azure-function-binding-one-drive-drop-b –

Verwandte Themen