什么相当于* Nix' cut'在Powershell中命令?

时间:2014-07-08 14:09:46

标签: powershell split powershell-v2.0

我在配置文件(sample.cfg)中有以下内容,

Time_Zone_Variance(Mins):300
Alert_Interval(Mins):2
Server:10.0.0.9
Port:1840

我尝试在PowerShell中使用:split之后存储每个值。但是我无法产生需要的输出。

有人可以告诉我如何使用PowerShell split解决上述问题吗?

4 个答案:

答案 0 :(得分:9)

您可以使用Get-Content读取文件的内容,然后通过ForEach-Object管道每一行,然后在每一行使用split命令,获取数组中的第二项,如下所示:

$filename = "sample.cfg"

Get-Content $filename | ForEach-Object {
    $_.split(":")[1]
}

<强>输出

300
2
10.0.0.9
1840

<强>更新

我更喜欢@AnsgarWiechers的方法,但是如果你真的需要专门命名的值,你可以创建一个哈希表并用值替换名称:

$configValues = @{
    hour    = "Time_Zone_Variance(Mins)"
    min     = "Alert_Interval(Mins)"
    server  = "Server"
    port    = "Port"
}

Get-Content $filename | ForEach-Object {

    # Courtesy of Ansgar Wiechers
    $key, $value = $_ -split ':', 2

    foreach($configValuesKey in $($configValues.keys)) {
        if ($configValues[$configValuesKey] -eq $key)
        {
            $configValues[$configValuesKey] = $value
        }
    }
}

write-host "`nAll Values:"
$configValues
write-host "`nIndividual value:"
$configValues.port

<强>输出

All Values:

Name                           Value                                                                                             
----                           -----                                                                                             
port                           1840                                                                                              
min                            2                                                                                                 
server                         10.0.0.9                                                                                          
hour                           300                                                                                               

Individual value:
1840

答案 1 :(得分:4)

我想你不想分割线条,但实际上是创建键/值对。这可以这样实现:

$config = @{}
Get-Content 'C:\path\to\sample.cfg' | % {
  $key, $value = $_ -split ':', 2
  $config[$key] = $value
}

您还可以使用ConvertFrom-StringData cmdlet:

Get-Content 'C:\path\to\sample.cfg' | % {
  ConvertFrom-StringData ($_ -replace ':','=')
}

-replace操作是必要的,因为ConvertFrom-StringData期望键和值由=分隔。如果您可以将配置文件中的分隔符从:更改为=,则可以使用ConvertFrom-StringData $_而无需替换。

答案 2 :(得分:4)

这是怎么回事?

json = [{"sydneyTomelbourn":500$},
        {"sydneyToHampshre":100$},
        {"sydneyToUSA":200$}
       ]

答案 3 :(得分:1)

对于更简洁的语法,这也可以解决问题:

((Get-Content "your-file.txt") -Split ":")[1]

因此,使用-Split方法的诀窍是让String返回Get-Content对象(实际上也可以使用别名cat),并从由此产生的String[]对象,您可以使用方括号提取第n 个项目。

  

注意:,由于-Split不是该命令的参数名称,因此无法在Get-Content周围加上括号的情况下使用-Split不会起作用... ?‍♂️