fr-FR/tutorials/Invoke-PSDriveTutorial.ps1
|
# a tutorial on PSProviders and PSDrives param( [switch]$Full, [switch]$Menu ) #region setup $script:tutorialParam = $PSBoundParameters if ($isWindows -or ($PSEdition -eq 'Desktop')) { $root = '\' } else { $root = '/' } $title = "$($titleStyle)Providers and PSDrives$($reset)" if ($IsCoreCLR) { $psh = 'pwsh' } else { $psh = 'powershell' } #endregion #region content $intro = @' Pour les débutants PowerShell, un concept fondamental qui peut sembler mystérieux au début est celui d'un PowerShell {0}provider{1}. Un provider est un logiciel qui sert d'interface entre une technologie sous-jacente, comme le registre Windows ou le système de fichiers, et PowerShell. Il expose la technologie sous-jacente via un {0}PSDrive{1}. Sauf si vous êtes développeur .NET ou PowerShell, vous ne créerez jamais de provider, mais vous les utiliserez tout le temps, même si vous ne vous en rendez pas compte. PowerShell inclut plusieurs providers prêts à l'emploi. Vous pouvez obtenir des providers supplémentaires via des modules importés. Par exemple, lorsque vous importez le module ActiveDirectory, vous obtiendrez un PSDrive qui sert d'interface vers votre domaine Active Directory, vous permettant de naviguer dans le domaine comme dans un système de fichiers. '@ -f $highLight,$reset $p1 = @" Le provider permet d'utiliser le même cmdlet pour différentes technologies. C'est pourquoi le cmdlet s'appelle {0}Get-ChildItem{1} et non {4}Get-File{1} ou {4}Get-RegistryKey{1}. Dans de nombreux cas, vous pouvez parcourir la technologie via le PSDrive comme s'il s'agissait d'un système de fichiers. Le provider permet aussi au même cmdlet d'obtenir des éléments depuis le système de fichiers ou depuis le PSDrive {2}Function{1}. Le provider s'occupe du travail. "@ -f $cmdStyle,$reset,$highLight2,$highLight3,$italic #Get-PSProvider $p2 = @" Pour afficher les providers actuellement utilisés, exécutez cette commande : $prompt {0}Get-PSProvider{1} "@ -f $cmdStyle,$reset $p3 = @" Vous verrez des providers différents selon votre système d'exploitation et selon les modules que vous avez chargés et qui peuvent ajouter un provider. Nous examinerons {0}Drives{1} dans un instant. Tous les providers ne fonctionnent pas de la même manière ; ainsi, même si un cmdlet dispose d'un paramètre pour prendre en charge une fonctionnalité, si vous utilisez le cmdlet dans un PSDrive qui ne prend pas en charge cette fonctionnalité, le cmdlet échouera. La capacité {2}ShouldProcess{1} se rapporte à la prise en charge du paramètre {3}-WhatIf{1}. Cependant, n'ayez pas peur de l'essayer. Sous Windows, le provider {4}WSMan{1} semble ne pas prendre en charge {2}ShouldProcess{1}, pourtant des commandes comme celle-ci : {5}Set-Item{1} {3}-path{1} {6}WSMan:\localhost\Client\AllowUnencrypted{1} {3}-Value{1} {6}'false'{1} {3}-WhatIf{1} fonctionneront en fait sans erreur. "@ -f $highLight3,$reset,$highLight2,$paramStyle,$highLight,$cmdStyle,$stringStyle $p4 = @" La capacité {0}Filter{1} se réfère à une technique de filtrage spécifique utilisée en .NET. Elle est généralement exposée via le paramètre {2}-Filter{1} que vous verrez dans certains cmdlets. Le format de la valeur du paramètre varie selon le provider et le cmdlet. L'aide devrait documenter son utilisation. Si le provider ne prend pas en charge {0}Filter{1}, cela signifie simplement que le paramètre {2}-Filter{1} ne fonctionnera probablement pas. Cependant, de nombreux cmdlets ont d'autres paramètres qui peuvent fournir une fonctionnalité de « filtrage » comme {2}-Name{1}, {2}-Include{1} et {2}-Exclude{1}. Vous ne devriez pas avoir besoin d'exécuter {3}Get-PSProvider{1} très souvent, sauf pour le dépannage ou par curiosité. "@ -f $highLight2,$reset,$paramStyle,$cmdStyle #Get-PSDrive $p5 = @" {3}PSDrives{2} Chaque provider créera un ou plusieurs {0}PSDrives{2}. Chaque lecteur est une interface vers la technologie sous-jacente. PowerShell créera automatiquement un certain nombre de PSDrives lorsque vous démarrez une nouvelle session PowerShell. Vous pouvez utiliser {1}Get-PSDrive{2} pour découvrir les PSDrives définis dans votre session actuelle. $prompt {1}Get-PSDrive{2} "@ -f $highlight2,$cmdStyle,$reset,$highLight3 $p6 = @" Vous devriez automatiquement avoir un PSDrive pour chaque lecteur logique tel que vu par le système d'exploitation, par exemple C:\ sur Windows ou / sur Linux. Cependant, comme vous le verrez, les PSDrives {0}FileSystem{1} affichés ici sont indépendants du système d'exploitation. "@ -f $highLight,$reset #other providers $p7 = @" Les lecteurs non liés au système de fichiers intéressent souvent le plus les débutants PowerShell. $prompt {2}Get-PSDrive{1} {3}|{1} {2}Where-Object{1} {3}{{{1}{5}`$_.Provider.Name{1} {3}-ne{1} {4}'FileSystem'{1}{3}}}{1} "@ -f $highLight,$reset,$cmdStyle,$operatorStyle,$stringStyle,$varStyle $p8 = @" Vous verrez des lecteurs différents selon votre système d'exploitation, les modules chargés ou les lecteurs que vous avez pu ajouter. "@ $p9 = @" Vous pouvez accéder à ces lecteurs et éventuellement les parcourir comme un système de fichiers. N'oubliez pas d'utiliser les deux-points {6}:{1} après le nom du PSDrive. $prompt {0}Get-ChildItem{1} {3}Alias:{1} {4}|{1} {0}Select-Object{1} {2}-first{1} {5}5{1} "@ -f $cmdStyle,$reset,$paramStyle,$defaultTokenStyle,$operatorStyle,$numberStyle,$highLight2 $p10 = @" Beaucoup de ces PSDrives sont utilisés par des cmdlets associés, qui sont ceux que vous devriez utiliser. $prompt {0}Get-Alias{1} {4}|{1} {0}Select-Object{1} {2}-first{1} {5}5{1} "@ -f $cmdStyle,$reset,$paramStyle,$defaultTokenStyle,$operatorStyle,$numberStyle #New-PSdrive $p11 = @" Vous pouvez créer vos propres PSDrives vers n'importe quel emplacement pris en charge par un Provider, que vous verrez parfois référencé comme un {2}PSProvider{1}. Utilisez {0}New-PSDrive{1} pour créer l'affectation du lecteur. Vous n'êtes pas limité à l'utilisation de lettres de lecteur traditionnelles. Vous pouvez utiliser n'importe quel nom, bien que vous devriez éviter les noms contenant des espaces ou des caractères non alphanumériques. $prompt {0}New-PSDrive{1} {3}-Name{1} {4}tmpHome{1} {3}-PSProvider{1} {4}FileSystem{1} {3}-Root{1} {5}`$home{1} "@ -f $cmdStyle,$reset,$highLight2,$paramStyle,$stringStyle,$varStyle $p12 = @" Il est important de noter que le système d'exploitation ne verra pas votre PSDrive. Si vous créez un PSDrive appelé {3}W{1} sous Windows qui correspond à C:\Work, vous ne verrez {5}pas{1} un lecteur {3}W{1} dans l'Explorateur Windows. L'exception serait les PSDrives persistants mappés sur une racine UNC. ({4}Consultez l'aide pour {0}New-PSDrive{1}.) De même, si vous ajoutez un nouveau mappage de lecteur dans Windows, il n'est pas garanti qu'un PSDrive correspondant soit automatiquement créé dans votre session PowerShell. Une fois créé, vous pouvez utiliser cet emplacement comme n'importe quel autre chemin. Encore une fois, n'oubliez pas les deux-points. $prompt {0}Get-ChildItem{1} {2}tmpHome:{1} {7}|{1} {0}Select-Object{1} {6}-first{1} {8}3{1} "@ -f $cmdStyle,$reset,$defaultTokenStyle,$highLight,$italic,$warnStyle,$paramStyle,$operatorStyle,$numberStyle #remove PSDrive $p13 = @" Tous les PSDrives que vous créez ne {4}durent que pendant la durée de votre session PowerShell.{1} La prochaine fois que vous lancerez PowerShell, le lecteur ne sera pas défini. Si vous voulez des PSDrives disponibles à chaque démarrage de PowerShell, placez la commande {0}New-PSDrive{1} dans votre script de profil PowerShell. Une exception concerne Windows lorsque vous mappez un lecteur réseau (UNC) comme un lecteur {5}persistant{1}. Consultez l'aide pour {0}New-PSDrive{1} pour en savoir plus. Si vous voulez supprimer un PSDrive de votre session, utilisez {0}Remove-PSDrive{1}. Dans ce cas, référencez le nom du lecteur {6}sans{1} les deux-points. Comme pour l'ajout d'un PSDrive, la suppression d'un PSDrive est totalement indépendante du système d'exploitation. $prompt {0}Remove-PSDrive{1} {2}-name{1} {3}tmpHome{1} "@ -f $cmdStyle,$reset,$paramStyle,$stringStyle,$warnStyle,$highLight2,$italic #dynamic parameters $p14 = @" Il y a une autre fonctionnalité des PSProviders et PSDrives dont vous voudrez tirer parti. Vous savez maintenant que vous pouvez utiliser un cmdlet comme {0}Get-ChildItem{1} avec différents PSDrives. Certains cmdlets sont conçus avec des {2}{3}paramètres dynamiques{1}. Ce sont des paramètres souvent conscients du provider. Autrement dit, le paramètre ne fonctionne qu'avec un PSProvider donné. Cela peut prêter à confusion car l'aide peut afficher le paramètre, mais il ne fonctionne que dans une situation spécifique. Voici un exemple. {0}Get-ChildItem{1} possède un paramètre {4}-File{1}. $prompt {0}Get-ChildItem{1} {5}`$pshome{1} {4}-file{1} {6}|{1} {0}Select-Object{1} {4}-first{1} {7}1{1} "@ -f $cmdStyle,$reset,$italic,$highLight2,$paramStyle,$varStyle,$operatorStyle,$numberStyle $p15 = @" Cependant, le paramètre {2}-File{1} n'est disponible que lorsque vous utilisez un emplacement pris en charge par le PSProvider FileSystem. Sinon, vous obtiendrez très probablement une erreur. $prompt {0}Get-ChildItem{1} {2}Function:{1} {3}-file{1} "@ -f $cmdStyle,$reset,$defaultTokenStyle,$paramStyle $p16 = @" C'est pourquoi il est très important de prendre le temps de lire l'aide complète et les exemples des commandes PowerShell. "@ $p17 = @" Vous pouvez en apprendre davantage sur les providers en général en exécutant {0}Get-Help{1} {2}about_providers{1}. Vous pouvez également obtenir des détails sur un provider spécifique à partir du sujet about correspondant. $prompt {0}Get-Help{1} {2}about_*_provider{1} "@ -f $cmdStyle,$reset,$defaultTokenStyle #endregion #region run the tutorial $pages = @( { Clear-Host $title $Intro $script:pg++ ; Pause $script:pg $pgCount }, { $p1 $script:pg++ ; Pause $script:pg $pgCount }, { Clear-Host $p2 Get-PSProvider | Out-Host $script:pg++ ; Pause $script:pg $pgCount }, { $p3 $script:pg++ ; Pause $script:pg $pgCount }, { $p4 $script:pg++ ; Pause $script:pg $pgCount }, { Clear-Host $p5 Get-PSDrive | Format-Table -AutoSize | Out-Host $script:pg++ ; Pause $script:pg $pgCount }, { $p6 $script:pg++ ; Pause $script:pg $pgCount }, { Clear-Host $p7 Get-PSDrive | Where-Object {$_.Provider.Name -ne 'FileSystem'} | Format-Table -AutoSize | Out-Host $script:pg++ ; Pause $script:pg $pgCount }, { $p8 $script:pg++ ; Pause $script:pg $pgCount }, { Clear-Host $p9 Get-ChildItem Alias: | Select-Object -first 5 | Out-Host $script:pg++ ; Pause $script:pg $pgCount }, { $p10 Get-Alias | Select-Object -first 5 | Out-Host $script:pg++ ; Pause $script:pg $pgCount }, { Clear-Host $p11 if (Test-Path tmpHome:) { Remove-PSDrive tmpHome} New-PSDrive -Name tmpHome -PSProvider FileSystem -Root $home -Scope Script | Format-Table -AutoSize | Out-Host $script:pg++ ; Pause $script:pg $pgCount }, { $p12 Get-ChildItem tmpHome: | Select-Object -first 3 | Out-Host $script:pg++ ; Pause $script:pg $pgCount }, { Clear-Host $p13 Remove-PSDrive tmpHome -Scope Script $script:pg++ ; Pause $script:pg $pgCount }, { Clear-Host $p14 Get-ChildItem $pshome -file | Select-Object -first 1 | Out-Host $script:pg++ ; Pause $script:pg $pgCount }, { $p15 if ($PSEdition -eq 'Desktop') { $errMsg = @" Get-ChildItem : A parameter cannot be found that matches parameter name 'file'. At line:1 char:25 + Get-ChildItem Function: -file + ~~~~~ + CategoryInfo : InvalidArgument: (:) [Get-ChildItem], ParameterBindingException + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand "@ Write-Host $errMsg -ForegroundColor $host.PrivateData.ErrorForegroundColor } else { #On non-Windows systems this causes an error that stops #the pipeline and breaks the script, so I'll fake the expected error "$($PSStyle.Formatting.Error)Get-ChildItem: A parameter cannot be found that matches parameter name 'file'.$($PSStyle.Reset)" } "`n" $script:pg++ ; Pause $script:pg $pgCount }, { $p16 $script:pg++ ; Pause $script:pg $pgCount }, { Clear-Host #suppress Write-Progress $p17 if ($IsCoreCLR) { Get-Help about_*_provider -ProgressAction SilentlyContinue| Out-Host } else { $ProgressPreference = "SilentlyContinue" Get-Help about_*_provider | Out-Host } $script:pg++ ; Pause $script:pg $pgCount } ) #keep a navigation page counter $pgCount = $pages.count <# There is an overlap in functionality between $i and $pg but they are separate counters because there may be times I need to display a "page" of information into two pages and want to maintain a page number. #> for ($script:i = 0; $script:i -lt $pages.count; $script:i++) { Invoke-Command -ScriptBlock $pages[$script:i] } #endregion #this will come before the Profiles tutorial if ($full) { &$tutorials['PowerShell Profiles'] -Full } elseif ($Menu) { Start-PSTutorial } |