输出重定向仅使用 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
将从一个空文件读取。
重定向到一个临时文件,完成后替换原文件即可。
我有一个有趣的问题。我正在使用 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
将从一个空文件读取。
重定向到一个临时文件,完成后替换原文件即可。