Форум программистов, компьютерный форум, киберфорум
Наши страницы

Batch (CMD/BAT)

Войти
Регистрация
Восстановить пароль
 
greg zakharov
Покинул форум
1935 / 811 / 206
Регистрация: 07.05.2015
Сообщений: 1,640
#1

Командные сценарии-гибриды - CMD/BAT

20.09.2016, 16:54. Просмотров 3622. Ответов 13
Метки нет (Все метки)

Если господа модераторы не будут против - хотелось бы, чтобы тема была среди закрепленных. Цель ветки - просвещение, суть - создание шаблонов командных сценариев, возможности которых расширяются за счет таких сторонних технологий как, скажем, NodeJS. Тема не нова и уже поднималась мной здесь, однако в виду специфики форума предыдущие версии сценариев, увы, невозможно обновить, а исследования между тем того требуют. Общая суть, полагаю, ясна. Если нет, то кратко это можно выразить в виде следующего FAQа:

Q: Что разумеется под словом "гибрид"?
A: Сценарий, сочетающий в себе командный язык Windows и и некую стороннюю технологию, при этом вызов последней осуществляется первым таким образом, что у пользователя не возникает сомнений в том, что это - всего лишь батник.

Q: Есть ли "мусор" в выводе такого сценария?
A: Главное требование любого гибрида - не выводить мусор в стандартный поток вывода командной строки, иначе говоря, весь вывод в консоль является предсказуемым и ожидаемым.

В общем, с предисловием покончили, перейдем к основе ветке - генератору шаблонов.
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
@echo off
  setlocal enabledelayedexpansion
    set "i=0"
    for %%i in (%*) do set /a "i+=1"
    if !i! neq 1 goto:man
    
    set "map=CMD;CS;JS;HTA;LUA;PHP;PL;PS1;PY;RB;SH;TCL;VBS;WSF"
    call:toUpper %1
    for %%i in (!map!) do if /i "!$!" equ "%%i" set "#=%%i"
    if /i "!#!" equ "" goto:man
    
    set "i=0"
    for /f "tokens=1 delims=:" %%i in (
      'findstr /bn ":!#! :eof_!#!" "%~f0"'
    ) do set "arr.!i!=%%i"&set /a "i+=1"
    set /a "arr.0=arr.0+1", "arr.1=arr.1-1"
    
    3<"%~f0" (
      for /l %%i in (1, 1, !arr.1!) do (
        set /p s=<&3
        if %%i geq !arr.0! echo:!s!
        set "s="
      )
    )>source.cmd
  endlocal
exit /b
 
:toUpper
  for /f "tokens=2 delims=." %%i in (
    '2^>^&1 find /v "" .%1'
  ) do set "$=%%i"
exit /b
 
:man
  for %%i in (
    "Usage: %~n0 [extension]"
    "Where 'extension' is one of the follow:"
    "   cmd - pure cmd template"
    "   cs  - CMD\CSharp template"
    "   js  - CMD\JavaScript (MS JScript or NodeJS)"
    "   hta - CMD\HTA template"
    "   lua - CMD\Lua template"
    "   php - CMD\PHP template"
    "   pl  - CMD\Perl template"
    "   ps1 - CMD\PowerShell template"
    "   py  - CMD\Python template"
    "   rb  - CMD\Ruby template"
    "   sh  - CMD\Bash template"
    "   tcl - CMD\Tcl template"
    "   vbs - CMD\VBscript template"
    "   wsf - CMD\WSF template"
  ) do echo:%%~i
exit /b
 
:CMD
@echo off
  setlocal enabledelayedexpansion
  endlocal
exit /b
:eof_CMD
 
:CS
/* 2>nul
@echo off
  setlocal
    set "key=HKLM\SOFTWARE\Microsoft\.NETFramework"
    for /f "tokens=3" %%i in (
      '2^>nul reg query %key% /v InstallRoot'
    ) do set "root=%%i"
    if /i "%root%" equ "" echo:Could not find .NET root.
    
    for /f "delims=" %%i in (
      'dir /ad /b "%root%" ^| findstr /irc:"v[0-9.].*"'
    ) do (
      set "csc=%root%%%i\csc.exe"
      if exist "%csc%" set "csc=%csc%"
    )
    set "arg=/nologo /t:exe /out:app.exe /optimize+"
    set "arg=%arg% /debug:pdbonly "%~f0""
    %csc% %arg%
    app.exe
  endlocal
exit /b
*/
 
using System;
 
internal sealed class Program {
  static void Clear() {
    Console.CursorTop = Console.CursorTop - 1;
    Console.Write(new String(' ', Console.BufferWidth));
    Console.CursorTop = Console.CursorTop - 2;
  }
  
  static void Main() {
    Clear();
    /* place your code here */
  }
}
:eof_CS
 
:JS
0</* :
@echo off
  setlocal
    rem 2>nul node "%~f0" %*
    cscript /nologo /e:jscript "%~f0" %*
  endlocal
exit /b */0;
// place your code here
:eof_JS
 
:HTA
<!-- :
  @start mshta "%~f0"&exit /b
-->
<html>
  <head>
    <title></title>
    <meta name="author" content="" />
    <hta:application id=""
         applicationname=""
         border="thin"
         contextmenu="no"
         maximizebutton="no"
         minimizebutton="no"
         scroll="no"
         singleinstance="yes"
         sysmenu="yes"
         version="1.0" />
  </head>
  <body>
  </body>
