Ceci est une ancienne révision du document !


~~CLOSETOC~~

New-SymbolicLink - Création d'un lien symbolique

Créer un lien symbolique peut avoir plusieurs utilités. On peut par exemple réduire une arborescence ou regrouper dans un dossier des fichiers situés dans différents dossier.

Pour cela, il existe la commande New-Item qui avec son parametre -ItemType SymbolicLink crée des lien symbolique. Cependant, cette commande à une limite. Elle ne peut pas créer des liens avec des éléments non accessibles naturellement par le système comme par exemple les ShadowCopy.

La fonction suivante résout ce problème. Elle est basée sur les travaux de

# Création de lien symbolique
function New-SymbolicLink()
{
	<#
		.SYNOPSIS
			Création d'un lien symbolique.
 
		.DESCRIPTION
			Permet de créer un lien symbolique entre un nom du lien et une cible de type fichier ou dossier, local, distant ou ShadowCopy.
 
		.PARAMETER  Path
			Chemin du lien à créer.
 
		.PARAMETER  Target
			Cible à lier lors de la création.
 
		.PARAMETER  Type
			Type de lien. A choisir entre File et Directory.
 
		.EXAMPLE
			New-SymbolicLink -Path C:\hosts -Target C:\Windows\System32\drivers\etc\hosts -Type File
 
			Crée un lien symbolique du fichier 'C:\Windows\System32\drivers\etc\hosts', nommée 'hosts' et situé à la racine de C.
 
		.EXAMPLE
			New-SymbolicLink -Path C:\ShadowCopy -Target \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy50\ -Type Directory
 
			Crée un lien symbolique d'un ShadowCopy, sous la forme d'un dossier contenant l'intégralité de ses données.
 
		.INPUTS
			Pas de pipeline. Seulement les argumentss nommées.
 
		.OUTPUTS
			Création d'un lien symbolique.
 
			Affichage des informations sur le lien créé.
 
		.NOTES
			Crée par Nicolas THOREZ, Shyrka System
                        Basée sur les travaux de J. F. Larvoire
 
		 .LINK
			https://www.shyrkasystem.com
                        https://github.com/JFLarvoire/SysToolsLib/blob/master/PowerShell/ShadowCopy.ps1
 
	#>
 
	Param
	(
		# Type de lien
		[Parameter(Mandatory = $true, ValueFromPipeline = $false)]
		[ValidateSet("File", "Directory")]
		[string]$Type,
		# Chemin du lien
		[Parameter(Mandatory = $true, ValueFromPipeline = $false)]
		[string]$Path,
		# Cible du lien
		[Parameter(Mandatory = $true, ValueFromPipeline = $false)]
		[string]$Target
	)
 
	# Création du type d'objet [Custom.SymLink]
	Try
	{
		$Null = [Win32.SymLink]
	}
	Catch
	{
		Add-Type @"
       		using System;
       		using System.Runtime.InteropServices;
       		namespace Win32 {
 				public class SymLink {
   					[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
   					public static extern bool CreateSymbolicLink(string lpSymlinkFileName, string lpTargetFileName, int dwFlags);
   					[DllImport("kernel32.dll")]
   					public static extern uint GetLastError();
 
   					public static uint Create(string lpSymlinkFileName, string lpTargetFileName, int dwFlags) {
     					bool done = CreateSymbolicLink(lpSymlinkFileName, lpTargetFileName, dwFlags);
     					if (done) {
       						return 0;
     					} else {
       						return GetLastError();
     					}
   					}
 				}
       		}
"@
	}
 
	# Numérisation du type
	If ($Type -eq 'File')
	{
		$Flag = 0
	}
	Else
	{
		$Flag = 1
	}
 
	# Création du lien
	$error = [Win32.SymLink]::Create($Path, $Target, $Flag)
 
	# Traitement des éventuelles erreurs
	If ($error)
	{
		throw [ComponentModel.Win32Exception][int]$error
	}
 
	# Affichage du résultat
	New-Object PSObject -Property @{
		SymLink  = $Path
		Target   = $Target
		Type	 = $Type
	}
}

Nicolas THOREZ 2019/11/29 11:19

Entrer votre commentaire. La syntaxe wiki est autorisée:
 
  • powershell_newsymlink.1575022821.txt.gz
  • Dernière modification : 2019/11/29 09:20
  • (modification externe)