简化PowerShell代码

时间:2016-10-10 18:30:44

标签: powershell

出于显而易见的原因,试图简化此代码..... 发现这个小小的snippit是一个开始,但我并不确定如何将它纳入更大的方案。

它基本上是一个电话簿CSV文件,我们需要将其分解为多个文件。下面的代码确实有效,但效率非常低:

[char[]](65..90)

以下代码:

GC C:\Users\x\documents\Telephonebook.csv | %{
if ($_.StartsWith("A")){
$_ | out-file -filepath c:\users\aricci\documents\A.asp -append
}

ElseIf ($_.StartsWith("B")){
$_ | out-file -filepath c:\users\aricci\documents\B.asp -append
}

ElseIf ($_.StartsWith("C")){
$_ | out-file -filepath c:\users\aricci\documents\C.asp -append
}

ElseIf ($_.StartsWith("D")){
$_ | out-file -filepath c:\users\aricci\documents\D.asp -append
}

ElseIf ($_.StartsWith("E")){
$_ | out-file -filepath c:\users\aricci\documents\E.asp -append
}

ElseIf ($_.StartsWith("F")){
$_ | out-file -filepath c:\users\aricci\documents\F.asp -append
}

ElseIf ($_.StartsWith("G")){
$_ | out-file -filepath c:\users\aricci\documents\G.asp -append
}

ElseIf ($_.StartsWith("H")){
$_ | out-file -filepath c:\users\aricci\documents\H.asp -append
}

ElseIf ($_.StartsWith("I")){
$_ | out-file -filepath c:\users\aricci\documents\I.asp -append
}

ElseIf ($_.StartsWith("J")){
$_ | out-file -filepath c:\users\aricci\documents\J.asp -append
}

... ETC

2 个答案:

答案 0 :(得分:6)

Martin的答案肯定会有效,但是如果你想减轻IO开销,可以使用Group-Object cmdlet按首字母对条目进行分组,然后将所有条目写入每个文件一次:

$Sets = Get-Content C:\Users\x\documents\Telephonebook.csv |Group-Object {$_[0]} 
foreach($Set in $Sets) {
    $Set.Group |Out-File ("c:\users\aricci\documents\{0}.asp" -f $Set.Name[0]) 
}

正如Ansgar在评论中指出的那样,这种方法比仅仅使用管道更加占用内存

答案 1 :(得分:2)

以下只使用第一个字符作为文件名(请注意,这也可以是一个可以使用过滤器排除的数字):

GC C:\Users\x\documents\Telephonebook.csv | % {
    $_ | out-file -filepath ("c:\users\aricci\documents\{0}.asp" -f $_[0]) -append    
}