Передать аргумент в кавычках со знаками процента в Windows cmd - PullRequest
0 голосов
/ 26 сентября 2019

Я пытаюсь использовать команду Hadoop stat для получения информации о файле из моей HDFS.В Linux вы передаете строки форматирования в stat (аналогично встроенному GNU stat), например:

$ hdfs dfs -stat "type:%F perm:%a %u:%g size:%b mtime:%y atime:%x name:%n" /file

Но я не могу понять, как заставить это работать в Windows cmd prompt:

C:\> hdfs dfs -stat "type:%F" /file

C:\> hdfs dfs -stat "type:%F" /
-stat: java.net.URISyntaxException: Relative path in absolute URI: type:F
...

... похоже, что он пытается интерпретировать первый аргумент как путь, а не второй.Поэтому я подумал: «Может быть, мне нужно включить буквальные кавычки?»Попытка избежать кавычек с помощью ^" не работает:

C:\> hdfs dfs -stat "^"type:%F^"" /
-stat: java.net.URISyntaxException: Relative path in absolute URI: ^^type:F
...

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

C:\> hdfs dfs -stat '^"type:%F^"' /
-stat: java.net.URISyntaxException: Relative path in absolute URI: 'type:F'
...

На этот раз она включала одинарные кавычки, но снова пропустила двойные кавычки.Двойной выход из каратов также не работает:

C:\> hdfs dfs -stat '^^"type:%F^^"' /
-stat: java.net.URISyntaxException: Relative path in absolute URI: 'type:F%5E%5E'
...

Тройной выход из каратов дает тот же результат, что и использование одного карата.

Я обнаружил, что решение kludgey состоит в том, чтобы начинать строку форматирования с %3, а не заключать ее в кавычки

C:\> hdfs dfs -stat %3%u /
3Andrew.Watsonuu

C:\> hdfs dfs -stat %3%u%g /
3Andrew.Watsonsupergroupgg

... но вы можете видеть, что возвращаемое значениеСтрока затем имеет 3 в начале, а последний символ флага удваивается в конце uu или gg.Я думаю, это потому, что %N преобразованы в аргументы, которые я передал этой функции, например:

C:\> hdfs dfs -stat %0 /
stat: `hadoop': No such file or directory
2019-09-25 12:28:00

C:\> hdfs dfs -stat %1 /
stat: `fs': No such file or directory
2019-09-25 12:28:00

C:\> hdfs dfs -stat "%2" /
-stat: Illegal option -stat

Вы можете видеть, что %0, %1 и %2 соответствуютпервый, второй и третий токены в этой команде.Поэтому, когда я вызываю% 3, он подставляет четвертый аргумент в себя.Это объясняет странный повторяющийся сбойный вывод:

C:\> hdfs dfs -stat %3"repeat" /
3repeat"repeat"repeat

Так что лучшее решение, которое я нашел до сих пор , - это передать лишний аргумент в конце (который броситошибка), но затем обратитесь к этому аргументу ранее в команде, например:

C:\> hdfs dfs -stat -R %6 / "%%u %%g %%Y" 2> nul
Andrew.Watson supergroup 1569414480510
Andrew.Watson supergroup 1568728730673
...
Andrew.Watson supergroup 1568103636381
Andrew.Watson supergroup 1568103590659

В конце выдается эта ошибка, которую я скрываю, передав ее в nulДолжен быть лучший способ сделать это.Есть идеи?

...