</html>
:eof_HTA
 
:LUA
:: --[[
@echo off
  setlocal
    2>nul lua "%~f0" %*
  endlocal
exit /b
--]]
_____ ::
-- place your code here
:eof_LUA
 
:PHP
:<?php /*
@echo off
  setlocal
    2>nul php "%~f0" %*
  endlocal
exit /b
*/
echo "\r";
 
/* place your code here */
?>
:eof_PHP
 
:PL
@echo off
  setlocal
    2>nul perl -x "%~f0" %*
  endlocal
exit /b
#!perl
# place your code here
:eof_PL
 
:PS1
<# :
  @echo off
    setlocal
      powershell /noprofile /executionpolicy bypass^
      "&{[ScriptBlock]::Create((Get-Content '%~f0') -join [Char]10).Invoke(@(&{$args}%*))}"
    endlocal
  exit /b
#>
# place your code here
:eof_PS1
 
:PY
1>2# : ^
'''
@echo off
  setlocal
    2>nul python "%~f0" %*
  endlocal
exit /b
'''
# place your code here
:eof_PY
 
:RB
@echo off
  setlocal
    2>nul ruby -x "%~f0" %*
  endlocal
exit /b
#!ruby
# place your code here
:eof_RB
 
:SH
:<<EOF
@echo off
  setlocal
    2>nul bash "%~f0" %*
  ebdlocal
exit /b
EOF
# place your code here
:eof_SH
 
:TCL
::set comment {
  @echo off
    setlocal
      2>nul tclsh86t "%~f0" %*
    endlocal
  exit /b
}
# place your code here
:eof_TCL
 
:VBS
::'@cscript /nologo /e:vbscript "%~f0" %*&exit /b
' place your code here
:eof_VBS
 
:WSF
<?xml : version="1.0" encoding="utf-8"?> ^<!-- :
  @cscript /nologo "%~f0?.wsf" //job:JS //job:VBS&exit /b
-->
<package>
  <job id="JS">
    <script language="JScript"><![CDATA[
    ]]></script>
  </job>
  <job id="VBS">
    <script language="VBScript"><![CDATA[
    ]]></script>
  </job>
</package>
:eof_WSF
С момента последнего поста в сценарии произошло достаточно много изменений, например, было ускорено время создания шаблонов как таковых, во-вторых, была добавлена поддержка bash, lua, tcl и C#. Гибрид с bash тестировался в Cygwin, lua и tcl были собраны из исходников, а вот относительно C# не все так просто. Вообще, его поддержка была включена по большей части до кучи, так как в вывод временно попадает "/* 2>nul", которое, впрочем, после затирается. Если показать это на примере:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
C:\sandbox> hybrid.cmd cs
C:\sandbox> vim source.cmd
 
/* 2>nul
@echo off
  setlocal
    set "key=HKLM\SOFTWARE\Microsoft\.NETFramework"
    for /f "tokens=3" %%i in (
      '2^>nul reg query %key% /v InstallRoot'
    ) do set "root=%%i"
    if /i "%root%" equ "" echo:Could not find .NET root.
    
    for /f "delims=" %%i in (
      'dir /ad /b "%root%" ^| findstr /irc:"v[0-9.].*"'
    ) do (
      set "csc=%root%%%i\csc.exe"
      if exist "%csc%" set "csc=%csc%"
    )
    set "arg=/nologo /t:exe /out:app.exe /optimize+"
    set "arg=%arg% /debug:pdbonly "%~f0""
    %csc% %arg%
    app.exe
  endlocal
exit /b
*/
 
using System;
using System.IO;
 
internal sealed class Program {
  static void Clear() {
    Console.CursorTop = Console.CursorTop - 1;
    Console.Write(new String(' ', Console.BufferWidth));
    Console.CursorTop = Console.CursorTop - 2;
  }
  
  static void Main() {
    Clear();
    
    String[] files = Directory.GetFiles(@"C:\sandbox");
    foreach (String file in files) Console.WriteLine(file);
  }
}
Сохраем, и далее:
Windows Batch file
1
C:\sandbox> source.cmd
Как видим, "мусор" мелькает, но все же в итоговом выводе его нет.

Правила ветки
1. Предлагать улучшения по генератору или гибриды с другими языками (с учетом FAQа выше).
2. Рассматриваются исключительно вопросы гибридизации (опять-таки относительно FAQа).
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.09.2016, 16:54
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Командные сценарии-гибриды (CMD/BAT):

Командные файлы - CMD/BAT
Здравствуйте товарищи программисты! У меня вопрос: Командные файлы, это файлы типа .bat? Как его создать? Имеет оно что-то общее с...

PowerShell ломает BAT-сценарии? - CMD/BAT
Непонятное случилось только что. Я нашел тут неподалеку код, который позволяет вывести Оценку производительности на Windows 8.1, как...

Командные файлы DOS - Администрирование Windows
помогите сделать 1. Создайте командный файл для калькулятора и клавиатуры (вывести калькулятор и клавиатуру) 2. Вызов другого...

Сценарии администрирования Windows - Администрирование Windows
Уважаемые, нужны идеи по разработке сценариев администрирования Windows XP/Vista/7. Кто хоть что то в этом понимает прошу помочь. ...

