使用Powershell将文件上传到One Drive

时间:2014-09-25 22:15:13

标签: windows powershell powershell-v3.0 onedrive

我在下面使用PowerShell将文件上传到onedrive。 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)未找到错误。

2 个答案:

答案 0 :(得分:1)

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

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

  1. Register用于OAuth身份验证过程的OneDrive应用程序
  2. 致电OneDrive authentication API以获取访问令牌
  3. 使用访问令牌调用OneDrive API以上传文件
  4. 创建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. Simple item upload
    2. Resumable item upload
    3. Multipart item upload
    4. Upload from Url
    5. 如果你的目标文件不是太大,意味着文件的长度在100MB以内,我强烈建议你使用Simple item upload

      对于大文件,通常会调用Resumable item upload API

      这是一个大故事,您可以直接参考此upload file to OneDrive sample获取完整的脚本。

      希望你能摆脱这个问题。

答案 1 :(得分:0)

您无法将文件投放到OAuth端点...对所引用文章的快速扫描表明您应该使用看起来更像$ wlApiUri的$ Uri值。有关此类操作的URL方案的说明,请参阅http://msdn.microsoft.com/en-US/library/dn659726.aspx