我想在
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 需要一个结束符“)”
澄清我想做什么: 我想从两个变量中的两个文件加载一些输入,并在每次从每个文件加载新行时对它们执行一些操作。
如果我理解正确的话,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 }
如果您描述一下您想要实现的目标,将会有所帮助。
&
是 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
,但在明确意图/所需结果之前我不会说更多。
在 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
另请参阅
这就是我想做的:
#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”。