1 (изменено: wisgest, 2016-10-30 15:28:38)

Тема: CMD/BAT: «Перенаправление» вывода в GUI

Тема в коллекции: «CMD/BAT: Перенаправление вывода в GUI».

Rumata пишет:
timeout /t 0 >nul 2>&1 && (
	call :pipe-help
	goto :EOF
)

Никак не мог понять, что бы это значило и наконец нашёл:

Rumata пишет:

Способ узнать было ли перенаправление на стандарный ввод скрипта

Таким образом, те, у кого, как и у меня, нет утилиты TIMEOUT, никогда не будут перенаправлены на метку pipe-help, а остальные лишаются возможности посмотреть результат прямым вводом в консоли.

Мне правда посмотреть результат ни в чём, кроме NOTEPAD, не удалось (ни при перенаправлении, ни при прямом вводе, в котором в случае с NOTEPAD действительно мало смысла). Т.е. например

echo Hello world|2 html

возвращает «Bad invocation», впрочем, и в случае явного указания «txt».

2 (изменено: wisgest, 2016-10-31 22:49:27)

Re: CMD/BAT: «Перенаправление» вывода в GUI

Взял TIMEOUT здесь: support.modelamerican.com/downloads/Utilities/Windows/ResKit/timeout.exe — ключ /T не понимает, без него работает как задумано.

wisgest пишет:

…а остальные лишаются возможности посмотреть результат прямым вводом в консоли.

По крайней мере в случае этой версии TIMEOUT доступно явное перенаправленние из CON.

3

Re: CMD/BAT: «Перенаправление» вывода в GUI

возвращает «Bad invocation»

Что возвращают следующие команды в Вашем случае?


assoc .html
ftype htmlfile
( 2 * b ) || ! ( 2 * b )

4 (изменено: wisgest, 2016-10-31 22:32:57)

Re: CMD/BAT: «Перенаправление» вывода в GUI

Rumata

cmd> assoc .html
.html=Opera.HTML

cmd> ftype Opera.HTML
Opera.HTML="C:\Program Files\Opera\Opera.exe" "%1"

Кстати, ASSOC и FTYPE обращаются не HKCR, а напрямую к HKLM\Software\Classes, т.е. не видят настройки на уровне отдельного пользователя:

cmd> assoc .fb2
Не найдено сопоставление для расширения имени файла .fb2.

cmd> ftype fb2_auto_file
Тип файлов 'fb2_auto_file' не найден, или ему не сопоставлена команда открытия.

На мой взгляд, эти команды совершенно напрасно сделаны внутренними командами CMD (а вот ATTRIB и CHCP следовало бы) и о их существовании лучше напрочь забыть. Кроме того, как помнится, одна из этих команд у меня ошибочно себя вела при удалении сопоставления. Ну, и ShellEx никак не учитывается, если это вообще возможно.

5

Re: CMD/BAT: «Перенаправление» вывода в GUI

Вообще-то странно. Вы пишите


cmd> assoc .html
.html=Opera.HTML

cmd> ftype Opera.HTML
Opera.HTML="C:\Program Files\Opera\Opera.exe" "%1"

То есть Вы создали единственный файл 2.bat запустили с какой-то командой, выводящей html-разметку, и не сработало? Вообще-то в Вашем случае должно открываться в опере:

echo:^^^<h1^^^>Hello^^^</h1^^^> | 2 html

Timeout есть на последних виндах - виста, семерка (более поздние наверно тоже содержат). Использовать timeout для проверки запуска батника в конвейере - это трюк. Возможно единственный. К сожалению.

( 2 * b ) || ! ( 2 * b )

6

Re: CMD/BAT: «Перенаправление» вывода в GUI

Заработало после раскавычивания аргументов ASSOC и FTYPE:

cmd> assoc ".html"
Не найдено сопоставление для расширения имени файла ".html".

cmd> ftype "Opera.HTML"
Тип файлов '"Opera.HTML"' не найден, или ему не сопоставлена команда открытия.

7 (изменено: Rumata, 2016-10-31 13:49:31)

Re: CMD/BAT: «Перенаправление» вывода в GUI

У нас какие-то странные результаты


C:\>assoc .html
.html=htmlfile

C:\>assoc ".html"
.html=htmlfile

C:\>ftype htmlfile
htmlfile="C:\Program Files\Internet Explorer\iexplore.exe" %1

C:\>ftype "htmlfile"
htmlfile="C:\Program Files\Internet Explorer\iexplore.exe" %1

