<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>link &#8211; Miroslav Šraga</title>
	<atom:link href="https://www.sraga.cz/tag/link/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.sraga.cz</link>
	<description>Sdílím své zkušenosti s Microsoft 365 a Azure</description>
	<lastBuildDate>Fri, 26 Apr 2024 12:43:03 +0000</lastBuildDate>
	<language>cs</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>Hromadné vytváření zástupců (linků) v Sharepoint Online</title>
		<link>https://www.sraga.cz/hromadne-vytvareni-zastupcu-linku-v-sharepoint-online/</link>
					<comments>https://www.sraga.cz/hromadne-vytvareni-zastupcu-linku-v-sharepoint-online/#respond</comments>
		
		<dc:creator><![CDATA[Miroslav Šraga]]></dc:creator>
		<pubDate>Fri, 26 Apr 2024 12:15:27 +0000</pubDate>
				<category><![CDATA[Sharepoint]]></category>
		<category><![CDATA[PowerShell]]></category>
		<category><![CDATA[link]]></category>
		<category><![CDATA[odkaz]]></category>
		<category><![CDATA[Sharepoint Online]]></category>
		<category><![CDATA[shortcut]]></category>
		<category><![CDATA[zástupce]]></category>
		<guid isPermaLink="false">https://www.sraga.cz/?p=666</guid>

					<description><![CDATA[Dostal se mi do rukou zajímavý úkol: &#8222;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&#8220;. Takže jsem připravil skript, který si vezme CSV soubor a v něm jsou 2 sloupce obsahující data: LinkSavePath &#8211; ... <a title="Hromadné vytváření zástupců (linků) v Sharepoint Online" class="read-more" href="https://www.sraga.cz/hromadne-vytvareni-zastupcu-linku-v-sharepoint-online/" aria-label="Číst více o Hromadné vytváření zástupců (linků) v Sharepoint Online">Číst dál</a>]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="666" class="elementor elementor-666" data-elementor-post-type="post">
				<div class="elementor-element elementor-element-e016d74 e-flex e-con-boxed e-con e-parent" data-id="e016d74" data-element_type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-3837589 elementor-widget elementor-widget-text-editor" data-id="3837589" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Dostal se mi do rukou zajímavý úkol: &#8222;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&#8220;.</p><p>Takže jsem připravil skript, který si vezme CSV soubor a v něm jsou 2 sloupce obsahující data:</p><div><ul><li><strong>LinkSavePath</strong> &#8211; kam link uložit a jak se bude jmenovat<br />Příklad: <em>Shared Documents/Nabidky/rok 2021\APRIL-MAJ 2021\klient\Odkaz na produkty.url</em></li><li><div><div><strong>TargetPath</strong> &#8211; kam bude link odkazovat<br />Příklad: <em>https://firma.sharepoint.com/sites/SharepointSite/Shared Documents/Archiv/Klienti/rok 2021\Produkty</em></div></div></li></ul></div><p>Toto CSV načítám a vytvářím zástupce dle hotnot, které jsou obsaženy v CSV.</p><p>Pro vytvoření linku v Sharepointu je potřeba dodat 3 informace</p><ul><li>$filename &#8211; název odkazu [odkaz.url]</li><li>$folderName &#8211; kde bude odkaz uložen</li><li>$URL &#8211; kam bude odkaz směřovat</li></ul><p>K vytváření odkazů použijeme knihovu <a href="https://www.sraga.cz/instalace-pnp-powershell/" target="_blank" rel="noopener">PnP.PowerShell</a>. Samotný odkaz se vytváří, stejně jako jakýkoliv jiný soubor pomocí příkazu <a href="https://pnp.github.io/powershell/cmdlets/Add-PnPFile.html" target="_blank" rel="noopener">Add-PnPFile</a>.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-cb40ba1 elementor-widget elementor-widget-code-block-for-elementor" data-id="cb40ba1" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
					<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-javascript'>$stream = [IO.MemoryStream]::new([Text.Encoding]::UTF8.GetBytes(&quot;[InternetShortcut]URL=https://www.sraga.c&quot;))
Add-PnPFile -FileName &quot;odkaz.url&quot; -Folder &quot;Shared Documents/CilovaSlozka&quot; -Stream $stream -Values @{_ShortcutUrl=&quot;https://www.sraga.cz&quot;}</code></pre>				</div>
				</div>
				<div class="elementor-element elementor-element-1b4973c elementor-widget elementor-widget-text-editor" data-id="1b4973c" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Výsledný skript tedy vypadá takto:</p>								</div>
				</div>
				<div class="elementor-element elementor-element-2333d62 elementor-widget elementor-widget-code-block-for-elementor" data-id="2333d62" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
					<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-powershell'>$SiteURL = &quot;https://firma.sharepoint.com/sites/SharepointSite/&quot;

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

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

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

# Cyklus pro zpracovani dat
ForEach($Row in $CSVData)
{
    
    Write-Host &quot;Soubor $($Row.LinkSavePath) - $Counter of $($CSVData.Count)&quot;
    Write-Host -ForegroundColor Yellow &quot; &quot;$($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(&#039;%2520&#039;,&#039;%20&#039;)
    
    $stream = [IO.MemoryStream]::new([Text.Encoding]::UTF8.GetBytes(&quot;[InternetShortcut]URL=$URLEncoded&quot;))
    
    # Vytvoreni shortcut
    Add-PnPFile -FileName $fileName -Folder $folderName -Stream $stream -Values @{_ShortcutUrl=&quot;$URLEncoded&quot;}

    $Counter++
}

# Odpojeni PnP
Disconnect-PnPOnline</code></pre>				</div>
				</div>
				<div class="elementor-element elementor-element-9a2e105 elementor-widget elementor-widget-text-editor" data-id="9a2e105" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Ve výše uvedeném skriptu je pár maličkostí, které jsem musel ošetřit &#8222;nestandardní cestou&#8220;</p><p>Ze sloupce TargetPath beru URL, kam se bude link odkazovat.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-48c6dba elementor-widget elementor-widget-code-block-for-elementor" data-id="48c6dba" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
					<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-powershell'># Cil, kam se shortcut odkazuje musi byt URL Encoded
$URLEncodedTemp = [URI]::EscapeUriString($($Row.TargetPath))</code></pre>				</div>
				</div>
				<div class="elementor-element elementor-element-90fa6e7 elementor-widget elementor-widget-text-editor" data-id="90fa6e7" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>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 (&#8222;,&#8220;). 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 <strong>[URI]::EscapeUriString()</strong> jsem cílovou URL zakódoval, doufajíc, že vše bude v pořádku.</p><p>V pořádku to bylo, až na jednu drobnost. TargetPath obsahuje odkazy na Sharepoint, kde URL vypadá nějak takto:</p><p> </p>								</div>
				</div>
				<div class="elementor-element elementor-element-f4fd93d elementor-widget elementor-widget-code-block-for-elementor" data-id="f4fd93d" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
					<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-powershell'>https://firma.sharepoint.com/sites/SharepointSite/Shared Documents/Archiv/Klienti/rok 2021\Produkty</code></pre>				</div>
				</div>
				<div class="elementor-element elementor-element-b7648cb elementor-widget elementor-widget-text-editor" data-id="b7648cb" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>část URL, konkrétně /Shared Documents/ se po použití výše zmíněné funkce enkódovala jako &#8222;/Shared<strong>%2520</strong>Documents/&#8220; namísto /Shared<strong>%20</strong>Documents/.</p><p>Konzultoval jsem tuto problematiku s Googlem a tam jsem se dozvěděl, že <strong>%25</strong> je URL encoded znak &#8222;%&#8220;, čili, jako by se ten řetězec encodoval dvakrát. Tedy &#8222;%2520&#8220; by měl odpovídat řetězci &#8222;%20&#8220; nikoliv &#8222;mezeře&#8220;.</p><p>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:</p>								</div>
				</div>
				<div class="elementor-element elementor-element-eeddc69 elementor-widget elementor-widget-code-block-for-elementor" data-id="eeddc69" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
					<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-powershell'>$URLEncoded = $URLEncodedTemp.replace(&#039;%2520&#039;,&#039;%20&#039;)</code></pre>				</div>
				</div>
				<div class="elementor-element elementor-element-0d8ebac elementor-widget elementor-widget-heading" data-id="0d8ebac" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Závěrem</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-6f5e621 elementor-widget elementor-widget-text-editor" data-id="6f5e621" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Pokud potřebujete ve vaší organizaci pomoct s migrací do Microsoft 365 nebo Azure, vyřešit zabezpečení nebo proškolit uživatele, <a href="https://www.sraga.cz/kontakt/" target="_blank" rel="noopener">ozvěte se mi</a>, určitě něco vymyslíme.</p>								</div>
				</div>
					</div>
				</div>
				</div>
		]]></content:encoded>
					
					<wfw:commentRss>https://www.sraga.cz/hromadne-vytvareni-zastupcu-linku-v-sharepoint-online/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
