2009-07-10 1 views
10

Windows PowerShell ist jetzt schon eine ziemlich lange Zeit. Im Vergleich zu der guten alten Windows-Shell ist es wesentlich leistungsfähiger. Gibt es Skripte, mit denen Sie Ihre tägliche Arbeit als Entwickler beschleunigen und vereinfachen können? Wenn Sie mit PowerShell zaubern können -> teilen Sie es bitte mit uns!PowerShell-Skripte, die jeder Entwickler kennen sollte

Update Nicht wirklich ein Skript, aber auch sehr nützlich sind PowerShell Community Extensions. Das Paket enthält viele neue Cmdlets und PowerShell-Modifikationen.

Antwort

3

Ich benutze diese eine ganze Zeit, weil Windows Explorer die Suche nach Dateiinhalt für mich nie funktioniert:

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

Ersetzen Sie einfach „Verlängerung“ mit der Dateierweiterung des Dateityps Sie interessiert sind (oder Entfernen Sie den Parameter -Filter vollständig und ersetzen Sie "somestring" durch den Text, den Sie in der Datei finden möchten.

+0

wie bekomme ich es Abbruchs auf Verzeichnisse zu stoppen Ich habe keinen Zugang zu? – Maslow

2

Jedes Mal, wenn Sie etwas mit der richtigen Großschreibung sehen, ist es ein Hinweis, dass ich die TAB-Vervollständigung verwendet habe. Du solltest lernen, welche Dinge PS für dich erledigen wird - es ist ziemlich gut in V2.

Jedes Mal, wenn Sie Aliase in Kleinbuchstaben sehen, ist es etwas, das ich aus dem Speicher tippte. Sie sollten es sich auch merken.

# 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 "StringBuilder" } 
# now that we've loaded the assembly, we could have also done: 
# $sbType = [system.text.stringbuilder] 
# 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.ToString() 
6

Ich habe eine Reihe von Skripten für die Arbeit mit Subversion an der Befehlszeile zusammengestellt. Die meisten von ihnen verwenden nur die Option --xml, um verschiedene Informationen in Objektform zu bringen. Hier sind ein paar Beispiele:

function Get-SvnStatus([string[]] $Path = ".", 
         [string] $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([string] $Path = ".", 
        [int] $Revision, 
        [int] $Limit = -1, 
        [switch] $Verbose, 
        [switch] $NoFormat) 
{ 
    $revisionString = "" 
    $limitString = "" 
    $verboseString = "" 

    if ($Revision) 
    { 
     $revisionString = "--revision $Revision" 
    } 

    if ($Limit -ne -1) 
    { 
     $limitString = "--limit $Limit" 
    } 

    if ($Verbose) 
    { 
     $verboseString = "--verbose" 
    } 

    [xml]$log = Invoke-Expression "svn log $($path -join ',') --xml $revisionString $limitString $verboseString" 

    $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-String).Trim() 
          } 
         } 
        } 
      } 
      else 
      { 
       $_ 
      } 
     } 
    } 

    if ($NoFormat) 
    { 
     $logObjects 
    } 
    else 
    { 
     $logObjects | Format-List 
    } 
} 

Ich habe diese aliased zu svns und SVNL sind. Ich spreche über ein paar andere here.

+0

Guter Anruf. Ich verwende die TFS Power Tool-Cmdlets genauso oft wie alles, was ich oben eingegeben habe, aber nicht jeder hat TFS. Wenn Sie eine Art von Objektmodell für Ihr Quellkontrollsystem Ihrer Wahl haben, ist es sehr gut, es mit Powershell zu verbinden. –

3

Es ist kein Skript, aber im Allgemeinen ist es hilfreich zu erfahren, wann Sie Parameter sowohl nach Name als auch nach Position kürzen können.

Mit Namen, PowerShell braucht nur genug, um es auf einen zu beschränken. Zum Beispiel funktioniert gci -r, aber gci -f könnte entweder -filter oder -force sein.

Werte, die ohne Parameterbezeichnung angegeben wurden, werden positionsmäßig angewendet. Also, wenn Sie -filter angeben möchten können Sie entweder das tun:

gci -r -fil *.cs 

Oder bieten . positionell als -path so können Sie auch -filter positionell angeben:

gci -r . *.cs