Полагаю, понимаете, что речь не о том что у нас с Вами разные браузеры. Я о том, что в кавычках и без кавычек у меня работает одинаково.

( 2 * b ) || ! ( 2 * b )

8

Re: CMD/BAT: «Перенаправление» вывода в GUI

Кстати, ASSOC и FTYPE обращаются не HKCR, а напрямую к HKLM\Software\Classes, т.е. не видят настройки на уровне отдельного пользователя

Решил убедится, что оно так. С помощью ProcMon отфильтровал обращения к реестру cmd.exe при запуске assoc/ftype. Все таки читает из HKCR\Classes

assoc .html


"Time of Day","Process Name","PID","Operation","Path","Result","Detail"
"13:10:53,9223164","cmd.exe","23652","RegQueryKey","HKLM","SUCCESS","Query: HandleTags, HandleTags: 0x0"
"13:10:53,9223632","cmd.exe","23652","RegOpenKey","HKCR","SUCCESS","Desired Access: Maximum Allowed, Granted Access: All Access"
"13:10:53,9224125","cmd.exe","23652","RegQueryKey","HKCR","SUCCESS","Query: HandleTags, HandleTags: 0x0"
"13:10:53,9224786","cmd.exe","23652","RegOpenKey","HKCR\.html","SUCCESS","Desired Access: Query Value"
"13:10:53,9225209","cmd.exe","23652","RegQueryValue","HKCR\.html\(Default)","SUCCESS","Type: REG_SZ, Length: 18, Data: htmlfile"
"13:10:53,9225607","cmd.exe","23652","RegQueryValue","HKCR\.html\(Default)","SUCCESS","Type: REG_SZ, Length: 18, Data: htmlfile"
"13:10:53,9225911","cmd.exe","23652","RegCloseKey","HKCR\.html","SUCCESS",""
"13:10:53,9227249","cmd.exe","23652","RegCloseKey","HKCR","SUCCESS",""

ftype htmlfile


"Time of Day","Process Name","PID","Operation","Path","Result","Detail"
"13:06:49,4887237","cmd.exe","23652","RegQueryKey","HKLM","SUCCESS","Query: HandleTags, HandleTags: 0x0"
"13:06:49,4887623","cmd.exe","23652","RegOpenKey","HKCR","SUCCESS","Desired Access: Maximum Allowed, Granted Access: All Access"
"13:06:49,4888074","cmd.exe","23652","RegQueryKey","HKCR","SUCCESS","Query: HandleTags, HandleTags: 0x0"
"13:06:49,4888403","cmd.exe","23652","RegOpenKey","HKCR\htmlfile\Shell\Open\Command","SUCCESS","Desired Access: Maximum Allowed, Granted Access: All Access"
"13:06:49,4888653","cmd.exe","23652","RegQueryKey","HKCR","SUCCESS","Query: HandleTags, HandleTags: 0x0"
"13:06:49,4888891","cmd.exe","23652","RegOpenKey","HKCR\htmlfile\Shell\Open\Command","SUCCESS","Desired Access: Query Value"
"13:06:49,4889162","cmd.exe","23652","RegQueryValue","HKCR\htmlfile\shell\open\command\(Default)","SUCCESS","Type: REG_SZ, Length: 106, Data: ""C:\Program Files\Internet Explorer\iexplore.exe"" %1"
"13:06:49,4889860","cmd.exe","23652","RegQueryValue","HKCR\htmlfile\shell\open\command\(Default)","SUCCESS","Type: REG_SZ, Length: 106, Data: ""C:\Program Files\Internet Explorer\iexplore.exe"" %1"
"13:06:49,4890139","cmd.exe","23652","RegCloseKey","HKCR\htmlfile\shell\open\command","SUCCESS",""
"13:06:49,4891453","cmd.exe","23652","RegCloseKey","HKCR","SUCCESS",""
( 2 * b ) || ! ( 2 * b )

9 (изменено: wisgest, 2016-10-31 23:08:40)

Re: CMD/BAT: «Перенаправление» вывода в GUI

Rumata пишет:

Полагаю, понимаете, что речь не о том что у нас с Вами разные браузеры.

Разные выпуски CMD.EXE.

Rumata пишет:

Все таки читает из HKCR

Procmon.exe пишет:

20:18:42.5723607 cmd.exe 3856 RegOpenKey HKCR\.fb2 NAME NOT FOUND Desired Access: Query Value

Однако,

cmd> reg query HKCR\.fb2 /ve

! REG.EXE VERSION 3.0

HKEY_CLASSES_ROOT\.fb2
    <безымянный>        REG_SZ  fb2_auto_file