Как из программы выполнять командные сценарии cmd.exe Windows (не через batch-файлы)? - Lazarus
В общем, вопрос в шапке. Есть способ обращаться к заранее приготовленным batch-файлам из проги на freepascal, самый простой способ: ...

Гибриды SSD - SSD
насколько эфективны в работе гибридные SSD ,к примеру как этот? http://www.nix.ru/autocatalog/ssd_oc...1T_127617.html

13
greg zakharov
Покинул форум
1935 / 811 / 206
Регистрация: 07.05.2015
Сообщений: 1,640
19.11.2016, 17:38  [ТС] #2
Очередной релиз, так сказать. Добавлена возможность создания гибрида VB.NET, JScript.NET, AutoIt3, Kixtart и Assembler. В случае с Assembler'ом, во-первых, генерируется не шаблон, а скорее пример гибрида CMD\Assembler с ипользованием NASM (это личное предпочтение, так что стоит это взять на карандаш), во-вторых, требуется линкер, в данном случае используется link.exe из набора MS Build Tools 2015, хотя можно воспользоваться и GCC, словом - дело личных пристрастий.
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
@echo off
  setlocal enabledelayedexpansion
    set "i=0"
    for %%i in (%*) do set /a "i+=1"
    if !i! neq 1 goto:man
    
    set "map=ASM;AU3;CMD;CS;JS;JSN;HTA;KIX;LUA;PHP;PL;PS1;PY;RB;SH;TCL;VBN;VBS;WSF"
    call:toUpper %1
    for %%i in (!map!) do if /i "!$!" equ "%%i" set "#=%%i"
    if /i "!#!" equ "" goto:man
    
    set "i=0"
    for /f "tokens=1 delims=:" %%i in (
      'findstr /bn ":!#! :eof_!#!" "%~f0"'
    ) do set "arr.!i!=%%i"&set /a "i+=1"
    set /a "arr.0=arr.0+1", "arr.1=arr.1-1"
    
    3<"%~f0" (
      for /l %%i in (1, 1, !arr.1!) do (
        set /p s=<&3
        if %%i geq !arr.0! echo:!s!
        set "s="
      )
    )>source.cmd
  endlocal
exit /b
 
:toUpper
  for /f "tokens=2 delims=." %%i in (
    '2^>^&1 find /v "" .%1'
  ) do set "$=%%i"
exit /b
 
:man
  for %%i in (
    "Usage: %~n0 [extension]"
    ""
    "Where 'extension' is one of the follow:"
    "   asm - CMD\Assembler example (not template)"
    "   au3 - CMD\AutoIt template"
    "   cmd - pure cmd template"
    "   cs  - CMD\CSharp template"
    "   js  - CMD\JavaScript (MS JScript or NodeJS)"
    "   jsn - CMD\JScript.NET template"
    "   hta - CMD\HTA template"
    "   kix - CMD\Kixtart template"
    "   lua - CMD\Lua template"
    "   php - CMD\PHP template"
    "   pl  - CMD\Perl template"
    "   ps1 - CMD\PowerShell template"
    "   py  - CMD\Python template"
    "   rb  - CMD\Ruby template"
    "   sh  - CMD\Bash template"
    "   tcl - CMD\Tcl template"
    "   vbn - CMD\VB.NET template"
    "   vbs - CMD\VBscript template"
    "   wsf - CMD\WSF template"
    ""
    "Note that 'asm' requires NASM (tested version 2.12.02) and"
    "link.exe (included into MS toolkit of code compilation)."
    "In fact, you can also use GCC."
  ) do echo:%%~i
exit /b
 
:ASM
;@echo off
;  setlocal
;    set "obj="%~dpn0.obj""
;    set "lnk=link.exe /nologo /subsystem:console"
;    set "lnk=%lnk% %obj% /out:app.exe msvcrt.lib"
;    set "app="%~dp0app.exe""
;    nasm -fwin32 "%~f0"
;    %lnk%
;    app.exe
;    for %%i in (%obj% %app%) do (
;      if exist %%i del /f /q %%i
;    )
;  endlocal
;exit /b
global _main
extern _printf
 
section .data
   str: db 'Sample code', 0xA, 0
section .text
   _main:
      sub  esp, 4
      lea  eax, [str]
      mov  [esp], eax
      call _printf
      add  esp, 4
      ret
:eof_ASM
 
:AU3
;@echo off
;  setlocal
;    2>nul AutoIt3.exe "%~f0" %*
;  endlocal
;exit /b
; place your code here
:eof_AU3
 
:CMD
@echo off
  setlocal enabledelayedexpansion
  endlocal
exit /b
:eof_CMD
 
:CS
/* 2>nul
@echo off
  setlocal enabledelayedexpansion
    set "key=HKLM\SOFTWARE\Microsoft\.NETFramework"
    for /f "tokens=3" %%i in (
      '2^>nul reg query %key% /v InstallRoot'
    ) do set "root=%%i"
    if /i "%root%" equ "" echo:Could not find .NET root.
    for /f %%i in ('dir /ad /b "%root%v*"') do (
      set "path=%root%%%i;!path!"
    )
    for %%i in (csc.exe) do (
      if exist "%%~$PATH:i" set "csc=%%~$PATH:i"
    )
    set "arg=/nologo /t:exe /out:app.exe /optimize+"
    set "arg=%arg% /debug:pdbonly /define:CODE_ANALYSIS"
    %csc% %arg% "%~f0"
    app.exe
  endlocal
exit /b
*/
 
