我想从存储在subversion中的脚本位置找到顶层的所有目录.
在C#中它会是这样的
Directory.GetDirectories(".")
.Where(d=>Directories.GetDirectories(d)
.Any(x => x == "_svn" || ".svn"));
Run Code Online (Sandbox Code Playgroud)
我在PowerShell中找到相当于"Any()"的东西有点困难,我不想经历调用扩展方法的尴尬.
到目前为止,我有这个:
Get-ChildItem | ? {$_.PsIsContainer} | Get-ChildItem -force | ? {$_.PsIsContainer -and $_.Name -eq "_svn" -or $_.Name -eq ".svn"
Run Code Online (Sandbox Code Playgroud)
这找到了我svn自己的目录,但不是他们的父目录 - 这就是我想要的.如果您能告诉我添加的原因,可以获得奖励积分
| Select-Object {$_.Directory}
Run Code Online (Sandbox Code Playgroud)
到该命令列表的末尾只显示一系列空行.
在PowerShell v2中,以下行:
1..3| foreach { Write-Host "Value : $_"; $_ }| select -First 1
Run Code Online (Sandbox Code Playgroud)
会显示:
Value : 1
1
Value : 2
Value : 3
Run Code Online (Sandbox Code Playgroud)
因为所有元素都被推下了管道.但是,在v3中,上面的行仅显示:
Value : 1
1
Run Code Online (Sandbox Code Playgroud)
管道在2和3发送之前停止Foreach-Object(注意:-Wait开关Select-Object允许所有元素到达foreach块).
如何Select-Object停止管道,我现在可以从一个foreach或从我自己的函数中停止管道?
编辑:我知道我可以在do ... while循环中包装一个管道并继续管道.我还发现在v3中我可以做这样的事情(它在v2中不起作用):
function Start-Enumerate ($array) {
do{ $array } while($false)
}
Start-Enumerate (1..3)| foreach {if($_ -ge 2){break};$_}; 'V2 Will Not Get Here'
Run Code Online (Sandbox Code Playgroud)
但是Select-Object不需要这些技术中的任何一种,所以我希望有一种方法可以从管道中的单个点停止管道.
我了解到,对于管道中的每个对象,通过开始/处理/结束,处理部分运行多次。所以如果我有一个这样的函数:
function Test-BeginProcessEnd {
[cmdletbinding()]
Param(
[Parameter(Mandatory=$true, ValueFromPipeline=$True)]
[string]$myName
)
begin {}
process {
Write-Host $myName
}
end {}
}
Run Code Online (Sandbox Code Playgroud)
我可以通过管道将数组传递给它,如下所示,它会处理每个对象:
PS C:\> @('aaa','bbb') | Test-BeginProcessEnd
aaa
bbb
PS C:\>
Run Code Online (Sandbox Code Playgroud)
但是如果我尝试在命令行中使用该参数,我只能向它传递 1 个字符串,所以我可以这样做:
PS C:\> Test-BeginProcessEnd -myName 'aaa'
aaa
PS C:\>
Run Code Online (Sandbox Code Playgroud)
但我不能这样做:
PS C:\> Test-BeginProcessEnd -myName @('aaa','bbb')
Test-BeginProcessEnd : Cannot process argument transformation on parameter 'myName'. Cannot convert value to type
System.String.
At line:1 char:30
+ Test-BeginProcessEnd -myName @('aaa','bbb')
+ ~~~~~~~~~~~~~~
+ CategoryInfo : InvalidData: (:) [Test-BeginProcessEnd], ParameterBindingArgumentTransformationException
+ FullyQualifiedErrorId …Run Code Online (Sandbox Code Playgroud) 我搜索过但还没有找到如何做。
我正在研究从大文件(~2GB)中过滤数据。
我使用过Where-Object,当它找到匹配时,它会继续搜索其他有意义的匹配。
有可能在第一场比赛就停止吗?
例如(#1):
Get-Process | Where-Object {$_.ProcessName.StartsWith("svchost")}
Run Code Online (Sandbox Code Playgroud)
输出将是:
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
666 38 26928 18672 92 568 svchost
596 28 11516 16560 92 792 svchost
425 14 5364 7036 45 832 svchost
406 17 7032 8416 39 1004 svchost
Run Code Online (Sandbox Code Playgroud)
我想要的是在第一场比赛后返回输出:
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
666 38 26928 18672 …Run Code Online (Sandbox Code Playgroud)