Eu executo este comando:
Get-ChildItem -recurse -file | ForEach-Object { (Get-Content $_).Replace('hi there','hello') | Set-Content $_ }
e recebo este erro:
InvalidOperation: You cannot call a method on a null-valued expression.
InvalidOperation: You cannot call a method on a null-valued expression.
Você sabe por que isso acontece?
Como observa Santiago Squarzon - talvez surpreendentemente - usar
Get-Content
para ler um arquivo vazio0
( bytes) produz$null
(independentemente de você também usar-Raw
). [1]Chamar qualquer método
$null
resulta no erro que você viu.Uma solução simples é filtrar os arquivos vazios e, de qualquer maneira, não faz sentido substituí-los:
Observe as seguintes melhorias adicionais:
$_ | Get-Content
é equivalenteGet-Content -LiteralPath $_.FullName
e garante que cada arquivo de entrada seja passado por seu caminho completo e que o caminho seja interpretado literalmente (literalmente).-Raw
garante que o conteúdo do arquivo seja lido como uma string única (multilinha) , o que agiliza as substituições.-NoNewLine
evitaSet-Content
anexar uma nova linha extra ao conteúdo do arquivo (potencialmente modificado).[1] Tecnicamente, não usar
-Raw
emite um "nulo enumerável", o[System.Management.Automation.Internal.AutomationNull]::Value
singleton especial que indica falta de saída de um comando. Porém, no contexto de expressões , como chamadas de métodos, esse valor é tratado da mesma forma que$null
- veja esta resposta para mais informações.Com
-Raw
, você poderia argumentar que a string vazia, em vez de,$null
deveria ser retornada, conforme sugerido na edição nº 3911 do GitHub .