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

时间:2019-09-05 20:46:09

标签: powershell arguments

我试图在forshell循环中的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)
    }    
}

我有两个问题:

  1. 对于-ArgumentList,先得到FileName1然后再得到FileName2的正确符号是什么?

  2. Read上应用的inFile方法是否真的需要Char[]类型作为$buffer的参数吗?并且有可能获得[String]参数吗?

有人可以给我提示吗?

1 个答案:

答案 0 :(得分:0)

好吧

我确定第一次提交问题时会提醒您,但记住将您的代码放在代码块中,例如:

$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循环中要执行的操作没有任何想法,所以我很乐意帮助您使其对Powershell更加友好,但是您必须先问清楚要问的问题我可以的。