using System;
 
internal sealed class Program {
  static void Clear() {
    Console.CursorTop = Console.CursorTop - 1;
    Console.Write(new String(' ', Console.BufferWidth));
    Console.CursorTop = Console.CursorTop - 2;
  }
  
  static void Main() {
    Clear();
    /* place your code here */
  }
}
:eof_CS
 
:JS
0</* :
@echo off
  setlocal
    rem 2>nul node "%~f0" %*
    cscript /nologo /e:jscript "%~f0" %*
  endlocal
exit /b */0;
// place your code here
:eof_JS
 
:JSN
@set @js=0 /*
  @echo off
    set @js=
    setlocal enabledelayedexpansion
      set "key=HKLM\SOFTWARE\Microsoft\.NETFramework"
      for /f "tokens=3" %%i in (
        '2^>nul reg query %key% /v InstallRoot'
      ) do set "root=%%i"
      if /i "%root%" equ "" echo:Could not find .NET root.
      for /f %%i in ('dir /ad /b "%root%v*"') do (
        set "path=%root%%%i;!path!"
      )
      for %%i in (jsc.exe) do (
        if exist "%%~$PATH:i" set "jsc=%%~$PATH:i"
      )
      set "arg=/nologo /t:exe /out:app.exe /debug+ "%~f0""
      %jsc% %arg%
      app.exe
    endlocal
  exit /b
*/
// place your code here
:eof_JSN
 
:HTA
<!-- :
  @start mshta "%~f0"&exit /b
-->
<html>
  <head>
    <title></title>
    <meta name="author" content="" />
    <hta:application id=""
         applicationname=""
         border="thin"
         contextmenu="no"
         maximizebutton="no"
         minimizebutton="no"
         scroll="no"
         singleinstance="yes"
         sysmenu="yes"
         version="1.0" />
  </head>
  <body>
  </body>
</html>
:eof_HTA
 
:KIX
;@echo off
;  setlocal
;    2>nul Kix32.exe "%~f0" %*
;  endlocal
;exit /b
; place your code here
:eof_KIX
 
:LUA
:: --[[
@echo off
  setlocal
    2>nul lua "%~f0" %*
  endlocal
exit /b
--]]
_____ ::
-- place your code here
:eof_LUA
 
:PHP
:<?php /*
@echo off
  setlocal
    2>nul php "%~f0" %*
  endlocal
exit /b
*/
echo "\r";
 
/* place your code here */
?>
:eof_PHP
 
:PL
@echo off
  setlocal
    2>nul perl -x "%~f0" %*
  endlocal
exit /b
#!perl
# place your code here
:eof_PL
 
:PS1
<# :
  @echo off
    setlocal
      powershell /noprofile /executionpolicy bypass^
      "&{[ScriptBlock]::Create((Get-Content '%~f0') -join [Char]10).Invoke(@(&{$args}%*))}"
    endlocal
  exit /b
#>
# place your code here
:eof_PS1
 
:PY
1>2# : ^
'''
@echo off
  setlocal
    2>nul python "%~f0" %*
  endlocal
exit /b
'''
# place your code here
:eof_PY
 
:RB
@echo off
  setlocal
    2>nul ruby -x "%~f0" %*
  endlocal
exit /b
#!ruby
# place your code here
:eof_RB
 
:SH
:<<EOF
@echo off
  setlocal
    2>nul bash "%~f0" %*
  ebdlocal
exit /b
EOF
# place your code here
:eof_SH
 
:TCL
::set comment {
  @echo off
    setlocal
      2>nul tclsh86t "%~f0" %*
    endlocal
  exit /b
}
# place your code here
:eof_TCL
 
:VBN
rem^ & @echo off
rem^ &   setlocal enabledelayedexpansion
rem^ &     set "key=HKLM\SOFTWARE\Microsoft\.NETFramework"
rem^ &     for /f "tokens=3" %%i in ('2^>nul reg query %key% /v InstallRoot') do set "root=%%i"
rem^ &     if /i "%root%" equ "" echo:Could not find .NET root.
rem^ &     for /f %%i in ('dir /ad /b "%root%v*"') do set "path=%root%%%i;!path!"
rem^ &     for %%i in (vbc.exe) do if exist "%%~$PATH:i" set "vbc=%%~$PATH:i"
rem^ &     set "arg=/nologo /t:exe /out:app.exe /optimize+"
rem^ &     set "arg=%arg% /debug:pdbonly /define:CODE_ANALYSYS"
rem^ &     %vbc% %arg% "%~f0"
rem^ &     app.exe
rem^ &   endlocal
rem^ & exit /b
 
Imports System
 
Friend NotInheritable Class Program
  Private Shared Sub Clear
    Console.CursorTop = Console.CursorTop - 1
    Console.Write(New String(" ", Console.BufferWidth))
    Console.CursorTop = Console.CursorTop - 2
  End Sub
  
  Shared Sub Main
    Clear
    ' place your code here
  End Sub
End Class
:eof_VBN
 
