有用的PowerShell单行命令

19

提供一行你认为有用的PowerShell脚本,每个回答一个脚本。

这里有一个类似的问题,但这个问题仅提供包含脚本的页面链接,让我们在这里逐个回答并列出最常用或最有用的脚本。

  1. 列出文件的最近版本

    ls -r -fi *.lis | sort @{expression={$_.Name}}, @{expression={$_.LastWriteTime};Descending=$true} | select Directory, Name, lastwritetime | Group-Object Name | %{$_.Group | Select -first 1}

  2. gps programThatIsAnnoyingMe | kill

  3. 使用其注册的程序打开文件(例如start,例如start foo.xls

    ii foo.xls

  4. 检索并显示系统特殊文件夹的路径

    [enum]::getvalues([system.environment+specialfolder]) | foreach {"$_ maps to " + [system.Environment]::GetFolderPath($_)}

  5. 将环境值复制到剪贴板中(现在您知道如何使用剪贴板了!)

    $env:appdata | % { [windows.forms.clipboard]::SetText($input) }
    OR
    ls | clip

使用SnapIns

  1. TFS中两个变更集之间的文件

    Get-TfsItemHistory <location> -Recurse -Version <label1>~<label2> | % { $(Get-TfsChangeset $_.ChangeSetID).Changes } | % { $_.Item.ServerItem } | Sort-Object -Unique

  2. 获取Exchange 200中所有Hub服务器上存在错误的队列消息

    Get-ExchangeServer | ?{$_.IsHubTransportServer -eq $true} | Get-Queue | ?{$_.LastError -ne $null} | Sort-Object -Descending -Property MessageCount | ft -Property NextHopDomain,@{l="Count";e={$_.MessageCount}},@{l="Last Try";e={$_.LastRetryTime.tosting("M/dd hh:mm")}},@{l="Retry";e={$_.NextRetryTime.tostring("M/dd hh:mm")}},Status,LastError -AutoSize

  3. 这段代码是用于在 Exchange 服务器中获取正在运行的邮件队列信息。首先,使用 "Get-ExchangeServer" 命令获取所有 Exchange 服务器的列表,然后使用 "?{$_.IsHubTransportServer -eq $true}" 过滤出 Hub Transport 服务器。接下来,在获取到的邮件队列中再次使用 "?{$_.LastError -ne $null}" 来过滤掉没有错误的邮件队列。最后,按照邮件数量排序,输出 NextHopDomain、Count、Last Try、Retry、Status 和 LastError 等属性的值,并自动调整表格的宽度。

投票应该成为社区维基百科。 - JaredPar
1
通常来说,这些问题也不应该出现在SO上。 - EBGreen
1
@EBGreen:通常来说,它们并不会这样做。不过我觉得这个还不错(如果我们澄清措辞的话)。它可以作为一个很好的个人陈述介绍。 - Joel Coehoorn
我同意这个特定的投票可能比大多数更合适。但说实话,我认为一组单行代码会是 PowerShell 的可怕介绍。其中涉及各种别名和假定的知识。例如,我的最爱之一是“ii”。这对初学者没有任何帮助。 - EBGreen
2
呃,这不是一个问题。像这样的东西应该放在http://wiki.poshcode.org之类的地方。 - Jaykul
4
仅仅将许多废话放在一行上,并不能真正将其称为“一行”。 - Seb Nilsson
19个回答

21

大约在晚上6点左右...

exit

13
列出我今天更新过的所有文件:
dir | ?{$_.LastWriteTime -ge [DateTime]::Today}

我使用它如此之频繁,以至于我在我的个人资料中创建了一个小函数:

function Where-UpdatedSince{
Param([DateTime]$date = [DateTime]::Today,
      [switch]$before=$False)
Process
{ 
    if (($_.LastWriteTime -ge $date) -xor $before)
    {
        Write-Output $_
    }
} 
};  set-item -path alias:wus -value Where-UpdatedSince

所以我可以这样说:

dir | wus
dir | wus "1/1/2009"

查看今天之前更新的内容:

dir | wus -before

Where-UpdatedSince声明为函数更有意义。此外,-before参数可以是[switch] - stej
@stej - Where-UpdatedSince 是一个函数。我已经将-before参数更新为开关。当我最初编写它时,PS v1中还没有这个功能。 - zdan
我本意是“过滤器”,而不是“函数” :) 我只是添加了注释以使它保持最新状态 - 供任何人查看你的帖子。 - stej

