【问题标题】:Output Redirection produces empty file ONLY with jq输出重定向仅使用 jq 生成空文件
【发布时间】:2021-09-09 02:38:46
【问题描述】:

我遇到了一个有趣的问题。我正在使用 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 窗口中的输出: 每个 JSON 文件的内容,已缩小(就像我想要的那样)


我正在尝试做什么

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

输出文件:

如您所见,没有 JSON 存在,无论是缩小的还是其他的。


关于答案

@peak 给了a workaround using PowerShell。在我的情况下,我得出以下结论:

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。

【问题讨论】:

    标签: windows batch-file jq overwrite io-redirection


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2013-05-18
        • 1970-01-01
        • 1970-01-01
        • 2012-01-30
        • 1970-01-01
        • 2014-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多