:VBS
::'@cscript /nologo /e:vbscript "%~f0" %*&exit /b
' place your code here
:eof_VBS
 
:WSF
<?xml : version="1.0" encoding="utf-8"?> ^<!-- :
  @cscript /nologo "%~f0?.wsf" //job:JS //job:VBS&exit /b
-->
<package>
  <job id="JS">
    <script language="JScript"><![CDATA[
    ]]></script>
  </job>
  <job id="VBS">
    <script language="VBScript"><![CDATA[
    ]]></script>
  </job>
</package>
:eof_WSF
0
greg zakharov
Покинул форум
1935 / 811 / 206
Регистрация: 07.05.2015
Сообщений: 1,640
15.12.2016, 13:48  [ТС] #3
Добавлен C
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
@echo off
  setlocal enabledelayedexpansion
    set "i=0"
    for %%i in (%*) do set /a "i+=1"
    if !i! neq 1 goto:man
    
    set "map=ASM;AU3;C;CMD;CS;JS;JSN;HTA;KIX;LUA;PHP;PL;PS1;PY;RB;SH;TCL;VBN;VBS;WSF"
    call:toUpper %1
    for %%i in (!map!) do if /i "!$!" equ "%%i" set "#=%%i"
    if /i "!#!" equ "" goto:man
    
    set "i=0"
    for /f "tokens=1 delims=:" %%i in (
      'findstr /bn ":!#! :eof_!#!" "%~f0"'
    ) do set "arr.!i!=%%i"&set /a "i+=1"
    set /a "arr.0=arr.0+1", "arr.1=arr.1-1"
    
    3<"%~f0" (
      for /l %%i in (1, 1, !arr.1!) do (
        set /p s=<&3
        if %%i geq !arr.0! echo:!s!
        set "s="
      )
    )>source.cmd
  endlocal
exit /b
 
:toUpper
  for /f "tokens=2 delims=." %%i in (
    '2^>^&1 find /v "" .%1'
  ) do set "$=%%i"
exit /b
 
:man
  for %%i in (
    "Usage: %~n0 [extension]"
    ""
    "Where 'extension' is one of the follow:"
    "   asm - CMD\Assembler example (not template)"
    "   au3 - CMD\AutoIt template"
    "   cmd - pure cmd template"
    "   c   - CMD\C template"
    "   cs  - CMD\CSharp template"
    "   js  - CMD\JavaScript (MS JScript or NodeJS)"
    "   jsn - CMD\JScript.NET template"
    "   hta - CMD\HTA template"
    "   kix - CMD\Kixtart template"
    "   lua - CMD\Lua template"
    "   php - CMD\PHP template"
    "   pl  - CMD\Perl template"
    "   ps1 - CMD\PowerShell template"
    "   py  - CMD\Python template"
    "   rb  - CMD\Ruby template"
    "   sh  - CMD\Bash template"
    "   tcl - CMD\Tcl template"
    "   vbn - CMD\VB.NET template"
    "   vbs - CMD\VBscript template"
    "   wsf - CMD\WSF template"
    ""
    "Note that 'asm' requires NASM (tested version 2.12.02) and"
    "link.exe (included into MS toolkit of code compilation)."
    "In fact, you can also use GCC."
  ) do echo:%%~i
exit /b
 
:ASM
;@echo off
;  setlocal
;    set "obj="%~dpn0.obj""
;    set "lnk=link.exe /nologo /subsystem:console"
;    set "lnk=%lnk% %obj% /out:app.exe msvcrt.lib"
;    set "app="%~dp0app.exe""
;    nasm -fwin32 "%~f0"
;    %lnk%
;    app.exe
;    for %%i in (%obj% %app%) do (
;      if exist %%i del /f /q %%i
;    )
;  endlocal
;exit /b
global _main
extern _printf
 
section .data
   str: db 'Sample code', 0xA, 0
section .text
   _main:
      sub  esp, 4
      lea  eax, [str]
      mov  [esp], eax
      call _printf
      add  esp, 4
      ret
:eof_ASM
 
:AU3
;@echo off
;  setlocal
;    2>nul AutoIt3.exe "%~f0" %*
;  endlocal
;exit /b
; place your code here
:eof_AU3
 
:C
/* 2>nul
  @echo off
    setlocal
      cl /nologo /MD /O2 /Feapp.exe /Tc "%~f0">nul
      app.exe
      del /f /q app.exe "%~dpn0.obj"
    endlocal
  exit /b
*/
 
#include <windows.h>
#include <stdio.h>
 
void StdOutClear(void) {
  COORD coord;
  SHORT width;
  PCHAR space;
  HANDLE hndl;
  CONSOLE_SCREEN_BUFFER_INFO csbi;
  
  if (INVALID_HANDLE_VALUE != (
    hndl = GetStdHandle(STD_OUTPUT_HANDLE
  ))) {
    if (GetConsoleScreenBufferInfo(hndl, &csbi)) {
      coord.X = csbi.dwCursorPosition.X;
      coord.Y = csbi.dwCursorPosition.Y - 1;
      
      if (SetConsoleCursorPosition(hndl, coord)) {
        width = csbi.dwSize.X - 1;
        space = malloc(width);
        memset(space, ' ', width);
        space[width] = '\0';
        printf("%s", space);
        
        free(space);
        
        coord.Y = csbi.dwCursorPosition.Y - 2;
        SetConsoleCursorPosition(hndl, coord);
      }
    }
  }
}
 