13

好的,这是我经常使用的一个命令以及一些解释。

ii .

ii 是 Invoke-Item 的简称。该命令本质上调用了在 Windows 中为以下项目注册的任何命令。因此,下面的命令:

ii foo.xls

会在 Excel 中打开 foo.xls(假设您已安装 Excel 并且 .xls 文件已关联到 Excel)。

ii . 中,. 指当前工作目录,因此该命令将导致 Windows 资源管理器在当前目录中打开。


3
在普通提示符中,您可以输入 "foo.xls" 并启动 Excel/OpenOffice/任何您关联的应用程序。输入 "Explorer" 将在该位置启动 Windows 文件浏览器会话。 - Christian Witts
我通常使用 start .start myFile.xlsstart "" "My File.xls" 来完成这个操作。那么,Invoke-Item 命令相比普通的 start 命令有何优势呢? - Hosam Aly
@Hosam,你在PowerShell中使用start myfile.xls吗? - EBGreen
@Christian,严谨地说,键入foo.xls是不起作用的,你必须键入.\foo.xls。此外,你是正确的,键入Explorer将起作用,但与ii的4个字符相比,那是8个字符。 - EBGreen
EB,如果你喜欢的话,我可以录制它 ;) - Christian Witts
显示剩余6条评论

6

我最喜欢的PowerShell一行代码

gps programThatIsAnnoyingMe | kill

4
($x=new-object xml).Load("http://rss.slashdot.org/Slashdot/slashdot");$x.RDF.item|?{$_.creator-ne"kdawson"}|fl descr*

我的最爱:这是一个没有kdawson先生可怕投稿的slashdot阅读器。它被设计为少于120个字符,这使得它可以用作/上的签名。


3
我发现显示环境变量的值很有用。
dir env:

你也可以将环境变量的值复制到剪贴板中。
$env:appdata | % { [windows.forms.clipboard]::SetText($input) }

“在调用之前,您需要加载Windows.Forms:请添加类型 -a system.windows.forms; 并使用-STAswitch运行PowerShell。”

3

检索并显示系统特殊文件夹的路径

[enum]::getvalues([system.environment+specialfolder]) | foreach {"$_ maps to " + [system.Environment]::GetFolderPath($_)}

3

我不喜欢复杂的代码行数统计应用程序,尤其是因为我认为它本身就是一种虚假指标。我最终选择使用一个PS one-liner:

PS C:\Path> (dir -include *.cs,*.xaml -recurse | select-string .).Count

我只需在代码行数中包含我想要包括的文件扩展名,并从项目的根目录开始处理。


1
我通常会执行 (gci -r -inc *.cs,*.xaml|gc)-ne''|measure - Joey

3

我犹豫是否要逐一列举我的PowerShell单行代码,因为目前这个列表已经有大约400个条目了! :-) 但是这里有一些我最喜欢的,以激发你的兴趣:

  • 列出所有类型加速器(需要PSCX):[accelerators]::get
  • 将XML的字符串表示转换为实际的XML:[xml]"<root><a>...</a></root>"
  • 转储对象(增加深度以获得更多细节):$PWD | ConvertTo-Json -Depth 2
  • 通过子字符串从历史记录中调用命令(查找早期的'cd'命令):#cd
  • 访问C#枚举值:[System.Text.RegularExpressions.RegexOptions]::Singleline
  • 生成条形图(需要Jeff Hicks的cmdlet):ls . | select name,length | Out-ConsoleGraph -prop length -grid

整个系列文章已经在Simple-Talk.com上公开发表成为4部分 -- 我希望这些内容对SO的读者有所帮助!

我本来想把这个系列叫做"在一行PowerShell中做任何事情",但我的编辑希望更简洁一些,所以我们改成了PowerShell One-Liners。虽然为了充分公开,只有大约98%左右的内容真正符合“一行”这个词的精神;我认为四舍五入已经足够接近了... :-)

太棒了,@Michael 写的这篇文章是 PowerShell 的一站式参考! - Binoj Antony

3

取消 Visual Studio 2012 全大写菜单 - 在安装完VS2012后,我做的第一件事。

Set-ItemProperty -Path HKCU:\Software\Microsoft\VisualStudio\11.0\General -Name SuppressUppercaseConversion -Type DWord -Value 1

感谢Richard Banks发现了该注册表键值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接