1 (изменено: Rumata, 2021-10-28 01:26:30)

Тема: CMD/BAT: Обсуждение скриптов создаваемых по принципу "два в одном"

Обсуждение темы CMD/BAT: Скрипт создания скриптов по принципу "два в одном"

Здесь обсуждается cmdize.bat, скрипт создания гибридных скриптов по принципу "два в одном". В результате создаются скрипты-гибриды (другие названия - "химеры", "полиглоты"), по сути являющиеся обертками для вызова интерпретатора и основного скрипта. Идея была заимствована из Perl.

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

2

Re: CMD/BAT: Обсуждение скриптов создаваемых по принципу "два в одном"

Строго говоря, гибрид можно получить из чего угодно. Лет пять тому назад, экспериментируя с различными интерпретаторами и компиляторами, были получены довольно любопытные результаты, которые ныне, увы, стали применяться в некоторых типах малвари (гибридизация, чай, ведь не ограничивается командными сценариями, верно?), так что развитие темы в рамках форума не было и не будет популярным. Да и справедливости ради, тот же PowerShell в нынешнем его виде ушёл далеко вперёд по сравнению со своими предшественниками, причём не только (и не столько) по части функциональности, но и в плане возможностей. Но, раз уж мы говорим о вашем сценарии, как о проекте, то:

1. Нет Lua. Гибридится она, например, так:

:: --[[
@lua "%~f0" %*&exit /b --]]_::
for i,j in ipairs(arg) do print(j) end

2. Julia позволяет загибридить себя множеством различных способов.

:<#=
@julia "%~f0" %*&exit /b =#
println(join(ARGS, ' '))

Это лишь ещё один из возможных.

3. Нет Tcl. С учётом непопулярности темы включение столь же непопулярного интерпретатора вполне очевидно.

::set comment {
  tclsh "%~f0" %*&exit /b
}
foreach arg $argv {puts $arg}

4. Нет SQLite. Если кто-то полагает, что эта, с позволения сказать, СУБД является игрушечной, тот видимо никогда с ней толком и не работал (нужны примеры?) или не шибко вникал в её синтаксис.

5. Нет Rakudo. В сущности, его гибридизация чем-то сродни Perl, так как является инкарнацией последнего, но способов получить гибрид с ним гораздо больше.

6. Нет F#\OCaml. На вопрос "а нужно?" можно парировать репликой рекламного героя пенсионного возраста: "а вдруг?".

7. Нет поддержки NASM, C#, C\C++, VB.NET, sed\awk\vim, Nim и т.д.
Из всего перечисленного многого и не будет. Так что тема обречена вдвойне.

3

Re: CMD/BAT: Обсуждение скриптов создаваемых по принципу "два в одном"

greg zakharov пишет:

гибрид можно получить из чего угодно

Не всегда. Идея гибрида в том, что гибридный код должен быть валидный с точки зрения обоих языков: batch и обертываемого языка.

greg zakharov пишет:

результаты, которые ныне, увы, стали применяться в некоторых типах малвари

Любой (почти любой) язык можно приспособить для написания гадости. Совсем недавно на форуме проходило обсуждение о безопасности AHK.  Не будем затрагивать эту тему.

greg zakharov пишет:

тот же PowerShell

На сколько мне известно, Вы большой знаток Powershell. Здесь я не буду с Вами много спорить. Да и та химера, которую я написал для Powershell весьма ужасна, но я пытался выжать все возможно, чтобы и параметры были доступны через $args, и $input был на месте, и хоть как-то получить имя скрипта.

greg zakharov пишет:

Julia позволяет загибридить себя множеством различных способов

Пусть. Этот взят из документации - синтаксис корректен в bat и julia.

greg zakharov пишет:

Из всего перечисленного многого и не будет