int main(void) {
  StdOutClear();
  // place your code here
  
  return 0;
}
:eof_C
 
:CMD
@echo off
  setlocal enabledelayedexpansion
  endlocal
exit /b
:eof_CMD
 
:CS
/* 2>nul
@echo off
  setlocal enabledelayedexpansion
    set "key=HKLM\SOFTWARE\Microsoft\.NETFramework"
    for /f "tokens=3" %%i in (
      '2^>nul reg query %key% /v InstallRoot'
    ) do set "root=%%i"
    if /i "%root%" equ "" echo:Could not find .NET root.
    for /f %%i in ('dir /ad /b "%root%v*"') do (
      set "path=%root%%%i;!path!"
    )
    for %%i in (csc.exe) do (
      if exist "%%~$PATH:i" set "csc=%%~$PATH:i"
    )
    set "arg=/nologo /t:exe /out:app.exe /optimize+"
    set "arg=%arg% /debug:pdbonly /define:CODE_ANALYSIS"
    %csc% %arg% "%~f0"
    app.exe
  endlocal
exit /b
*/
 
using System;
 
internal sealed class Program {
  static void Clear() {
    Console.CursorTop = Console.CursorTop - 1;
    Console.Write(new String(' ', Console.BufferWidth));
    Console.CursorTop = Console.CursorTop - 2;
  }
  
  static void Main() {
    Clear();
    /* place your code here */
  }
}
:eof_CS
 
:JS
0</* :
@echo off
  setlocal
    rem 2>nul node "%~f0" %*
    cscript /nologo /e:jscript "%~f0" %*
  endlocal
exit /b */0;
// place your code here
:eof_JS
 
:JSN
@set @js=0 /*
  @echo off
    set @js=
    setlocal enabledelayedexpansion
      set "key=HKLM\SOFTWARE\Microsoft\.NETFramework"
      for /f "tokens=3" %%i in (
        '2^>nul reg query %key% /v InstallRoot'
      ) do set "root=%%i"
      if /i "%root%" equ "" echo:Could not find .NET root.
      for /f %%i in ('dir /ad /b "%root%v*"') do (
        set "path=%root%%%i;!path!"
      )
      for %%i in (jsc.exe) do (
        if exist "%%~$PATH:i" set "jsc=%%~$PATH:i"
      )
      set "arg=/nologo /t:exe /out:app.exe /debug+ "%~f0""
      %jsc% %arg%
      app.exe
    endlocal
  exit /b
*/
// place your code here
:eof_JSN
 
:HTA
<!-- :
  @start mshta "%~f0"&exit /b
-->
<html>
  <head>
    <title></title>
    <meta name="author" content="" />
    <hta:application id=""
         applicationname=""
         border="thin"
         contextmenu="no"
         maximizebutton="no"
         minimizebutton="no"
         scroll="no"
         singleinstance="yes"
         sysmenu="yes"
         version="1.0" />
  </head>
  <body>
  </body>
</html>
:eof_HTA
 
:KIX
;@echo off
;  setlocal
;    2>nul Kix32.exe "%~f0" %*
;  endlocal
;exit /b
; place your code here
:eof_KIX
 
:LUA
:: --[[
@echo off
  setlocal
    2>nul lua "%~f0" %*
  endlocal
exit /b
--]]
_____ ::
-- place your code here
:eof_LUA
 
:PHP
:<?php /*
@echo off
  setlocal
    2>nul php "%~f0" %*
  endlocal
exit /b
*/
echo "\r";
 
/* place your code here */
?>
:eof_PHP
 
:PL
@echo off
  setlocal
    2>nul perl -x "%~f0" %*
  endlocal
exit /b
#!perl
# place your code here
:eof_PL
 
:PS1
<# :
  @echo off
    setlocal
      powershell /noprofile /executionpolicy bypass^
      "&{[ScriptBlock]::Create((Get-Content '%~f0') -join [Char]10).Invoke(@(&{$args}%*))}"
    endlocal
  exit /b
#>
# place your code here
:eof_PS1
 
:PY
1>2# : ^
'''
@echo off
  setlocal
    2>nul python "%~f0" %*
  endlocal
exit /b
'''
# place your code here
:eof_PY
 
:RB
@echo off
  setlocal
    2>nul ruby -x "%~f0" %*
  endlocal
exit /b
#!ruby
# place your code here
:eof_RB
 
:SH
:<<EOF
@echo off
  setlocal
    2>nul bash "%~f0" %*
  ebdlocal
exit /b
EOF
# place your code here
:eof_SH
 
:TCL
::set comment {
  @echo off
    setlocal
      2>nul tclsh86t "%~f0" %*
    endlocal
  exit /b
}
# place your code here
:eof_TCL
 
