Hromadné vytváření zástupců (linků) v Sharepoint Online

Dostal se mi do rukou zajímavý úkol: „Uklidili jsme si data na Sharepointu a potřebujeme, aby v původních složkách byl vždy odkaz do nového umístění. Tady máte tabulku, kam umístit odkazy a kam mají byý nasměrovány“.

Takže jsem připravil skript, který si vezme CSV soubor a v něm jsou 2 sloupce obsahující data:

  • LinkSavePath – kam link uložit a jak se bude jmenovat
    Příklad: Shared Documents/Nabidky/rok 2021\APRIL-MAJ 2021\klient\Odkaz na produkty.url
  • TargetPath – kam bude link odkazovat
    Příklad: https://firma.sharepoint.com/sites/SharepointSite/Shared Documents/Archiv/Klienti/rok 2021\Produkty

Toto CSV načítám a vytvářím zástupce dle hotnot, které jsou obsaženy v CSV.

Pro vytvoření linku v Sharepointu je potřeba dodat 3 informace

  • $filename – název odkazu [odkaz.url]
  • $folderName – kde bude odkaz uložen
  • $URL – kam bude odkaz směřovat

K vytváření odkazů použijeme knihovu PnP.PowerShell. Samotný odkaz se vytváří, stejně jako jakýkoliv jiný soubor pomocí příkazu Add-PnPFile.

$stream = [IO.MemoryStream]::new([Text.Encoding]::UTF8.GetBytes("[InternetShortcut]URL=https://www.sraga.c"))
Add-PnPFile -FileName "odkaz.url" -Folder "Shared Documents/CilovaSlozka" -Stream $stream -Values @{_ShortcutUrl="https://www.sraga.cz"}

Výsledný skript tedy vypadá takto:

$SiteURL = "https://firma.sharepoint.com/sites/SharepointSite/"

# Pripojeni k Sharepoint Site
Connect-PnPOnline -Url $SiteURL  -Interactive

# soubor se vstupnimi daty, kodovani UTF8, data oddelena strednikem
$CSVFile = "C:\Temp\Import\shortcuts-utf8bom.csv"

# Ziskani dat z CSV
$CSVData = Import-CSV $CSVFile -Delimiter ";"
$Counter = 1

# Cyklus pro zpracovani dat
ForEach($Row in $CSVData)
{
    
    Write-Host "Soubor $($Row.LinkSavePath) - $Counter of $($CSVData.Count)"
    Write-Host -ForegroundColor Yellow " "$($Row.TargetPath)
    
    # ziskani nazvu slozky
    $folderName = Split-Path -Path $($Row.LinkSavePath) -parent
    
    # ziskani nazvu souboru
    $fileName = Split-Path -Path $($Row.LinkSavePath) -Leaf
    
    Write-Host -ForegroundColor Blue $folderName
    Write-Host -ForegroundColor Blue $fileName
    
    # Cil, kam se shortcut odkazuje musi byt URL Encoded
    $URLEncodedTemp = [URI]::EscapeUriString($($Row.TargetPath))
    
    # Osetrni mezery 
    $URLEncoded = $URLEncodedTemp.replace('%2520','%20')
    
    $stream = [IO.MemoryStream]::new([Text.Encoding]::UTF8.GetBytes("[InternetShortcut]URL=$URLEncoded"))
    
    # Vytvoreni shortcut
    Add-PnPFile -FileName $fileName -Folder $folderName -Stream $stream -Values @{_ShortcutUrl="$URLEncoded"}

    $Counter++
}

# Odpojeni PnP
Disconnect-PnPOnline

Ve výše uvedeném skriptu je pár maličkostí, které jsem musel ošetřit „nestandardní cestou“

Ze sloupce TargetPath beru URL, kam se bude link odkazovat.

# Cil, kam se shortcut odkazuje musi byt URL Encoded
$URLEncodedTemp = [URI]::EscapeUriString($($Row.TargetPath))

Původně jsem toto nijak neošetřoval a odkazy bral z CSV a rovnou je ukládat na Sharepoint. V naprosté většině případů byly odkazy funkční, vyjma případu, kdy cílová URL obsahovala čárku („,“). Bohužel, klient dodal data, kde cílové složky, do kterých se odkazuje, obsahují v názvu souboru čárku (a i jiné speciální znaky). Takže pomocí funkce [URI]::EscapeUriString() jsem cílovou URL zakódoval, doufajíc, že vše bude v pořádku.

V pořádku to bylo, až na jednu drobnost. TargetPath obsahuje odkazy na Sharepoint, kde URL vypadá nějak takto:

 

https://firma.sharepoint.com/sites/SharepointSite/Shared Documents/Archiv/Klienti/rok 2021\Produkty

část URL, konkrétně /Shared Documents/ se po použití výše zmíněné funkce enkódovala jako „/Shared%2520Documents/“ namísto /Shared%20Documents/.

Konzultoval jsem tuto problematiku s Googlem a tam jsem se dozvěděl, že %25 je URL encoded znak „%“, čili, jako by se ten řetězec encodoval dvakrát. Tedy „%2520“ by měl odpovídat řetězci „%20“ nikoliv „mezeře“.

Zvažoval jsem možnost systémového řešení, ale vzhledem k tomu, že bylo potřeba zpracovat cca 200 odkazů a pak už nebylo potřeba s tím nic dalšího dělat, rozhodl jsem se pro klasické řešení a řetězec jsem opravil takto:

$URLEncoded = $URLEncodedTemp.replace('%2520','%20')

Závěrem

Pokud potřebujete ve vaší organizaci pomoct s migrací do Microsoft 365 nebo Azure, vyřešit zabezpečení nebo proškolit uživatele, ozvěte se mi, určitě něco vymyslíme.

Napsat komentář