Я и не стремлюсь охватить все. Скрипт расширяется по мере потребности, возможности и необходимости. Тем более я не вижу смысла поддерживать компилируемые языки (типа NASM, C#, C/C++ и прочих).

greg zakharov пишет:

Нет Lua

Спасибо. Дополню в будущем. Искал давно, но не нашел.

Объясните, пожалуйста, значение команды, что остается после удаления комментариев:

::_::
( 2 * b ) || ! ( 2 * b )

4 (изменено: Rumata, 2021-10-28 03:52:58)

Re: CMD/BAT: Обсуждение скриптов создаваемых по принципу "два в одном"

Нашел: https://www.lua.org/manual/5.2/manual.html#3.3.4 (первое упоминание в Lua5.2, в более ранних версиях, кажется, нет)

The goto statement transfers the program control to a label. For syntactical reasons, labels in Lua are considered statements too:


	stat ::= goto Name
	stat ::= label
	label ::= ‘::’ Name ‘::’
( 2 * b ) || ! ( 2 * b )

5

Re: CMD/BAT: Обсуждение скриптов создаваемых по принципу "два в одном"

Гибрид для julia красивый. Сделал его чуть-чуть длинее, красивее и, возможно, синтаксически безопаснее:


0<#= :
@echo off
julia "%~f0" %*
goto :EOF
=#0;
println("hello from Julia")
( 2 * b ) || ! ( 2 * b )

6

Re: CMD/BAT: Обсуждение скриптов создаваемых по принципу "два в одном"

Rumata пишет:

Не всегда. Идея гибрида в том, что гибридный код должен быть валидный с точки зрения обоих языков

Это уже полемика, на крайний случай - дело вкуса.

Rumata пишет:

Объясните, пожалуйста, значение команды, что остается после удаления комментариев

Вижу уже разобрались.

Rumata пишет:

Гибрид для julia красивый.

Обернули в многострочный комментарий и - всё. По аналогии большинство гибридов так и строятся.
Что касается компилируемых языков - на вкус и цвет. А вот sed и awk, портированные под Windows, вполне можно включить. Как и SQLite. Последний, к слову, лично применяется для разбора объёмных CSV и расширения комстроки (например, вывод календаря, конвертирование FILETIME в привычное представление времени и т.д.).

7

Re: CMD/BAT: Обсуждение скриптов создаваемых по принципу "два в одном"

greg zakharov пишет:

можно включить. Как и SQLite

Несложно. Полагаю, что sqlite3 в этом коде можно заменить на другой движок (например, mysql и т.д.).


@echo off
for /f "tokens=1 delims=:" %%n in ( 'findstr /n /r /c:"^-- SQL --" "%~f0"' ) do (
	cmd /c "for /f "usebackq skip=%%n tokens=* eol=" %%s in ( "%~f0" ) do @echo:%%s" | sqlite3 %*
	goto :EOF
)
goto :EOF
-- SQL -- [this marker means that sql statements start below]
select 1, date(), time();

-- SQL -- [nothing important; it's simply comment]
select 2, date(), time();

Пример работы:


>cmdize-sql.bat -echo
select 1, date(), time();
1|2021-10-29|00:38:18
-- SQL -- [nothing important; it's simply comment]
select 2, date(), time();
2|2021-10-29|00:38:18

На более сложных запросах не тестировал - оставляю это Вам.

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

8

Re: CMD/BAT: Обсуждение скриптов создаваемых по принципу "два в одном"

Rumata пишет:

Несложно.

Вы не поняли: не передать что-либо через пайп, а заставить командный сценарий вызвать себя как сценарий SQL. Если интересно, поэкспериментируйте и вы откроете для себя массу интересного.

Rumata пишет:

На более сложных запросах не тестировал - оставляю это Вам.

Толи ирония, толи сарказм...

9

Re: CMD/BAT: Обсуждение скриптов создаваемых по принципу "два в одном"

greg zakharov пишет:

Толи ирония, толи сарказм

НИ то, ни другое.

greg zakharov пишет:

SQLite. Последний, к слову, лично применяется

Просто отдал Вам на более детальное тестирование.

greg zakharov пишет:

заставить командный сценарий вызвать себя как сценарий SQL

Ради спортивного интереса? Типа, "а вот как мы умеем"? Можно, но пока лениво. Надо же вникать в некоторые тонкости синтаксиса SQL вообще и SQLite в частности.

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

10

Re: CMD/BAT: Обсуждение скриптов создаваемых по принципу "два в одном"

Rumata пишет:

Ради спортивного интереса?

Общего развития. Повторюсь, откроете много интересного. В том числе не связанного с SQL, как бы странно это ни звучало.