:VBN
rem^ & @echo off
rem^ &   setlocal enabledelayedexpansion
rem^ &     set "key=HKLM\SOFTWARE\Microsoft\.NETFramework"
rem^ &     for /f "tokens=3" %%i in ('2^>nul reg query %key% /v InstallRoot') do set "root=%%i"
rem^ &     if /i "%root%" equ "" echo:Could not find .NET root.
rem^ &     for /f %%i in ('dir /ad /b "%root%v*"') do set "path=%root%%%i;!path!"
rem^ &     for %%i in (vbc.exe) do if exist "%%~$PATH:i" set "vbc=%%~$PATH:i"
rem^ &     set "arg=/nologo /t:exe /out:app.exe /optimize+"
rem^ &     set "arg=%arg% /debug:pdbonly /define:CODE_ANALYSYS"
rem^ &     %vbc% %arg% "%~f0"
rem^ &     app.exe
rem^ &   endlocal
rem^ & exit /b
 
Imports System
 
Friend NotInheritable Class Program
  Private Shared Sub Clear
    Console.CursorTop = Console.CursorTop - 1
    Console.Write(New String(" ", Console.BufferWidth))
    Console.CursorTop = Console.CursorTop - 2
  End Sub
  
  Shared Sub Main
    Clear
    ' place your code here
  End Sub
End Class
:eof_VBN
 
:VBS
::'@cscript /nologo /e:vbscript "%~f0" %*&exit /b
' place your code here
:eof_VBS
 
:WSF
<?xml : version="1.0" encoding="utf-8"?> ^<!-- :
  @cscript /nologo "%~f0?.wsf" //job:JS //job:VBS&exit /b
-->
<package>
  <job id="JS">
    <script language="JScript"><![CDATA[
    ]]></script>
  </job>
  <job id="VBS">
    <script language="VBScript"><![CDATA[
    ]]></script>
  </job>
</package>
:eof_WSF
Шаблоны для Haskell, F#, Erlang, Go и прочего включать не стал по ряду причин, главная из которых - слухи о выпиливании M$ комстроки в последней версии Win 10, так что скорее всего проект либо мигрирует на "рельсы" PowerShell (которая, согласно все тем же слухам позиционируется как замена %comspec%), либо эволиционирует в нечто иное.
0
volodin661
1738 / 849 / 139
Регистрация: 10.12.2013
Сообщений: 2,896
17.12.2016, 17:33 #4
Цитата Сообщение от greg zakharov Посмотреть сообщение
либо эволиционирует в нечто иное.
1) памятуя, что речь идёт о cmd, я бы заменил эволюционирует на деградирует.
2) нмв на практике предпочтительнее вызов
powershell -file myfile.ps1
или
perl myfile.pl
etc,
чем бескорыстный обман пользователя мичуринским гибридом.

Но в качестве вида спорта вполне.
0
Smitis
1628 / 337 / 39
Регистрация: 15.10.2012
Сообщений: 529
18.12.2016, 15:19 #5
Цитата Сообщение от volodin661 Посмотреть сообщение
2) нмв на практике предпочтительнее вызов
powershell -file myfile.ps1
или
perl myfile.pl
etc,
чем бескорыстный обман пользователя мичуринским гибридом.
На практике PowerShell не ассоциирован с выполнением файлов ps1 (двойной клик открывает редактор), не добавлен в PATHEXT и, главное, по умолчанию запрещено выполнение не подписанных скриптов. Проще передать, например, неопытному пользователю cmd-файл для решения его проблемы, который он запустит как любую другую программу, чем объяснять ему, что нужно делать. Да и при работе на чужом компьютере проще два раза кликнуть из проводника на батник, чем выписывать в командной строке пути к файлу где-то там на флешке.
То же самое можно и о других языкам. Даже стандартные js и vbs могут быть ассоциированы с cscript (консольный) или wscript (гуевый) и, на чужом компьютере никогда заранее не знаешь с чем.

По теме.
Можно добавить гибрид cmd+InnoSetup (инсталятор, если что). Там точка с запятой в начале строки воспринимается как начало комментария, т.е. принцип тот же, что и для kixtart, autoit.
Код
iscc.exe "%~f0"
1
volodin661
1738 / 849 / 139
Регистрация: 10.12.2013
Сообщений: 2,896
18.12.2016, 18:20 #6
Smitis,

