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

<code:ps1># 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
}

}

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