cmd> reg query HKLM\Software\Classes\.fb2 /ve

Ошибка: Системе не удалось найти указанный раздел или параметр реестра

cmd> reg query HKCU\Software\Classes\.fb2 /ve

! REG.EXE VERSION 3.0

HKEY_CURRENT_USER\Software\Classes\.fb2
    <безымянный>        REG_SZ  fb2_auto_file

+ Ссылка на авторитет

Re: Установка соответствий программ для расширений файлов

YMP пишет:

Для ассоциаций есть две ветки в реестре: HKEY_LOCAL_MACHINE\SOFTWARE\Classes и HKEY_CURRENT_USER\Software\Classes. Последняя (ассоциации для текущего пользователя) имеет преимущество. Будет работать то, что написано в ней. Но команды assoc и ftype показывают ассоциации не из неё, а из HKEY_LOCAL_MACHINE, т.е. вариант для всех пользователей.

10

Re: CMD/BAT: «Перенаправление» вывода в GUI

Из Ваших слов и слов YMP следует, что вызовы assoc .html и ftype htmlfile лучше заменить на чтение соответствующих веток ррестра


HKCR\.html
HKCR\htmlfile\Shell\Open\Command

Ну а как тогда случае быть если пользователю запрещен доступ к реестру? Или полного запрета не бывает и какие-то ветки (например, HKCR) доступны всегда?

( 2 * b ) || ! ( 2 * b )

11 (изменено: wisgest, 2016-11-02 19:52:46)

Re: CMD/BAT: «Перенаправление» вывода в GUI

Rumata пишет:

Или полного запрета не бывает и какие-то ветки (например, HKCR) доступны всегда?

Запретить то доступ можно ко всему, но запрет на чтение из HKCR из области запретов, например, на доступ к каталогу %TEMP%.

Rumata пишет:

Из Ваших слов и слов YMP следует, что вызовы assoc .html и ftype htmlfile лучше заменить на чтение соответствующих веток ррестра
<…>

Не всё так просто: Perceived Types, Association Arrays

OFF: Заметил, что в REG QUERY вместо ключа /VE можно использовать /V с пустой строкой в кавычках в качестве параметра (может быть полезно для небольшого упрощения кода при написании функции-обертки, читающей заданный параметр реестра: именованный или безымянный).

12 (изменено: wisgest, 2016-11-01 19:49:08)

Re: CMD/BAT: «Перенаправление» вывода в GUI

Rumata пишет:

<…>
команда, используемая для сохранения потока во временнный файл. По умолчанию это команда "more".

Ежели некоторое приложение, которое генерирует некоторый выходной поток из некоторых данных, генерирует его в UTF-16, то в зависимости от наличия BOM в начале потока MORE либо преобразует его в однобайтную кодировку, либо поместит каждый символ в отдельную строку.


Похоже, что это затруднение преодолимо и входной поток можно передать в выходной без искажений заменой MORE на следующий JScript (в отдельном файле или встроенный в .BAT):

var StdIn = WScript.StdIn, StdOut = WScript.StdOut;
try {
	while (!StdIn.AtEndOfStream) StdOut.Write(StdIn.Read(0x1000));
} catch (e) {
	WScript.Quit(e.number & 0xFFFF);
}

Более того, если запускать этот код с помощью WSCRIPT.EXE, можно обнаруживать отсутствие перенаправления без приёма с TIMEOUT. Правда, при этом явно заданное перенаправление из CON неотличимо от его отсутствия.

13 (изменено: Rumata, 2016-11-01 09:39:35)

Re: CMD/BAT: «Перенаправление» вывода в GUI

Еще одна проблема с more описана здесь http://www.dostips.com/forum/viewtopic. … 069#p37069

With the more command it triggers the pause every 64K lines.

Пауза каждые 64К строк. Не проверял. Но допускаю, что такое возможно.

Если есть проблемы с more ее можно заменить, например, на findstr.
Положить рядом с 2.bat файцл 2-settings.bat:


set "pipetmpsave=findstr "$""
( 2 * b ) || ! ( 2 * b )

14 (изменено: wisgest, 2016-11-01 17:07:23)

Re: CMD/BAT: «Перенаправление» вывода в GUI

Rumata, FINDSTR вообще не распознаёт UTF-16  (а

FIND /V ""

распознаёт, если в начале потока присутствует BOM, но вывод — в однобайтной кодировке в зависимости от текущей кодировки консоли так же, как и у MORE).

А вот при

set "pipetmpsave=wscript in2out.js"

ничего искажаться не должно.