我正在使用以下代码从 file1.txt 中删除 file2.txt 中的行。
powershell -Command "$(Get-Content file1.txt) | Where-Object {$_ -notIn $(Get-Content file2.txt)}"
但我收到有关 -notIn 的错误,正在寻找值表达式。但是 file2.txt 确实存在并且不为空。
是什么导致了错误,如何解决?
最佳答案
为了执行速度,不执行Get-Content file2.txt在每个循环迭代中 - 预先缓存其结果。
为了内存效率,不要收集file1.txt的所有行预先 $(...)在通过管道发送它们之前。
因此(为简洁起见,我省略了 powershell -Command "..." 包装器):
$f2 = Get-Content file2.txt; Get-Content file1.txt | Where-Object { $f2 -NotContains $_ }
Which $ are necessary, and why?
(...) 和 $(...) (子表达式运算符)和 @(...) (数组 子表达式运算符)all 收集整个命令的/命令的输出作为一个整体,在一个数组中 ( [System.Object[]] ),除非输出仅包含 1 项,其中返回该项本身。
(...) ,它只能包含一个单个命令或表达式,是必需的:
(Get-Content file) | ... | Set-Content file 的东西启用更新给定文件 file “就地” - 但请注意,这需要 file 的全部内容以适应内存。(...)至 $(...)和 @(...) . $(...)只需要:提示 PetSerAl感谢他的帮助。
附上语句,例如if和 foreach
包含多个命令/表达式/语句
将以上嵌入"..." (双引号字符串,其内容受到插值(扩展))。
在列出的运营商中,$(...)是唯一可以(直接)嵌入双引号字符串中的。
$(...) - 不像 (...) - 如果发生可能终止的错误,不会中止整个命令;例如:
'hi' + $(1/0)和 "hi$(1/0)"报告被零除错误,但仍打印 hi ;相比之下,'hi' + (1/0)不会 - 除零错误会中止整个表达式。$(...) -包含表达式;例如,'hi' + $(Throw 'err')和 "hi$(Throw 'err')"两者都只打印错误信息,而不是 hi . @(...)只需要:
确保命令的输出是一个数组,即使只返回1项;在其他方面,它的行为类似于 $() , 除了你不能在 "..." 中使用它;详细讨论 @() , 请参阅 this answer我的。
在 PSv3+ 中,标量和数组的统一处理通常使得@(...)然而,这是不必要的 - 请参阅 this answer我的。
关于windows - Powershell 命令不工作 : removing lines from file1 that are in file2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44608696/