Powershell Foreach-Object Foreach循环从多个文件中读取字符串并写入一个

时间:2013-08-13 14:41:12

标签: powershell

我无法在一个Foreach或Foreach-Object循环中使用多个命令

我的情况是 -

  1. 我有很多文本文件,大约100个。 所以他们阅读Get-ChildItem $FilePath -Include *.txt
  2. 每个文件的结构都相同,只有关键信息不同。 实施例

    用户:Somerandomname

    计算机:Somerandomcomputer

  3. 使用-Replace命令,我删除了“用户:”和“计算机:”,因此$User = Somerandomname$computer = "Somerandomcomputer。 在每个圈子中,$ user和$ Computer with -Append应写入一个文件。然后应该读取下一个文件。

    foreach-object { $file = $_.fullname;
    
    应该使用

    ,但我无法弄清楚它的正确语法。有人可以帮我吗?

3 个答案:

答案 0 :(得分:5)

假设您已在其他地方定义$ FilePath,$ user和/或$ computer,请尝试以下操作。

$files = Get-ChildItem $FilePath\*.txt
foreach ($file in $files)
{
  (Get-Content $file) | 
  Foreach-Object { $content = $_ -replace "User:", "User: $user" ; $content -replace "Computer:", "Computer: $computer" } | 
  Set-Content $file
}

您可以使用;Foreach-Object中分隔其他命令,例如,如果您想为您的用户和计算机名称分别设置命令。如果未将带括号的Get-Content cmdlet括起来,则会出现错误,因为当Set-Content尝试使用该进程时,该进程仍会打开$ file。

另请注意,使用Powershell时,双引号中的字符串将评估变量,因此如果您愿意,可以将$ user放入字符串中以执行"User: $user"之类的操作。

答案 1 :(得分:0)

试试这个:

gci $FilePath -Include *.txt | % {
  gc $_.FullName | ? { $_ -match '^(?:User|Computer): (.*)' } | % { $matches[1] }
} | Out-File 'C:\path\to\output.txt'

答案 2 :(得分:0)

如果UserComputer位于不同的行,则需要一次读取两行。 ReadCount的{​​{1}}参数允许您这样做。

Get-Content

这假设每个文件只包含确切形式的行

Get-ChildItem $FilePath -Include *.txt `
| Get-Content -ReadCount 2 `
| %{ $user = $_[0] -replace '^User: ', ''; $computer = $_[1] -replace '^Computer: ', ''; "$user $computer" } `
| Out-File outputfile.txt

如果不是这种情况,则需要提供确切的文件格式。