Powershell 中具有多个变量的 foreach($number)

问题描述 投票:0回答:4

我想在

foreach
中使用多个输入,如下所示:

foreach($numberin in [System.IO.File]::ReadLines(".\numberin.txt") & ($numberout in [System.IO.File]::ReadLines(".\numberout.txt")) 
{ ... }

但不知怎的,“&”在那里不起作用。

像这样

foreach($numberin in [System.IO.File]::ReadLines(".\numberin.txt") -and ($numberout in [System.IO.File]::ReadLines(".\numberout.txt"))

它告诉我“意外的令牌”

像这样

foreach($numberin in [System.IO.File]::ReadLines(".\numberin.txt") -and ($numberout in [System.IO.File]::ReadLines(".\numberout.txt")

它告诉我 foreach 需要一个结束符“)”

澄清我想做什么: 我想从两个变量中的两个文件加载一些输入,并在每次从每个文件加载新行时对它们执行一些操作。

powershell foreach
4个回答
1
投票

如果我理解正确的话,get-content 接受输入文件名数组。它无需额外的括号即可工作。

&
是调用运算符,
-and
是条件运算符。

foreach ($numberin in get-content numberin.txt,numberout.txt) { 
  $numberin 
}

这是使用

$( )
组合两个命令的输出的更通用示例:

foreach ($i in $(dir; get-date) ) { 
  $i 
}

实际上,只要第一个命令成功,

&&
操作符就可以在powershell 7中工作。
||
只会使用第一个文件。

foreach ($i in cat file1 && cat file2 ) { $i }

0
投票

如果您描述一下您想要实现的目标,将会有所帮助。

&
是 Pwsh 7+ 中的调用运算符
&&
是一个 管道链运算符,指示 PowerShell 仅在左侧成功时才运行右侧。
-and
是一个逻辑运算符,根据您提供的代码判断,我认为它没有达到您的预期目的。

如果您尝试合并两个读取操作的结果,您可能会考虑简单地读取它们。在 Pwsh 7+ 中使用

&&
运算符,可能类似于:

[System.IO.File]::ReadLines( 'C:\temp\test2.csv' ) && [System.IO.File]::ReadLines( 'C:\temp\test2.csv' ) |
ForEach-Object{ $_ }

在旧版本中,您可以执行以下操作:

{
    [System.IO.File]::ReadLines( 'C:\temp\test2.csv' )
    [System.IO.File]::ReadLines( 'C:\temp\test2.csv' ) 
}.Invoke() |
ForEach-Object{ $_ }

您也可以将文件读取输出发送到 1 个或多个变量。内存很少是问题,因此您可以将文件读取输出发送到 1 个或多个变量。可能会使代码更易于阅读和使用等...

很容易转换为

ForEach
关键字而不是
ForEach-Object
,但在明确意图/所需结果之前我不会说更多。


0
投票

在 PowerShell 中,使用 Get-Content 加载文件。

$a = Get-Content .\numberin.txt

默认情况下,这将在管道中发出单独的行。

$a = Get-Content .\numberin.txt

$a | Select-Object -First 1 

加载第二个文件。

$a = Get-Content .\numberin.txt
$b = Get-Content .\numberout.txt

您尚未解释您对文件数据的用途。

展望未来,没有必要创建自己的算法来比较文件。您可以使用比较对象

请特别注意

Compare-Object
参数,因为这些选项可能会解决您的一些问题。

$a = get-content .\a.out
$b = get-content .\b.out

Compare-Object $a $b

# output 

InputObject                                                 SideIndicator
-----------                                                 -------------
sapien. Quisque ac lectus sit amet lectus ornare mattis.    =>
Etiam ut placerat purus. Aliquam at hendrerit purus, ac     =>
iaculis risus. In hac habitasse platea dictumst. Aenean eu  =>
potenti. Pellentesque felis ligula, dignissim vel neque     <=
commodo, fermentum pharetra neque. Sed placerat a metus nec <=
tincidunt. Sed massa quam, viverra non viverra eget,        <=

注意

SideIndicator
是一个普通的对象属性。它可以用在过滤器中。

$a = get-content .\a.out
$b = get-content .\b.out

Compare-Object $a $b | Where-Object { $_.SideIndicator -eq "<=" } 

# output 

InputObject                                                 SideIndicator
-----------                                                 -------------
potenti. Pellentesque felis ligula, dignissim vel neque     <=
commodo, fermentum pharetra neque. Sed placerat a metus nec <=
tincidunt. Sed massa quam, viverra non viverra eget,        <=

或者,您可以将文件追加到内存中。

$a = get-content .\a.out
$b = get-content .\b.out

$a, $b

或将结果保存到光盘。

$a = get-content .\a.out
$b = get-content .\b.out

$a, $b | Set-Content .\c.out 

另请参阅


0
投票

这就是我想做的:

#Begin with first line in "numberout.txt"
$counter = 0

foreach ($numberin in [System.IO.File]::ReadLines(".\numberin.txt")){
$numberout = (Get-Content file.txt)[$counter]
$counter = $counter +1

也许有人可以告诉我如何用 [System.IO.File] 替换我的“Get-Content”。

© www.soinside.com 2019 - 2024. All rights reserved.