【发布时间】:2020-06-11 00:38:42
【问题描述】:
编辑:我将此作为错误报告给 Raku: qqx,shell不能正常操作引号 https://github.com/rakudo/rakudo/issues/3518
其中一位管理员向我推荐了 Proc::Async.new、run和shell应该如何调用cmd.exe? https://github.com/Raku/problem-solving/issues/20
这听起来确实与正在发生的事情一模一样,尤其是“无法使用 ^ 转义空格”。部分。
如果有人提出解决方法,我将不胜感激。
Windows 7 和 Windows 10-1909
乐道之星版 2019.03.1
如何在 Raku 中编写此命令?
fsutil usn readdata "C:/NtUtil/test 1"
最大的 bug-a-boo 是文件名中有一个空格,Windows 需要在它周围加上双引号。单引号崩溃。
我无法让这两个文件名中的任何一个使用带有空格的文件名。 fsutil 要么看到两个参数,要么看到一个名称实际上包含双引号的参数:
my @Result = qqx { C:/Windows/System32/fsutil.exe usn readdata "$FileName" }.lines;
for @Result -> $Line { say $Line; };
my $proc=run( "dir", "$FileName", :out );
my @RtnStr = $proc.out.slurp-rest.lines;
for @RtnStr -> $Line { say $Line; }
非常感谢, -T
编辑:将 Windows 10-1909 添加到战斗中
编辑:“shell”命令没有症状改变:
@Result = shell( "C:/Windows/System32/fsutil.exe usn readdata \"$FileName\"" ).lines;
for @Result -> $Line { say $Line; };
Usage : fsutil usn readData <filename>
Eg : fsutil usn readData C:\Temp\sample.txt
@Result = shell( "C:/Windows/System32/fsutil.exe usn readdata \"$FileName\"" );
for @Result -> $Line { say $Line; };
退出:
Proc.new(in => IO::Pipe, out => IO::Pipe, err => IO::Pipe, exitcode => 1, signal => 0, pid => 1728, command => ("C:/Windows/System32/fsutil.exe usn readdata \"C:/NtUtil/test 1\"",))
注意“exitcode => 1”和最后一个带有反斜杠的参数
编辑:使用单引号方法:
@Result = shell( 'C:/Windows/System32/fsutil.exe usn readdata "$FileName"' );
导致同样的错误:
Usage : fsutil usn readData <filename>
Eg : fsutil usn readData C:\Temp\sample.txt
Error: The filename, directory name, or volume label syntax is incorrect.
Proc.new(in => IO::Pipe, out => IO::Pipe, err => IO::Pipe, exitcode => 1, signal => 0, pid => 1192, command => ("C:/Windows/System32/fsutil.exe usn readdata \"\$FileName\"",))
【问题讨论】:
-
为什么要使用 Shell 使事情复杂化(Windows 上的 cmd 具有疯狂的引用规则)。只需使用
run就可以了,不是吗?my $proc = run 'fsutil', 'usn', 'readdata', $FileName, :out; -
您在问题上添加的唯一标签是
[raku]。 SO 上的标签会影响哪些受众会接触到您的问题。通过仅使用[raku],您的问题最终会引起所有查看标记为[raku]的问题的人的注意(有或没有其他搜索条件,如“语法”或“shell”)。您显然不是要发布垃圾邮件,但这是您问题的不幸结果之一。我现在已经为您修复了它,但在未来,请通过开始编写您认为可能存在的标签、检查它们的描述并添加您能找到的最好的标签来探索可用的标签。 -
写minimal reproducible example 部分是为了包含足够的信息来证明您的问题是可重现的。读者当然可以猜测你的意思,但那是对 SO 的诅咒。例如,您既没有显示
$FileName的声明,也没有显示say'd 的输出。 (这只是一个示例。)请在发布之前测试您在 Q 中提供的示例是否可重现。为此,请剪切/粘贴您的代码、输入和输出,然后运行它。 (指定编译器版本、平台详细信息等有时也很有帮助。)总而言之,对 SO 的诅咒是不必要地强迫读者做出假设。
标签: windows escaping raku quoting command-line-arguments