使用Powershell将文件上载到One Drive



下面我将使用powershell将文件上传到一个驱动器。http://www.powershellmagazine.com/2014/04/07/using-the-windows-live-apis-from-powershell/

Invoke-RestMethod -Uri $Uri -Method Put -InFile $Path

其中是文件的完整路径

$Path= "C:SkyDrive/ServerBackups/Webs/Webs/test.txt"

以及$Uri = "https://login.live.com/oauth20_desktop.srf?code=XXXXXX

引发(404)未找到错误。

Invoke-RestMethod中使用的$Uri值错误。您在脚本中使用的OAuth终结点用于身份验证,而不是OneDrive操作。

关于如何将文件上传到OneDrive,这可以分为三部分。

  1. 为OAuth身份验证过程注册OneDrive应用程序
  2. 调用OneDrive身份验证API获取访问令牌
  3. 使用访问令牌调用OneDrive API以便上载文件

创建OneDrive应用程序后,如果应用程序为web类型,则可以获得应用程序Id密钥重定向Uri。然后使用下面带有三个值的脚本。

# get authorize code
Function Get-AuthroizeCode
{
    [CmdletBinding()]
    Param
    (
        [Parameter(Mandatory=$true)][String]$ClientId,
        [Parameter(Mandatory=$true)][String]$RedirectURI
    )
    # the login url
    $loginUrl = "https://login.live.com/oauth20_authorize.srf?client_id=$ClientId&scope=onedrive.readwrite offline_access&response_type=code&redirect_uri=$RedirectURI";
    # open ie to do authentication
    $ie = New-Object -ComObject "InternetExplorer.Application"
    $ie.Navigate2($loginUrl) | Out-Null
    $ie.Visible = $True
    While($ie.Busy -Or -Not $ie.LocationURL.StartsWith($RedirectURI)) {
        Start-Sleep -Milliseconds 500
    }
    # get authorizeCode
    $authorizeCode = $ie.LocationURL.SubString($ie.LocationURL.IndexOf("=") + 1).Trim();
    $ie.Quit() | Out-Null
    RETURN $authorizeCode
}
# get access token and refresh token
Function New-AccessTokenAndRefreshToken
{
    [CmdletBinding()]
    Param
    (
        [Parameter(Mandatory=$true)][String]$ClientId,
        [Parameter(Mandatory=$true)][String]$RedirectURI,
        [Parameter(Mandatory=$true)][String]$SecrectKey
    )
    # get authorize code firstly
    $AuthorizeCode = Get-AuthroizeCode -ClientId $ClientId -RedirectURI $RedirectURI
    $redeemURI = "https://login.live.com/oauth20_token.srf"
    $header = @{"Content-Type"="application/x-www-form-urlencoded"}
    $postBody = "client_id=$ClientId&redirect_uri=$RedirectURI&client_secret=$SecrectKey&code=$AuthorizeCode&grant_type=authorization_code"
    $response = Invoke-RestMethod -Headers $header -Method Post -Uri $redeemURI -Body $postBody
    $AccessRefreshToken = New-Object PSObject
    $AccessRefreshToken | Add-Member -Type NoteProperty -Name AccessToken -Value $response.access_token
    $AccessRefreshToken | Add-Member -Type NoteProperty -Name RefreshToken -Value $response.refresh_token
    RETURN $AccessRefreshToken
}

然后你得到你的有效访问令牌,你可以为Invoke-RestMethod 构建有效的头

# get autheticate header
Function Get-AuthenticateHeader
{
    [CmdletBinding()]
    Param
    (
        [Parameter(Mandatory=$true)][String]$AccessToken
    )
    RETURN @{"Authorization" = "bearer $AccessToken"}
}

最后,您可以使用upload-rest-api将头传递给Invoke-RestMethod

有四个不同的OneDrive上传休息Api你可以调用。

  1. 简单项目上传
  2. 可恢复项目上传
  3. 多部分项目上传
  4. 从Url上载

如果你的目标文件不是太大,意味着文件的长度在100MB以内,我强烈建议使用简单项目上传。

对于大文件,通常调用可恢复项目上传API

这是一个大故事,你可以直接参考这个上传文件到OneDrive的示例来获得完整的脚本。

希望你能解决这个问题。

您不能将文件放入OAuth端点。。。快速扫描引用的文章表明,您应该使用看起来更像$wlApiUri的$Uri值。看见http://msdn.microsoft.com/en-US/library/dn659726.aspx用于描述这种操作的URL方案。

相关内容

  • 没有找到相关文章

最新更新