我运行这个命令:
Get-ChildItem -recurse -file | ForEach-Object { (Get-Content $_).Replace('hi there','hello') | Set-Content $_ }
并得到这个错误:
InvalidOperation: You cannot call a method on a null-valued expression.
InvalidOperation: You cannot call a method on a null-valued expression.
你知道这是为什么吗?
正如Santiago Squarzon所指出的 - 也许令人惊讶 - 使用
Get-Content
读取空文件(0
字节)输出$null
(无论您是否也使用-Raw
)。[1]调用任何方法都会
$null
导致您看到的错误。一个简单的解决方案是过滤掉空文件,无论如何对它们执行任何替换都是没有意义的:
请注意以下附加改进:
$_ | Get-Content
相当于并确保每个输入文件都通过其完整路径传递,并且该路径按字面Get-Content -LiteralPath $_.FullName
解释(逐字)。-Raw
确保文件内容作为单个(多行)字符串读取,从而加快替换速度。-NoNewLine
防止Set-Content
向(可能修改的)文件内容附加额外的换行符。[1] 从技术上讲,不使用
-Raw
会发出“可枚举空值”,这是一种特殊的[System.Management.Automation.Internal.AutomationNull]::Value
单例,表示命令缺少输出。但是,在表达式的上下文中,例如方法调用,该值的处理方式相同$null
- 请参阅此答案以获取更多信息。对于
-Raw
,您可能会认为应该返回空字符串而不是,如GitHub Issue #3911中所建议的那样。$null