【问题标题】:PowerShell scripts every developer should know [closed]每个开发人员都应该知道的 PowerShell 脚本 [关闭]
【发布时间】:2010-11-09 17:36:54
【问题描述】:

Windows PowerShell 已经推出很长时间了。与旧的 Windows shell 相比,它的功能要强大得多。 作为开发人员,您是否使用任何脚本来加快和简化您的日常工作?如果您可以使用 PowerShell 施展魔法 -> 请与我们分享!

更新 PowerShell Community Extensions 不是真正的脚本,但也非常有用。该软件包包含许多新的 Cmdlet 和 PowerShell 修改。

【问题讨论】:

    标签: windows powershell scripting


    【解决方案1】:

    我整理了一堆脚本来在命令行中使用 Subversion。他们中的大多数只是使用 --xml 选项以对象形式放置各种信息。以下是几个例子:

    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
        }
    }
    

    我将它们分别别名为 svns 和 svnl。我说说其他几个here

    【讨论】:

    • 好电话。我使用 TFS Power Tool cmdlet 的频率与我在上面键入的任何内容一样频繁,但并不是每个人都有 TFS。如果您确实为您选择的源代码控制系统提供了某种对象模型,那么将其与 Powershell 配合使用非常好学。
    【解决方案2】:

    我一直使用这个,因为 Windows 资源管理器的文件内容搜索对我不起作用:

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

    只需将“extension”替换为您感兴趣的文件类型的文件扩展名(或完全删除 -Filter 参数)并将“somestring”替换为您要在文件中找到的文本。

    【讨论】:

    • 如何让它停止在我无权访问的目录上中止?
    【解决方案3】:

    这不是一个脚本,但一般来说,了解何时可以通过名称和位置来缩短参数是有帮助的。

    按名称,PowerShell 只需要足以将其缩小到一个。例如,gci -r 有效,但 gci -f 可能是 -filter-force

    不带参数标签指定的值按位置应用。所以如果你想指定-filter,你可以这样做:

    gci -r -fil *.cs
    

    或者在位置上提供.-path,这样你也可以在位置上指定-filter

    gci -r . *.cs
    

    【讨论】:

      【解决方案4】:

      只要您看到大小写正确的内容,就表明我使用了 TAB 补全。你应该知道 PS 会为你完成哪些事情——这在 V2 中非常好。

      任何时候你看到小写的别名,都是我从记忆中输入的。你也应该记住它。

      # 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()
      

      【讨论】:

        猜你喜欢
        • 2010-10-03
        • 1970-01-01
        • 1970-01-01
        • 2010-09-26
        • 2011-10-05
        • 1970-01-01
        • 2011-05-11
        • 2011-02-16
        • 2011-12-28
        相关资源
        最近更新 更多