public/New-OneShortcut.ps1
function New-OneShortcut { [CmdletBinding(SupportsShouldProcess)] Param( [Parameter(Mandatory = $true)] [string] $SiteUrl, [Parameter(Mandatory = $true)] [string] $DocumentLibraryName, [Parameter(Mandatory = $false)] [string] $FolderPath, [Parameter(Mandatory = $true)] [string] $ShortcutName, [Parameter(Mandatory = $true)] [string] $UserPrincipalName ) begin { Write-Verbose "[$(Get-Date)] [BEGIN ] $($MyInvocation.MyCommand)" Write-Verbose "[$(Get-Date)] [CALL ] Test-OneConnection()" if (!(Test-OneConnection)) { Write-Error "[$(Get-Date)] [ERROR ] No connection established. Please use Connect-OneShortcut to create a session." -ErrorAction Stop } } process { Write-Verbose "[$(Get-Date)] [CALL ] Get-OneSite($($SiteUrl))" $Site = (Get-OneSite -SiteUrl $SiteUrl) if ($Site.Response.StatusCode -eq "200") { Write-Verbose "[$(Get-Date)] [CALL ] Get-OneList($($Site.Data.sharepointIds.siteId), $($DocumentLibraryName))" $List = (Get-OneList -SiteId $Site.Data.sharepointIds.siteId -DocumentLibraryName $DocumentLibraryName) if ($List.Response.StatusCode -eq "200") { Write-Verbose "[$(Get-Date)] [CALL ] Get-OneListItem($($Site.Data.sharepointIds.siteId), $($List.id), $($FolderPath))" $UniqueItemId = "root" if ($FolderPath) { Write-Verbose "[$(Get-Date)] [CALL ] Get-OneListItem($($Site.Data.sharepointIds.siteId), $($List.Data.id), $($FolderPath))" $ListItem = (Get-OneListItem -SiteId $Site.Data.sharepointIds.siteId -DocumentLibraryId $List.Data.id -FolderPath $FolderPath) if ($ListItem.Response.StatusCode -eq "200") { $UniqueItemIdSearch = (Select-String "[\da-zA-Z]{8}-([\da-zA-Z]{4}-){3}[\da-zA-Z]{12}" -InputObject $ListItem.Data.eTag) if ($UniqueItemIdSearch.Matches.Count -gt 0) { $UniqueItemId = $UniqueItemIdSearch.Matches[0].Value } } else { return $ListItem } } $ApiRequestBody = @{ name = $ShortcutName remoteItem = @{ sharepointIds = @{ listId = $List.Data.id listItemUniqueId = $UniqueItemId siteId = $Site.Data.sharepointIds.siteId siteUrl = $SiteUrl webId = $Site.Data.sharepointIds.webId } } '@microsoft.graph.conflictBehavior' = "rename" } $ApiRequest = @{ ApiResource = "drives/$($UserPrincipalName)/root/children" ApiRequestMethod = [Microsoft.PowerShell.Commands.WebRequestMethod]::Post ApiRequestBody = ($ApiRequestBody | ConvertTo-Json) } if ($PSCmdlet.ShouldProcess("$($UserPrincipalName)'s OneDrive", "Creating shortcut '$($ShortcutName)'")) { Write-Verbose "[$(Get-Date)] [CALL ] Invoke-OneApiRequest($($ApiRequest.ApiResource), $($ApiRequest.ApiRequestMethod), $($ApiRequest.ApiRequestBody))" $Shortcut = (Invoke-OneApiRequest @ApiRequest) return $Shortcut } } else { return $List } } else { return $Site } } end { Write-Verbose "[$(Get-Date)] [END ] $($MyInvocation.MyCommand)" } } |