powershell_newsymlink

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

CréationNicolas THOREZ 2019/11/29 11:19

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.

# 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
	
		.LINK
			https://www.shyrkasystem.com
	
	#>
	
	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")]
                    public static extern bool CreateSymbolicLink(string lpSymlinkFileName, string lpTargetFileName, int dwFlags);
                }
            }
"@
	}
	
	# Numérisation du type
	If ($Type -eq 'File')
	{
		$Flag = 0
	}
	Else
	{
		$Flag = 1
	}
	
	# Création du lien
	[Win32.SymLink]::CreateSymbolicLink($Path, $Target, $Flag)
	
	# Traitement des éventuelles erreurs
	If ($?)
    {
        # Affichage du résultat
	    New-Object PSObject -Property @{
		    SymLink  = $Path
		    Target   = $Target
		    Type	 = $Type
        }
    }
    Else
    {
        Write-Error "Erreur lors de la création du lien"
    }
}

Entrer votre commentaire. La syntaxe wiki est autorisée:
 
  • powershell_newsymlink.txt
  • Dernière modification : 2021/03/05 16:10
  • de nekan