将报价传递到运行程序应用程序我有一个调用“运行程序”的 JMP 脚本,在参数中我需要传递一个 JSON 字符串,但“运行程序”似乎去掉了“选项”字段中的引号。
例如:
my_str = ["key" => 32423]
json = As JSON Expr(my_str)
Run Program(
Executable("/path/to/myexe"),
Options({
json
}),
Read Function( "text")
);
我无法让我的可执行文件在第一个参数中看到引号。 每次它被剥离时,myexe 就无法解析 JSON,因为 key 属性没有被引号括起来。
回复:将报价传递到“运行程序”应用程序中欢迎!
我不确定 RunProgram 是否受到与 cmd.exe 相同的限制,但是https://support.microsoft.com/en-us/help/830473/command-prompt-cmd-exe-command-line-string-limitation表明可以通过这种方式传递的数据有 8K 限制。
如果需要传递更多数据,可以让 RunProgram 将程序的 stdin 和 stdout 连接到 RunProgram ReadFunction 和 WriteFunction。 命令行转义问题消失了,但 JSL 变得更加复杂,因此,如果您只有小字符串 json,可能会坚持使用当前的解决方案。 (使用 stdin/stdout 假定您的程序以这种方式工作。)
RunProgram 没有尝试找出如何转义命令行参数中的特殊字符的逻辑。 使用黑色 dos 框(之前)是了解 dos/cmd.exe 需要什么的好方法。 如果您的数据包含嵌入的空白,情况会变得更糟。
回复:将报价传递到“运行程序”应用程序中谢谢,这确实有效! 我感谢您的帮助。
当然,如果 JSON 更容易在 JMP 脚本中使用,那就太好了。 鉴于 JSON 在数据 I/O 中的使用非常普遍,替代解决方案似乎有点“hacky”。回复:将报价传递到“运行程序”应用程序中JMP 日志中的转义令人困惑,程序会看到您想要的内容。 尝试使用以下写入语句来消除日志中的转义:
my_str = ["key" => 32423];
json = As JSON Expr(my_str);
quote="\!"";
escapedquote = "\!\\!"";
txt = runprogram(executable("ping"),
options({substitute(json,quote,escapedquote)}),
readfunction("text"));
write(txt);
Ping 请求找不到主机 {"key":32423}。 请检查名称并重试。
回复:将报价传递到“运行程序”应用程序中感谢您的快速回复。 鉴于被调用的程序不知道 JMP 及其转义码,我们如何才能获得传递的引用而不是 JMP 转义引用呢?
例如,我希望应用程序看到 {"key":32323},而不是 {\!"key\!":32323}回复:将报价传递到“运行程序”应用程序中这是我对这个问题的攻击;我使用了 dos ping 命令,因为它发回了一条不错的消息:
The second command escapes the quotation marks第二条命令转义引号
我认为你可以在 JMP 中这样做:
my_str = ["key" => 32423];
json = As JSON Expr(my_str);
quote="\!"";
escapedquote = "\!\\!"";
runprogram(executable("ping"),
options({substitute(json,quote,escapedquote)}),
readfunction("text"));
“Ping 请求找不到主机 {\!"key\!":32423}。 请检查名称并重试。
”