Les scripts PowerShell que chaque développeur doit connaître

Windows PowerShell est sorti depuis assez longtemps maintenant. En comparaison avec le bon vieux shell Windows, il est beaucoup plus puissant. Y a-t-il des scripts que vous utilisez pour accélérer et simplifier votre travail quotidien en tant que développeur? Si vous pouvez faire de la magie avec PowerShell -> partagez-le avec nous!

Mise à jour Pas vraiment un script, mais aussi des extensions de communauté PowerShell très utiles. Le package contient de nombreuses modifications Cmdlets et PowerShell.

J’ai mis en place un tas de scripts pour travailler avec Subversion sur la ligne de commande. La plupart d’entre eux utilisent simplement l’option –xml pour mettre diverses informations sous forme d’object. Voici quelques exemples:

function Get-SvnStatus( [ssortingng[]] $Path = ".", [ssortingng] $Filter = "^(?!unversioned|normal|external)", [switch] $NoFormat ) { # powershell chokes on "wc-status" and doesn't like two definitions of "item" [xml]$status = ( ( Invoke-Expression "svn status $( $Path -join ',' ) --xml" ) -replace "wc-status", "svnstatus" ) ` -replace "item=", "itemstatus=" $statusObjects = $status.status.target | Foreach-Object { $_.entry } | Where-Object { $_.svnstatus.itemstatus -match $Filter } | Foreach-Object { $_ | Select-Object @{ Name = "Status"; Expression = { $_.svnstatus.itemstatus } }, @{ Name = "Path"; Expression = { Join-Path ( Get-Location ) $_.path } } } | Sort-Object Status, Path if ( $NoFormat ) { $statusObjects } else { $statusObjects | Format-Table -AutoSize } } function Get-SvnLog( [ssortingng] $Path = ".", [int] $Revision, [int] $Limit = -1, [switch] $Verbose, [switch] $NoFormat ) { $revisionSsortingng = "" $limitSsortingng = "" $verboseSsortingng = "" if ( $Revision ) { $revisionSsortingng = "--revision $Revision" } if ( $Limit -ne -1 ) { $limitSsortingng = "--limit $Limit" } if ( $Verbose ) { $verboseSsortingng = "--verbose" } [xml]$log = Invoke-Expression "svn log $( $path -join ',' ) --xml $revisionSsortingng $limitSsortingng $verboseSsortingng" $logObjects = $log.log.logentry | Foreach-Object { $logEntry = $_ $logEntry | Select-Object ` @{ Name = "Revision"; Expression = { [int]$logEntry.revision } }, @{ Name = "Author"; Expression = { $logEntry.author } }, @{ Name = "Date"; Expression = { if ( $NoFormat ) { [datetime]$logEntry.date } else { "{0:dd/MM/yyyy hh:mm:ss}" -f [datetime]$logEntry.date } } }, @{ Name = "Message"; Expression = { $logEntry.msg } } | Foreach-Object { # add the changed path information if the $Verbose parameter has been specified if ( $Verbose ) { $_ | Select-Object Revision, Author, Date, Message, @{ Name = "ChangedPaths"; Expression = { $paths = $logEntry.paths.path | Foreach-Object { $_ | Select-Object ` @{ Name = "Change"; Expression = { switch ( $_.action ) { "A" { "added" } "D" { "deleted" } "M" { "modified" } "R" { "replaced" } default { $_.action } } } }, @{ Name = "Path"; Expression = { $_."#text" } } } if ( $NoFormat ) { $paths } else { ( $paths | Sort-Object Change | Format-Table -AutoSize | Out-Ssortingng ).Trim() } } } } else { $_ } } } if ( $NoFormat ) { $logObjects } else { $logObjects | Format-List } } 

J’ai ces alias à svns et svnl, respectivement. Je parle de quelques autres ici .

Je l’utilise tout le temps car la recherche par Windows Explorer du contenu du fichier ne marche jamais pour moi:

 Get-ChildItem -Recurse -Filter *.extension | Select-Ssortingng -List somessortingng | Format-Table filename,linenumber -AutoSize 

Remplacez simplement “extension” par l’extension de fichier du type de fichier qui vous intéresse (ou supprimez entièrement le paramètre -Filter) et remplacez “somessortingng” par le texte que vous voulez trouver dans le fichier.

Ce n’est pas un script, mais en général, il est utile d’apprendre quand vous pouvez raccourcir les parameters, à la fois par nom et par position.

Par son nom, PowerShell a juste besoin d’en avoir assez. Par exemple, gci -r fonctionne mais gci -f peut être soit -force soit -force .

Les valeurs spécifiées sans étiquette de paramètre sont appliquées en position. Donc, si vous voulez spécifier -filter vous pouvez soit faire ceci:

 gci -r -fil *.cs 

Ou fournir . positionnellement comme -path afin que vous puissiez également spécifier -filter position:

 gci -r . *.cs 

Chaque fois que vous voyez quelque chose avec une capitalisation correcte, c’est une indication que j’ai utilisé l’achèvement de TAB. Vous devriez apprendre les choses que PS va compléter pour vous – c’est assez bon en V2.

Chaque fois que vous voyez des alias en minuscules, c’est quelque chose que j’ai tapé en mémoire. Vous devriez le mémoriser aussi.

 # grep example - find all using statements dir -r -fil *cs | ss using # advanced version dir -fil *cs -r | ss '^using[^\(]+' | gpv line | sort -unique # figure out how to query for drive free space (emphasis on "figure out" -- I can never remember things like this) gcm *drive* help Get-PSDrive -full Get-PSDrive | gm # now use it Get-PSDrive | ? { $_.free -gt 1gb } # pretend mscorlib.dll is an assembly you're developing and want to do some ad-hoc testing on $system = [system.reflection.assembly]::LoadFile("c:\blah\...\mscorlib.dll") $system | gm $types = $a.GetTypes() $types | gm $types | ? { $_.ispublic -and $_.basetype -eq [system.object] } | sort name $sbType = $types | ? { $_.name -eq "SsortingngBuilder" } # now that we've loaded the assembly, we could have also done: # $sbType = [system.text.ssortingngbuilder] # but we may not have known it was in the Text namespace $sb = new-object $sbType.FullName $sb | gm $sb.Append("asdf") $sb.Append("jkl;") $sb.ToSsortingng()