输出重定向仅使用 jq 生成空文件

Output Redirection produces empty file ONLY with jq

我有一个有趣的问题。我正在使用 jq 从批处理脚本中缩小 JSON,我希望它替换它读取的文件。虽然可能有更好的解决方案,但它应该在纸面上工作,但在实践中工作。

作品:

for /R %%f in (*.json) do (
    ECHO Minifying JSON file "%%f"
    (ECHO Hello) 1> "%%f"
)

输出文件:

Hello


显示重定向有效

for /R %%f in (*.json) do (
    ECHO Minifying JSON file "%%f"
    ("path\to\jq" . --unbuffered --compact-output "%%f" && ECHO Hello) 1> "%%f"
)

输出文件:

Hello


显示 jq 产生输出

for /R %%f in (*.json) do (
    ECHO Minifying JSON file "%%f"
    "path\to\jq" . --unbuffered --compact-output "%%f"
)

在CMD中输出Window:每个JSON文件的内容,缩小(就像我想要的那样)


我正在尝试做什么

for /R %%f in (*.json) do (
    ECHO Minifying JSON file "%%f"
    ("path\to\jq" . --unbuffered --compact-output "%%f") 1> "%%f"
)

输出文件:


如您所见,没有 JSON 存在,缩小或其他。


关于答案

@peak gave 。在我的情况下,我得出以下结论:

for /R %%f in (*.json) do (
    ECHO Minifying JSON file "%%f"
    powershell -Command "& {.\..\info\jq . --unbuffered --compact-output \"%%f\"|Set-Content \"%%f\"}"
)

这会输出正确的、缩小的 JSON。 我在这里所做的是调用 PowerShell 来处理缩小,并使用 Set-Content cmdlet。

即使它有效或看起来有效,使用输出重定向盲目地覆盖输入文件通常不是一个好主意,或者更糟。

在(众所周知的)环境中 sponge 实用程序可用,可以使用,但看起来您可能没有那么奢侈,因此您可能需要考虑使用临时文件的更普通的方法。

PowerShell 用户可以使用 SetContent: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/set-content?view=powershell-5.1

您不能覆盖您正在读取的文件,因为第一个操作将是通过重定向(重新)创建文件,然后 jq 将从一个空文件读取。

重定向到一个临时文件,完成后替换原文件即可。