我无法在一个Foreach或Foreach-Object循环中使用多个命令
我的情况是 -
Get-ChildItem $FilePath -Include *.txt
每个文件的结构都相同,只有关键信息不同。 实施例
用户:Somerandomname
计算机:Somerandomcomputer
使用-Replace
命令,我删除了“用户:”和“计算机:”,因此$User = Somerandomname
和$computer = "Somerandomcomputer
。
在每个圈子中,$ user和$ Computer with -Append应写入一个文件。然后应该读取下一个文件。
foreach-object { $file = $_.fullname;
应该使用,但我无法弄清楚它的正确语法。有人可以帮我吗?
答案 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)
如果User
和Computer
位于不同的行,则需要一次读取两行。 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
如果不是这种情况,则需要提供确切的文件格式。