Raku: каков синтаксис для вызовов оболочки с пробелами? - PullRequest
2 голосов
/ 27 февраля 2020

Редактировать: Я сообщил об этом как об ошибке в Raku: qqx, оболочка не работает с кавычками https://github.com/rakudo/rakudo/issues/3518

и один из администраторов направил меня в раздел Как следует Pro c :: Asyn c .new, запустить и вызвать оболочку cmd.exe? https://github.com/Raku/problem-solving/issues/20

, который звучит точно так же, как то, что происходит, особенно «Нельзя покинуть пробел, используя ^». часть.

Если кто-нибудь найдет обходной путь, я был бы признателен.

Windows 7 и Windows 10-1909

Rakudo Star версия 2019.03. 1

Как мне написать эту команду в Raku?

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

Большая ошибка в том, что в имени файла есть пробел и Windows требуется двойные кавычки Это. Одиночные кавычки cra sh.

Я не могу заставить ни один из этих двух работать с именем файла с пробелом в нем. 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\"",))

Обратите внимание на «код выхода => 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\"",))

Ответы [ 4 ]

3 голосов
/ 27 февраля 2020

Там shell:

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

Здесь и там будет то же самое. Он также будет использовать существующую общую оболочку для любой операционной системы. Вы также можете использовать переменные, если вы избегаете кавычек, предназначенных для оболочки:

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

или

shell "echo \""~ $words ~ "\""
2 голосов
/ 07 марта 2020

Здравствуйте, я тестировал Perl6, теперь Raku от windows 7 до windows 10. Я не знаю, решает ли это проблему, но для меня это работает: в файле file.rk или file.pl напишите:

оболочка "fsutil fsinfo диски & пауза";

и fsutil, и пауза работают.

1 голос
/ 29 февраля 2020

У меня есть обходной путь для любого, кто остановился из-за этой ошибки: я использую преимущества 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
1 голос
/ 27 февраля 2020

Может быть, это поможет:

Вы можете попробовать освободить место в пути к файлу с помощью ^

Пример:

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