【问题标题】:Raku: what is the syntax for shell calls with spaces?Raku:带空格的 shell 调用的语法是什么?
【发布时间】: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


【解决方案1】:

shell:

shell('echo "two words"'); # OUTPUT: «two words»

这里和那里都是一样的。它还将为任何操作系统使用现有的通用外壳。你也可以使用变量,前提是你转义了指向 shell 的引号:

my $words = "two words"
shell("echo \"$words\"")

shell "echo \""~ $words ~ "\""

【讨论】:

  • JJ。请解决我提出的问题,这不是“回声”。您需要演示如何实际调用我询问的命令并对其进行实际测试。您的所有“回声”解决方案都已尝试过,其中一些,包括 Q["] ~ 。由于您是关闭此错误的人,请证明这不是错误。
  • 那么,shell('echo "two words"'); 是否适合您?
  • 嗨,伊丽莎白。我不在乎 echo 是否有效。我希望fsutil usn readdata "C:/NtUtil/test 1" 工作。我会将使用单引号的结果放在原帖中 -T 没有症状变化
  • 那么,如果您不想回答一个简单的问题,就不要期待答案。因为从 Raku 的角度来看,处理您的特定请求和“回声”示例应该没有区别。 “回声”问题是关于创建一个显示问题的最小示例。
  • 我认为 Windows 将额外的引号视为实际文件名的一部分
【解决方案2】:

您好,我一直在测试 Perl6,现在 Raku 从 Windows 7 到 Windows 10。 我不知道这是否能解决问题,但对我来说它有效: 在 file.rk 或 file.pl 中写入:

shell "fsutil fsinfo 驱动 & 暂停";

fsutil 和 pause 工作。

【讨论】:

    【解决方案3】:

    也许这会有所帮助:

    您可以尝试使用^转义文件路径中的空格

    例子:

    c:\Documents^ and^ Settings\a.bat
    

    【讨论】:

    【解决方案4】:

    对于因这个错误而停止的任何人,我都有一个解决方法: 我正在利用批处理编程语言中的 Windows 构建:

    my $PathIAm = $?FILE;
    ( my $IAm = $PathIAm ) ~~ s| .* "/" ||;
    
    my Str $BatFile = $PathIAm ~ ".bat";
    $BatFile ~~ s:global| '\\' |/|;
    
    my Str $OS = $*KERNEL.name;
    if not $OS eq "win32" { 
       say "Sorry, $IAm only work in Windows.";
       exit; }
    ( $IAm = $PathIAm ) ~~ s| .* '\\' ||;
    
    my Str $CmdStr = 
       Q[@echo off] ~ "\n" ~
       Q[C:\Windows\System32\fsutil.exe usn readdata ] ~
       Q["] ~ $FileName ~ Q["] ~ "\n";
    # say $CmdStr;
    
    
    spurt( $BatFile, $CmdStr );
    say qqx { $BatFile };
    

    结果:

    C:\NtUtil>raku k:\Windows\NtUtil\FileAttributes.pl6 "Test 1"
    
    Major Version    : 0x3
    Minor Version    : 0x0
    FileRef#         : 0x00000000000000000058000000000340
    Parent FileRef#  : 0x00000000000000000013000000000eb9
    Usn              : 0x00000000711dab68
    Time Stamp       : 0x0000000000000000 12:00:00 AM 1/1/1601
    Reason           : 0x0
    Source Info      : 0x0
    Security Id      : 0x0
    File Attributes  : 0x20
    File Name Length : 0xc
    File Name Offset : 0x4c
    

    【讨论】:

      猜你喜欢
      • 2012-09-23
      • 1970-01-01
      • 2021-05-22
      • 1970-01-01
      • 1970-01-01
      • 2019-01-27
      • 2011-05-29
      • 1970-01-01
      • 2019-10-23
      相关资源
      最近更新 更多