(已解决) 关于函数 system 的两个问题

大佬们,新年好😄

关于函数 system 我有两个问题想求助,论坛里在年前有过一个关于 system 帖子,搭了一下顺风车,了解到了 system 可以执行 powershell 命令,这相当于用一个函数把一门编程语言给激活了。我看官方的函数文档也做了更新,补充了对 powershell -c 的简单说明。现在又旧事重提,只因疑惑尚存,望见谅。

举个简单的例子如下,A1:A3 是几个文本串,想通过 powershell 命令把文本串中的数字扩大 20 倍,此例没有其他意图,纯粹是为了学习,SPL 语句如下所示:

A B
1 a:1 b:2 c:3
2 d:11 e:12 f:13
3 g:14 h:15 i:16
4 =([A1:A3]*680).concat@ci() 文本加单引号,用逗号隔开
5 ="powershell -c"+A4+"| % {[regex]::replace($_,'\\d+',{(0+$args[0].value)*20})} | out-file 结果.txt -enc utf8" powershell 数组作为参数传递
6 =system(A5)

A4 格把 A1:A3 的文本串添加单引号后用逗号连接,模拟 powershell 里的数组,作为参数传递给 A5。
A5 格中拼接成 powershell 的命令,其中的 out-file 把结果输出给 txt 文件。运行之后,可以在集算器的安装路径下的 bin 文件夹里看到这个输出文件 (因为没有指定输出路径),截图如下:

imagepng

可以看到,数字都按要求扩大了 20 倍,输出的结果是 2040 行,因为把上述 3 个文本数组乘了 680 次。一切正常,运行的速度貌似也可以。

如果把上述 3 个文本数组乘 681 次,数组长度变成 2043,就会出现以下报错:

imagepng

这个错误应该是文本长度受限了,我在 powershell 中做了同样的测试,能正常运行。所以,

问题 1:system() 里的文本长度是不是有限制?

(后注:命令行文本长度限制跟 SPL 无关,应该是微软的问题,powershell 长度限制 32766 字符,cmd 长度限制更短,可能是 8000 多字符,这个具体没有测试。)

接下来就是 system 执行后返回值的问题,也就是代码格中 A6 的返回值,如果正常,system 就返回 0,如果出错,就会返回 1(也有出现过 255)。powershell 命令并不是都会有返回值,比如对文件夹和文件的复制,移动,删除,增加等操作,不会有返回值。但也有一些命令是有返回值的,比如对文件夹文件目录路径的操作,或者一些计算等。比如,在 VBA 里调用 powershell 时可以通过 StdOut.ReadAll 或者 StdErr.ReadAll 读出返回信息,截图如下:

imagepng

在 SPL 中,这部分返回值会出现在日志文件中,日志文件里的信息比较多,不仅仅是 powershell 的执行结果,如果要解析出这部分结果会比较费劲。要么在 powershell 命令中重定向输出至指定文件,然后再用 spl 语句把该文件读出结果,等使用完之后,再用 movefile 把这个文件删除,略显复杂。所以,

问题 2:SPL 在用 system 执行命令后,其返回值能否出现在代码格中?(已解决)

上述两个问题,恳请大佬们得闲时给予帮助,谢谢🙏 🙏