在PowerShell中声明包含另一个变量名的变量(名称)

时间:2017-01-09 01:47:39

标签: powershell

我被困在这里:

$file = gci C:\...\test\ | %{$_.name}
for ($i=0; $i -lt 100; $i++) {
  $array_$i =  gc C:\...\test\$($file[$i])
}

我只是想为目录中的每个文本文件创建多个数组。

除了声明的数组名称 - $array_$i之外,一切正常。

3 个答案:

答案 0 :(得分:2)

PowerShell不支持变量变量(例如php)。

改为使用哈希表:

$files = gci C:\...\test\ | % {$_.Name}
$fileArrays = @{}
for ($i=0;$i -lt $files.Count; $i++){ 
    $fileArrays[$i] =  gc C:\...\test\$($file[$i]) 
}

根据目的,我可能会使用文件名作为密钥。您的日常工作也可以通过以下方式简化:

$fileArrays = @{}
Get-ChildItem C:\...\test\ |ForEach-Object {
    $fileArrays[$_.Name] = Get-Content $_.FullName
}

答案 1 :(得分:2)

您可以使用此脚本轻松地在阵列中添加文件:

$array =New-Object System.Collections.ArrayList
dir c:\testpath | %{$content = gc $_.FullName;$array.Add($content) > $null}

答案 2 :(得分:1)

就个人而言,我会选择已经提出的建议之一。使用某种集合数据结构通常可以大大简化处理大量不同但相似的项目。

  • 创建array of arrays

    $array = @()
    Get-ChildItem C:\...\test | Select-Object -First 100 | ForEach-Object {
      $array += ,@(Get-Content $_.FullName)
    }
    

    在数组子表达式中运行Get-Content调用并在其前面加上一元逗号运算符,可确保附加嵌套数组,而不是单独追加每个元素:

    [
      [ 'foo', 'bar', ... ],
      [ 'baz', ... ],
      ...
    ]
    

    而不是

    [
      'foo',
      'bar',
      'baz',
      ...
    ]
    
  • 创建hashtable of arrays

    $ht = @{}
    Get-ChildItem C:\...\test | Select-Object -First 100 | ForEach-Object {
      $ht[$_.Name] = Get-Content $_.FullName
    }
    

    如果您需要能够通过特定键(在此示例中为文件名)而不是索引来查找内容,则最好使用哈希表。

    {
      'something': [ 'foo', 'bar', ... ],
      'other':     [ 'baz', ... ],
      ...
    }
    

    请注意,如果您有重复的文件名,则必须选择其他密钥(例如,在不同的子文件夹中)。

但是,如果出于某种原因,必须为每个内容数组创建单独的变量,则可以使用New-Variable cmdlet执行此操作:

$i = 0
Get-ChildItem C:\...\test | Select-Object -First 100 | ForEach-Object {
  New-Variable -Name "array_$i" -Value (Get-Content $_.FullName)
  $i++
}