PowerShell将每个字符串部分设置为可重用的变量

时间:2014-02-17 14:32:55

标签: string powershell

我有一个文件夹列表,每个文件夹都采用以下格式:custID_invID_prodID或custID_invID_prodID_Boolvalue。对于每个文件,我需要根据'_'将其分成几个部分。目前我有这段代码:

$files = Get-ChildItem test *.txt
foreach($f in $files){
    $file = @()
    $file += ([String]$f).Split("_")
    $total = ([String]$f).Split("_") | Measure-Object | select count
    Write-Host  "${total}"
    if($total -eq 2) {
    for($i = 2; $i -lt $file.length; $i+=3) {
        $file[$i] = $file[$i].trimend(".txt")
        Write-Host  "${file}"
    }
    }
}

问题是Write-Host“$ {total}”等于@ {Count =#},其中#是在文件中找到"_"的实际次数。如何在if语句中使用$total根据找到"_"的数量执行不同的操作?

3 个答案:

答案 0 :(得分:4)

将您想要的部件直接分配给命名变量而不是使用数组是不是更简单?

foreach($f in (Get-ChildItem test *.txt)) {
    $custId, $invID, $prodID, $Boolvalue = $f.BaseName -split "_"
    Write-Host $custId, $invID, $prodID, $Boolvalue
}

如果名称只有3个部分,则只需将$Boolvalue设置为空字符串。

另请注意,您不必在拆分后修剪最后一个元素的扩展名,只需使用BaseName属性获取没有扩展名的名称。

答案 1 :(得分:2)

您需要获取count-property值,例如if test中的$total.count。你也可以这样清理它。

$files = Get-ChildItem test *.txt
foreach($f in $files){
    $file = @(([String]$f).Split("_"))
    Write-Host "$($file.Count)"
    if($file.Count -eq 2) {
        for($i = 2; $i -lt $file.length; $i+=3) {
            $file[$i] = $file[$i].trimend(".txt")
            Write-Host  "${file}"
        }
    }
}

如果您提供了有关您尝试执行的操作的更多信息,我们可以将其清理得更多。防爆。看起来你想做这样的事情:

Get-ChildItem test *.txt | ForEach-Object {
    $file = @($_.BaseName.Split("_"))
    Write-Host "$($file.Count)"
    if($file.Count -eq 2) {
        Write-Host $file 
    }
}

答案 2 :(得分:1)

在我看来,你正在艰难地做这件事。为什么不:

$x = "aaa_bbb_ccc"
$cnt = $x.Split("_").count