基于PowerShell的Azure功能输出到OneDrive

时间:2018-05-16 00:19:07

标签: powershell azure-functions

我有一个非常简单的“hello world”类型函数。在run.ps1

$request = Invoke-RestMethod http://ipinfo.io/json | Select -ExpandProperty ip
$out = "$env:TEMP\zhello.txt"
Set-Content -value $request -path $out
Out-File -Encoding ASCII $out

和function.json有这个:

{
  "type": "apiHubFile",
  "name": "outputFile",
  "path": "output_{file}",
  "connection": "onedrive_ONEDRIVE",
  "direction": "out"
}

它成功运行且没有错误,但该文件不在我的OneDrive中。还尝试使用Azure Blob Storage作为输出。我的代码出了什么问题?

2 个答案:

答案 0 :(得分:0)

看起来您的Out-File命令没有任何值写入$out文件路径。它可能正在删除由Set-Content创建的文件。

尝试发表评论Set-Content,然后改用$request | Out-File -Encoding ASCII $out

如果仍然无法解决问题,请确保您的第一行实际检索数据并将其分配给$request,就像您认为的那样。

修改

您也可以尝试将$out写入主机,以确保您确切知道它放置文件的位置。实现这些建议会呈现以下代码:

$request = "hello world"
$out = "$env:TEMP\zhello.txt"
Write-Host $out
$request | Out-File -Encoding ASCII $out

这会为我生成预期的文件。

如果仍然无效,请通过尝试"hello world 2" > "$env:TEMP\zhello.txt"

之类的内容确认您有权写入该文件位置

答案 1 :(得分:0)

我发现以下帖子有助于回答我原来的问题:Outputting a file with an Azure Function

我的 run.ps1 现在看起来像这样:

$request = "hello world"
$filename = "$env:TEMP\zhello.txt"
$request | Out-File  $filename
$base64string = [Convert]::ToBase64String([IO.File]::ReadAllBytes($filename))

$response = ConvertTo-JSON @{
    Body=$base64string;
    Headers=@{
    # unfortunately it seems functions does not support 'filename=...'
    'Content-Disposition'='attachment'; 
    # you would use application/octet-stream, but because it's converted to JSON you lose binary content
    'Content-Type'='text/plain';        
    };
}
Out-File -Encoding Ascii -FilePath $outputFile -inputObject $response

文件确实放入我的OneDrive,但它的内容只是这个

{
    "Headers":  {
                    "Content-Type":  "text/plain",
                    "Content-Disposition":  "attachment"
                },
    "Body":  "//5oAGUAbABsAG8AIAB3AG8AcgBsAGQADQAKAA=="
}

现在我可以使用“Body”并在本地创建文件:

$encodedText = "//5oAGUAbABsAG8AIAB3AG8AcgBsAGQADQAKAA=="
$Content = [System.Convert]::FromBase64String($encodedText)
Set-Content -Path $env:temp\my-file.txt -Value $Content -Encoding Byte

但这违背了该功能的目的,我不妨在本地运行所有内容,因为我需要在本地运行这个“解码”代码段。

编辑:

经过一些测试后,我发现之前我无法输出文件的主要原因是我的function.json使用默认值{file}。一旦我将其硬编码为“zhello.txt”,我就在OneDrive中获得了该文件,其中包含$ response指定的内容。不过,我需要找出一种动态指定outputFile名称的方法(在我的run.ps1中)。