在Windows上对具有jq的文件使用通配符
我在Windows8.1上使用JQ1.6,面临着与本文报道的相同的问题 命令就像在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不执行通配符扩展 因此,假设您不能
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
。读取源代码时,在windowsjq
中,尝试使用
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 .