Powershell 如何在参数名中使用变量

Powershell 如何在参数名中使用变量,powershell,arguments,Powershell,Arguments,我尝试在for循环中读取powershell脚本中的多个文件,始终动态切换文件名 我尝试了不同的表示法,但仍有错误。 代码如下: $fileName1 = "D:\file333" $fileName2 = "D:\file444" $datePattern =" C.{3} " [Char[]]$buffer = new-object char[] 10000 for ($j=1; $j -le 2; $j++) { [string]$fileNumber = $j.ToStr

我尝试在for循环中读取powershell脚本中的多个文件,始终动态切换文件名

我尝试了不同的表示法,但仍有错误。
代码如下:

$fileName1 = "D:\file333"   
$fileName2 = "D:\file444"
$datePattern =" C.{3} "
[Char[]]$buffer = new-object char[] 10000
for ($j=1; $j -le 2; $j++) 
{
    [string]$fileNumber = $j.ToString()
    $inFile = new-object -TypeName System.IO.StreamReader -ArgumentList 
    $fileName($fileNumber)
    [int]$bytesRead = $inFile.Read($buffer, 0, $buffer.Length)

    while ($bytesRead -gt 0) {
        [string]$bufferString = -join $buffer
        $results = $bufferString | Select-String $datePattern -AllMatches
        $results.Matches.Value
        [int]$bytesRead = $inFile.Read($buffer, 0, $buffer.Length)
    }    
}
我有两个问题:

  • 对于
    -ArgumentList
    ,获取
    FileName1
    ,然后获取
    FileName2
    ,正确的符号是什么

  • 应用于
    infle
    Read
    方法是否确实需要
    Char[]
    类型作为
    $buffer
    的参数?是否可以改为获取
    [String]
    参数

  • 有人能给我一个提示吗?

    好的

    我相信您在第一次提交问题时会被提醒,但请记住将代码放入代码块中,如下所示:

    $fileName1 = "D:\file333"
    
    $fileName2 = "D:\file444"
    
    $datePattern =" C.{3} "
    
    [Char[]]$buffer = new-object char[] 10000
    
    for ($j=1; $j -le 2; $j++)
    
    {
    
       [string]$fileNumber = $j.ToString()
    
       $inFile = new-object -TypeName System.IO.StreamReader -ArgumentList
    
       $fileName($fileNumber)
    
       [int]$bytesRead = $inFile.Read($buffer, 0, $buffer.Length)
    
       while ($bytesRead -gt 0) 
       {
    
          [string]$bufferString = -join $buffer
    
          $results = $bufferString | Select-String $datePattern -AllMatches
    
          $results.Matches.Value
    
          [int]$bytesRead = $inFile.Read($buffer, 0, $buffer.Length) 
        }
    
    }
    
    现在,我真的不确定你想在这里做什么。不管是什么,我强烈建议你围绕它提出一个有根据的问题

    在任何情况下,powershell都不支持您试图创建的行为。这是一个容易落入的新手陷阱。哦,我想找到文件1和2,所以我做了一个循环并使用迭代器,对吗错了

    您需要在包含这些文件的集合上循环。Powershell不会将文件视为集合的一部分,除非您将其放入一个集合中

    试试这个

    $files = @("D:\file3333", "D:\file444")
    $datePattern =" C.{3} "
    [Char[]]$buffer = new-object char[] 10000
    
    foreach(file in files)
    {
       [int]$bytesRead = new-object -TypeName System.IO.StreamReader -ArgumentList $file | $_.Read($buffer, 0, $buffer.length)
       while($bytesRead -gt 0)
       {
          [string]$bufferString = -join $buffer
    
          $results = $bufferString | Select-String $datePattern -AllMatches
    
          $results.Matches.Value
    
          [int]$bytesRead = $inFile.Read($buffer, 0, $buffer.Length) 
        }
    
    }
    
    在这里,我们将文件放入一个集合中,并使用foreach循环迭代该集合。我们可以使用管道操作符将您的多行代码折叠成一行,将文件调用到缓冲流中


    我不知道您在while循环中要做什么,因此我很乐意帮助您使它更友好一些,但在我这样做之前,您必须先问一下您想问的问题。

    请。谢谢您Philippe,它帮助我消除了一个新的障碍!我一部分一部分地阅读一个巨大的文件,并在while循环中寻找模式