Выход из функции Azure на основе PowerShell в OneDrive - PullRequest
0 голосов
/ 16 мая 2018

У меня есть очень простая функция типа "привет мир".В файле 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.Также попытался использовать хранилище BLOB-объектов Azure в качестве вывода.Что не так с моим кодом?

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Я нашел следующий пост, который помогает ответить на мой первоначальный вопрос: Вывод файла с функцией Azure

Мой 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=="
}

Теперь я могу взять это "тело" и создать файл из него локально:

$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).

0 голосов
/ 16 мая 2018

Похоже, ваша команда 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"

...