用于存储字符串的PowerShell数组

时间:2014-02-19 15:21:25

标签: string powershell arrays

我有一份文件列表,我将其分成几部分。这有效,但我希望能够单独引用每个部分。问题在于我的数组不希望/能够接受字符串。文件命名格式为custID_invID_prodID或custID_invID_prodID_Boolvalue。

$files = Get-ChildItem test *.txt
[string]$custId = $files.Count
[string]$invID = $files.Count
[string]$prodID = $files.Count
[int]$Boolvalue = $files.Count
foreach($file in (Get-ChildItem test *.txt)) {
    for($i = 0; $i -le $files.Count; $i++){
        $custId[$i], $invID[$i], $prodID[$i], $Boolvalue[$i] = $file.BaseName -split "_"
        Write-Host $custId, $invID, $prodID, $Boolvalue
    }
}

我看到的错误信息是:

  

无法索引System.String类型的对象。

我该怎么做?

3 个答案:

答案 0 :(得分:5)

我建议使用对象而不是很多字符串数组。我在下面有一个例子,我已经替换了文件列表,因为我没有使用普通数组的文件结构。只需删除该数组声明并输入Get-ChildItem调用即可,它应该可以正常工作。

function ConvertTo-MyTypeOfItem
{
    PARAM (
        [ValidatePattern("([^_]+_){3}[^_]+")]
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [string]$StringToParse
    )

    PROCESS {
        $custId, $invId, $prodId, [int]$value = $StringToParse -split "_"
        $myObject = New-Object PSObject -Property @{
            CustomerID = $custId;
            InvoiceID = $invId;
            ProductID = $prodId;
            Value = $value
        }
        Write-Output $myObject
    }
}

# In the test scenario I have replaced getting the list of files
# with an array of names. Just uncomment the first and second lines 
# following this comment and remove the other $baseNames setter, to
# get the $baseNames from the file listing

#$files = Get-ChildItem test *.txt
#$baseNames = $files.BaseName
$baseNames = @(
    "cust1_inv1_prod1_1";
    "cust2_inv2_prod2_2";
    "cust3_inv3_prod3_3";
    "cust4_inv4_prod4_4";
)

$myObjectArray = $baseNames | ConvertTo-MyTypeOfItem 

$myObjectArray

上述函数将返回包含CustomerIDInvoiceIDProductIDValue属性的对象。在上面的示例中,调用函数并将返回的数组值设置为$myObjectArray/code> variable. When output in the console it will give the following output:

InvoiceID                CustomerID               ProductID                                  Value
---------                ----------               ---------                                  -----
inv1                     cust1                    prod1                                          1
inv2                     cust2                    prod2                                          2
inv3                     cust3                    prod3                                          3
inv4                     cust4                    prod4                                          4

答案 1 :(得分:1)

在我看来,你正在艰难地做这件事。为什么文件的每个“字段”都有4个数组?创建数组数组会更好 - 第一个索引表示文件,第二个表示文件中的字段:

$files = Get-ChildItem test *.txt

$arrFiles = @(,@());
foreach($file in $files ) {
    $arrFile = $file.BaseName -split "_"
    $arrFiles += ,$arrFile;
}
Write-Host "listing all parts from file 1:"
foreach ($part in $arrFiles[1]) {
    Write-Host $part
}
Write-Host "listing part 0 from all files":
for ($i=0; $i -lt $arrFiles.Count ; $i++) {
    Write-Host $arrFiles[$i][0];
}

答案 2 :(得分:1)

因为您正在尝试索引System.String类型的对象!您将所有变量设置为字符串以开始,然后尝试分配给索引,我认为这将尝试将字符串分配给您提供的索引处的字符位置。

这是未经测试但应该是正确的方向。

$custIdArr = @()
$invIDArr = @()
$prodIDArr = @()
$BoolvalueArr = @()
foreach($file in (Get-ChildItem test*.txt)) {
    $split = $file.BaseName -split "_"
    $custId = $split[0];  $custIdArr += $custId
    $invID = $split[1];  $invIDArr += $invId
    $prodID = $split[2];  $prodIDArr += $prodID
    $boolValue = $split[3];  $boolValueArr += $boolValue
    Write-Host $custId, $invID, $prodID, $Boolvalue
}

创建一组空数组,循环遍历目录,拆分每个文件的文件名,将拆分结果附加到相关数组中。

为了清楚起见,我将$custId, $invID, $prodID, $Boolvalue分配给$split,您可以选择直接从$invIDArr += $split[1] var添加到数组,即{{1}}