我有一份文件列表,我将其分成几部分。这有效,但我希望能够单独引用每个部分。问题在于我的数组不希望/能够接受字符串。文件命名格式为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类型的对象。
我该怎么做?
答案 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
上述函数将返回包含CustomerID
,InvoiceID
,ProductID
和Value
属性的对象。在上面的示例中,调用函数并将返回的数组值设置为$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}}