草庐IT

windows - Powershell 命令不工作 : removing lines from file1 that are in file2

coder 2024-06-09 原文

我正在使用以下代码从 file1.txt 中删除 file2.txt 中的行。

powershell -Command "$(Get-Content file1.txt) | Where-Object {$_ -notIn $(Get-Content file2.txt)}"

但我收到有关 -notIn 的错误,正在寻找值表达式。但是 file2.txt 确实存在并且不为空。

是什么导致了错误,如何解决?

最佳答案

补充LotPings' helpful answer :

  • 为了执行速度,不执行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 项,其中返回该项本身

(...) ,它只能包含一个单个命令或表达式,是必需的:

  • 阐明表达式中的优先级,
  • 使用命令(cmdlet/函数/外部实用程序调用)作为表达式的一部分。
  • 在管道中,您可以使用它预先强制收集封闭命令的整个输出,但这样做会抵消管道的内存限制优势。
    • 就是说,使用类似 (Get-Content file) | ... | Set-Content file 的东西启用更新给定文件 file “就地” - 但请注意,这需要 file 的全部内容以适应内存。
  • 除非您有如下所述的其他要求,否则请选择 (...)$(...)@(...) .

$(...)只需要:提示 PetSerAl感谢他的帮助。

  • 附上语句,例如ifforeach

  • 包含多个命令/表达式/语句

  • 将以上嵌入"..." (双引号字符串,其内容受到插值(扩展))。
    在列出的运营商中,$(...)唯一可以(直接)嵌入双引号字符串中的。

  • $(...) - 不像 (...) - 如果发生可能终止的错误,不会中止整个命令;例如:

    • '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/

有关windows - Powershell 命令不工作 : removing lines from file1 that are in file2的更多相关文章

随机推荐