在Windows上对具有jq的文件使用通配符

在Windows上对具有jq的文件使用通配符,windows,cmd,jq,Windows,Cmd,Jq,我在Windows8.1上使用JQ1.6,面临着与本文报道的相同的问题 命令就像jq.*一样简单。json失败,出现以下错误: 断言失败 程序:jq.exe 文件:src/main.c,第256行 表达式:wargc==argc 此应用程序已请求运行时 以一种不寻常的方式终止它。请与申请者联系 支持团队了解更多信息 有人能解决这个问题吗?对windows上文件夹中的所有文件使用jq的正确方法是什么 与其他一些操作系统的shell不同,cmd.exe shell不执行通配符扩展 因此,假设您不能

我在Windows8.1上使用JQ1.6,面临着与本文报道的相同的问题

命令就像
jq.*一样简单。json
失败,出现以下错误:

断言失败

程序:jq.exe 文件:src/main.c,第256行 表达式:wargc==argc

此应用程序已请求运行时 以一种不寻常的方式终止它。请与申请者联系 支持团队了解更多信息

有人能解决这个问题吗?对windows上文件夹中的所有文件使用
jq
的正确方法是什么

与其他一些操作系统的shell不同,cmd.exe shell不执行通配符扩展

因此,假设您不能一次只处理一个文件,那么您必须 显式创建文件列表,或使用其他shell

有关更多详细信息和建议,请参阅

如果您使用的是Windows 10:


这是一个奇怪的问题

正如alredy所说,
cmd.exe
不展开通配符,将此工作留给程序。而且
jq
不处理通配符(从问题列表中,稍后将详细介绍)

但这并不是这次失败的全部原因

正如问题所指出的,源代码在断言中失败:
wargc==argc
。读取源代码时,在windows
jq
中,尝试使用

 wchar_t **wargv = CommandLineToArgvW(GetCommandLineW(), &wargc);
尝试检索与
argv[]
argc
等效的变量,但处理多字节参数

由于
cmd
未扩展通配符,因此将有三个参数(有问题的命令行)

argv[]
wargv[]
中,因此
argc
wargc
应该匹配

那么,为什么它会失败呢?为什么
argc
wargc
不同

因为GCC是用来编译程序的

不,问题不在于GCC本身。“问题”在于GCC运行时中的参数处理确实扩展了通配符(Microsoft编译器运行时没有,但这并不重要,因为它也不会解决问题)

这意味着
argc
argv
(由带有通配符扩展的GCC代码确定)将根据匹配通配符的文件数包含信息,而
wargc
wargv
(由不带通配符扩展的MS代码确定)将不包含这些信息

探测它的一种简单方法是,在尝试上一个命令时,只使用一个
.json
文件。断言不会失败,但
jq
将失败,并出现
jq:error:无法打开文件*.json:无效参数
,因为它不处理通配符

jq . test.json       As seen in argv   argc  = 3
jq . *.json          As seen in wargv  wargc = 3
那么,如何应对呢?在不修改
jq
的源代码的情况下,您最好的选择是连接文件列表并将其传递给
jq
。在peak的回答和您的评论中,应该处理这个问题

但是请记住,在
cmd
和批处理文件中,您的命令行限制为8191个字符。如果这还不足以解决您的问题,您可以尝试以下方法(是的,有很多行,其中大多数是注释和命令用法)

@if(@this==@isBatch)@then/*---------------------------------------批处理代码
@回音
setlocal enableextensions disabledelayedexpansion
rem这是一个混合批处理/javascript文件。批处理部件将检索
rem所需信息并启动cscript引擎以执行
rem javascript是该文件的一部分。
rem检索对当前批处理文件的安全引用
调用:getCurrentFile thisFile文件名
当前批处理文件的rem参数是稍后执行的命令行
rem使用环境变量以避免在使用
rem内部Wscript参数处理例程
设置[命令行]=%*
如果未定义[命令行](
回音(
回显用法:command1^|“%fileName%”command2
回音(
回声,其中:
echo command1是一个命令,它生成一组将
连接echo以作为参数传递给command2
回音(
echo command2是使用来自的所有行执行的命令
将command1作为命令行参数回显
回音(
回音示例:
回音(
echo dir/b^|%fileName%”cmd/c echo
echo dir/b*.json^|“%fileName%”jq。
回音(
后藤:eof
)
rem执行此脚本的javascript部分
%windir%\system32\cscript.exe”//nologo//e:JScript“%thisFile%”
后藤:eof
:getCurrentFile完整路径文件名
设置“%~1=%~f0”
设置“%~2=%~nx0”
后藤:eof
-------------------------------------------------------------批处理结束代码
*/@结束//--------------------------------------javascript代码
/*
此脚本将从标准输入读取所有行并执行
由上述批处理代码存储到[commandLine]环境中的命令
变量,作为命令参数传递所有行的串联
出现在标准输入中。
*/
var shell=WScript.CreateObject('WScript.shell')
,commandLine=shell.Environment(“PROCESS”).Item(“[commandLine]”)
,stdIn=WScript.stdIn
,stdOut=WScript.stdOut
,stdErr=WScript.stdErr
,第行=“”
,buffer=[]
;
//从标准输入读取参数列表
而(!stdIn.AtEndOfStream){
如果(
line=stdIn.ReadLine()。替换(/“/g”“)
)buffer.push(““+”行+”);
};
//连接所有参数
buffer=buffer.join(“”);
//如果我们没有命令行,输出我们所遇到的内容
//但是如果我们有一个命令行,执行它,得到它的输出并显示它
//因为我们有可能将其输送到另一个流程。
如果(命令行){
尝试
jq . test.json       As seen in argv   argc  = 3
jq . *.json          As seen in wargv  wargc = 3
dir /b *.json | list2args.cmd jq .