а зачем ты разместил цитату моего сообщения ( #4 )
под своим, где горячо высказываешься про ассоциацию типов файлов,
неподписанные ( пишется слитно, кстати ) скрипты,
про какие-то передачи неопытному пользователю файлов с решением каких-то его проблем,
а также про многократные клики
на чужом компьютере из проводника на ватник ?
0
Smitis
1628 / 337 / 39
Регистрация: 15.10.2012
Сообщений: 529
18.12.2016, 22:31 #7
Цитата Сообщение от volodin661 Посмотреть сообщение
а зачем ты разместил цитату моего сообщения ( #4 )
под своим, где горячо высказываешься про ассоциацию типов файлов,
С точностью до наоборот, Ваша цитата над моим сообщением. Кстати.
Можете считать, что это было замечание по поводу видов спорта на практике.
0
volodin661
1738 / 849 / 139
Регистрация: 10.12.2013
Сообщений: 2,896
18.12.2016, 22:34 #8
Цитата Сообщение от Smitis Посмотреть сообщение
наоборот
Цитата Сообщение от Smitis Посмотреть сообщение
это было замечание
правильно, наоборот, но какое отношение это замечание имеет к моему сообщению #4 ?
0
Smitis
1628 / 337 / 39
Регистрация: 15.10.2012
Сообщений: 529
18.12.2016, 23:16 #9
Цитата Сообщение от volodin661 Посмотреть сообщение
правильно, наоборот, но какое отношение это замечание имеет к моему сообщению #4 ?
Возможно, моё сообщение содержало много информации, поэтому смысл ускользает, попробуй проще.
В писали
Цитата Сообщение от volodin661 Посмотреть сообщение
2) нмв на практике предпочтительнее вызов
и дале по тексту. Так вот, на практике такой вызов не предпочтителен. Или лучше так, компромиссный вариант, далеко не всегда предпочтительный. Это я, типа, возразил на Ваш "нмв".

П.С.
Хотя, допускаю, что я просто не смог правильно перевести аббревиатуру "нмв" (на мой взгляд?), которое принципиально меняет весь смысл всего 2-го пункта вашего поста.

Добавлено через 16 минут
Ещё немного по поводу моего возражения. Допустим, есть некий пользователь со своей проблемой у которого некая система, ВСЕХ настроек которой мы не знаем. У меня есть скрипт resolve_problem.ps1, который решит проблему. Я передаю этот скрипт пользователю. Далее
- Он скопировал скрипт из форума, создал в notepad-е скрипт, сохранил по умолчанию в documents (!) и выполнил через WinR или из командной строки resolve_problem.ps1. Результат нулевой. То же, powershell -file resolve_problem.ps1. Либо скрипт не найден, либо ассоциации нет, либо прав нет, либо подписи нет.
- Если даже из проводника пользователь кликнет (дважды) по скрипту, результат по прежнему нулевой.

Однако, если это будет простой cmd, то во втором случае он выполнится, а, иногда, даже и в первом случае.
0
volodin661
1738 / 849 / 139
Регистрация: 10.12.2013
Сообщений: 2,896
19.12.2016, 17:13 #10
Smitis,

я два раза дал тебе возможность отойти в сторону и избежать конфуза,
сказав что-нибудь типа 'ой, бес попутал' или 'был безобразно пьян, когда всё это писал',
но ты не внял.
В русском народном эпосе практикуется навязчивая троекратность,
вот и я даю тебе ещё одну попытку оставить в покое моё сообщение #4 и более
не подвергать его безграмотным нападкам.
0
Smitis
1628 / 337 / 39
Регистрация: 15.10.2012
Сообщений: 529
26.12.2016, 15:39 #11
Цитата Сообщение от volodin661 Посмотреть сообщение
я два раза дал тебе возможность отойти в сторону и избежать конфуза,
сказав что-нибудь типа 'ой, бес попутал' или 'был безобразно пьян, когда всё это писал',
но ты не внял.
В русском народном эпосе практикуется навязчивая троекратность,
вот и я даю тебе ещё одну попытку оставить в покое моё сообщение #4 и более
не подвергать его безграмотным нападкам.
Вам надо успокоиться, никто Ваше сообщение не трогает. Не хотите понять, о чём речь - и не надо Вам напрягаться, займитесь лучше тем, что хорошо умеете - русским эпосом.

Сорри за оффтоп.
0
volodin661
1738 / 849 / 139
Регистрация: 10.12.2013
Сообщений: 2,896
20.06.2017, 08:36 #12
Захарыч,
зацени как HEREDOC поставлен служить благородному делу гибридизации

Windows Batch file
1
2
3
4
5
6
7
@REM=<<'@EXIT/B';
@perl -S %0 %*
@EXIT/B
 
#LINE 7
use strict;
print "Усё уже произошло.\n";
0
greg zakharov
Покинул форум
1935 / 811 / 206
Регистрация: 07.05.2015
Сообщений: 1,640
20.06.2017, 09:14  [ТС] #13
volodin661, благодарствуй, добрый человек! Заценил - правки грядут. Если еще есть идеи, буду рад выслушать.
0
greg zakharov
Покинул форум
1935 / 811 / 206
Регистрация: 07.05.2015
Сообщений: 1,640
03.11.2017, 22:19  [ТС] #14
Наверное, в грядущем, с позволения сказать, релизе будет добавлена поддержка InnoSetup, некоторых функциональных языков и Julia. В последнем случае пример гибрида выглядит следующим образом:
Windows Batch file
1
2
3
:<#=
@julia.exe "%~f0" %*&exit /b =#
println("Testing julia...$(join(ARGS, ' '))")
В итоге:
Код
E:\tests> julia.cmd one two three
Testing julia...one two three
0
03.11.2017, 22:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2017, 22:19
Привет! Вот еще темы с ответами:

MDI - гибриды. Фреймы, вкладки. Рассказываем о своих идеях, примерах и прочих способах реализации - Visual Basic
Давайте поговорим о гибридах. Вот три варианта: Фреймовый интерфейс Окно программы делится на несколько фреймов. В каждом из...

Командные файлы - Bash
1. Используя grep, вывести на экран из файла q2.txt все строки, где в адресе присутствует улица (&quot;ST.&quot;). 2. Используя grep, вывести на...

Командные языки - Программирование
Назовите командные языки всех систем! Я знаю только Windows! :rtfm::help::yahoo:

Командные файлы линукса - Ubuntu Linux
Здравствуйте, никогда не делал ничего подобного. Сказали мол нужен эмулятор и дистрибутив, чтобы не париться. (Сам на виндовс сижу) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru