windows Raku:shell调用中带空格的语法是什么?

zi8p0yeb  于 2023-10-22  发布在  Windows
关注(0)|答案(5)|浏览(89)

编辑:我将此作为一个bug报告给了Raku:qqx,shell不能正确操作报价https://github.com/rakudo/rakudo/issues/3518
其中一个管理员向我推荐了How should Proc::Async.new,run and shell call cmd.exe?https://github.com/Raku/problem-solving/issues/20
这听起来确实像是正在发生的事情,特别是“不可能使用^.来转义空格”这部分。
如果有人想出一个变通办法,我会很感激的。
Windows 7和Windows 10-1909
Rakudo星星版本2019.03.1
如何在Raku中编写此命令?

fsutil usn readdata "C:/NtUtil/test 1"

最大的问题是文件名中有一个空格,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\"",))
kr98yfug

kr98yfug1#

shell

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

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

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

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

qlckcl4x2#

你好,我一直在测试Perl 6现在Raku从Windows 7到Windows 10。我不知道这是否解决了问题,但对我来说,这是有效的:在文件.rk或file.pl中写入:
shell“fsutil fsinfo drives & pause”;
fsutil和pause都可以工作。

siotufzp

siotufzp3#

也许这会有帮助:
您可以尝试使用^转义文件路径中的空格
范例:

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

kcugc4gi4#

我有一个解决方案,任何人停止,因为这个错误:我正在利用批处理编程语言中的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
sdnqo3pr

sdnqo3pr5#

我搞砸了很长时间;我差点就跟拉库分手了最后用powershell写了这个:希望这对某人有帮助。

my $vscode = q/C:\Users\pb\AppData\Local\Programs\Microsoft VS Code\Code.exe/;
my $file = q/C:\temp\Notes 2023-09.md/;
qqx{echo \& \"$vscode\" \"$file\"};

编辑:回答原始问题

my $fsutil = q/C:\Windows\System32\fsutil.exe/;
my $file = q/C:\temp\Notes 2023-09.md/;
say qqx{echo \& \"$fsutil\" usn readdata \"$file\"};

相关问题