Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.78/721: Рейтинг темы: голосов - 721, средняя оценка - 4.78
Dragokas
Эксперт WindowsАвтор FAQ
16969 / 7054 / 856
Регистрация: 25.12.2011
Сообщений: 10,868
Записей в блоге: 16
#1

Тонкости языка, редкие команды и сложные скрипты

16.10.2012, 06:56. Просмотров 131109. Ответов 94

Тема для пользователей высокого уровня подготовки.

Здесь можете размещать:
  • Ваши статьи;
  • Ссылки на другие статьи (допускаются статьи на английском языке);
  • Редкие ошибки, выдаваемые интерпретатором, способы их устранения/либо причины возникновения.
  • Недокументированные и особые трюки работы с файловой системой, устройствами и т.п.
  • Разрешено обсуждение выложенных здесь материалов (в последствии будут выделены в отдельную тему);
  • Запрещено обсуждение новичками проблем работы с CMD, где вероятная причина - банальная синтаксическая ошибка.


Статьи и тонкости языка:
Основы
  • FAQ по файлам BAT/CMD (статья) ссылка
  • Командная строка Windows (статья) ссылка
  • Особенности реализации командного процессора cmd.exe операционных систем WinNT (статья) сайт
  • Циклические операции и примеры (статья) эта тема
  • Принцип составления однострочных команд Batch (статья) эта тема
Автозапуск
  • Запуск Bat-файла как службы Эта тема
  • Выполнение командного файла перед входом в систему Эта тема
Безопасность и права
  • Элевация прав запуска BAT-файла (отображается диалог контроля учетных записей UAC) ссылка
  • Как запустить командную строку от имени администратора. эта тема
Интерфейс
  • Переключение языка вывода команд консоли на английский ссылка
КомментарийМатематика
  • Деление с выводом дробной части на батниках ссылка
  • Деление через строковую математику (для делимого, превышающего тип данных signed long int) ссылка
  • Получение 16-ричного представления числа эта тема
  • Получение кода символа по таблице ASCII из числового значения byte эта тема
  • Перевод чисел из десятеричной системы в любую (2-16) эта тема
  • Логические операции сравнения для чисел, превышающих арифметику CMD эта тема
Операционная система, реестр
  • Почему нежелательно запускать BAT из 32-битной среды в 64-разрядной системе. ссылка
  • Функции чтения/записи ключа реестра с отображением уровня ошибки ссылка
Переменные и аргументы
  • Подстановка значения переменной в имя или параметр другой переменной эта тема
  • Перебросить значение через локаль эта тема
  • Часто задаваемые вопросы по использованию аргументов командной строки (статья) сайт
  • Получение рабочего каталога на определенном диске эта тема
  • Undocumented Dynamic variables (недокументированные способы раскрытия переменных среды) эта тема
ПотокиПроцессы
  • Получение PID, имени, пути и параметров запуска процесса эта тема
Связь с другими языками программирования и средами, комбинированные батники

  • -- JScript
  • Скомбинированный файл CMD + JS (WSH) эта тема
  • Выполнение JS кода через mshta.exe эта тема
    -- VBScript
  • Передача значения из BAT-сценария в VBS-скрипт эта тема
  • Метод возврата значения из VBS-скрипта в BAT-сценарий эта тема
  • Получение ErrorLevel из команды CMD в переменную VBS-скрипта тема
    -- Реестровый ключ
  • Способ хранения ключа реестра внутри бат-файла эта тема
    -- Ресурсы внутри BAT-файла
  • Распаковка текстовой информации, заданной меткой в файле CMD, во внешний файл тема
  • Встраивание ресурсов в БАТ-файл тема
    -- Другое:
  • Комбинированный файл CMD + KIXTART
  • Объектно-ориентированное программирование на bat ссылка
Текстовые операции и работа с "массивами"
  • Вывод текста без переноса на новую строку (статья) эта тема
  • Чтение текста из файла без пропуска пустых строк эта тема
  • Экранировать восклицательный знак эта тема
  • Получить последний токен в заданной строке эта тема
  • Урезать в строке справа лишние пробелы или другие подряд идущие символы эта тема
  • Получение символов BackSpace (0x08) и Esc (0x27) в переменную эта тема
  • Функция для работы с массивами эта тема
  • Считывание файла в псевдомассив с учетом пустых строк эта тема
  • Функция правильного выравнивания текста по знакам табуляции эта тема
  • Способ передачи в бат-файл параметра содержащего символы & и последующей обработки полученного значения эта тема
Циклы
  • Подстановка переменной в роле модификатора для цикла эта тема
  • Разбиение строки на токены, если разделитель - кавычка эта тема
Файловые операции
  • Объединить 2 файла (сохранив результаты в одном из них) эта тема
  • Получение информации о размере папки эта тема

References, Special Manuals, Книги для High Level Users:
  • Command-line Reference (Microsoft Tech-Net)
  • Недокументированные и малоизвестные возможности Windows XP (книга)
  • Описание встроенных консольных утилит и команд для различных версий ОС dx21.com CMD-Reference

Баги интерпретатора CMD и встроенных команд
Планируется разместить:
Rem не всегда является командой начала комментария
Создание и удаление точек повторной обработки сайт
.

Если у Вас возникли вопросы, создайте новую тему.
16
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.10.2012, 06:56
Ответы с готовыми решениями:

После выполнения определённой команды не выполняются последующие команды
Объясните, пожалуйста, почему может останавливаться выполнение второй и далее...

Тонкости языка С,define
Здравствуйте. Разбираюсь с одной либой для hd44780, есть вопрос по поводу...

Поддерживает ли встроенный сервер PHP скрипты языка Perl?
В PHP существует встроенный сервер. Создаю файл index.html с формой и файл...

создать програму которая содержит в себе команды обработки строк языка асемблер
Создать програму которая содержит в себе команды обработки строк языка...

Как скрипты видят другие скрипты, которые были объявлены ранее?
Может кто-нибудь объяснить как реализовано то, что у нас скрипт, который был...

94
Smitis
1629 / 338 / 39
Регистрация: 15.10.2012
Сообщений: 529
21.12.2014, 09:05 #61
С форумов dostips.com и script-coding
Гибридный (комбинированный) скрипт cmd+vbs
Bash
1
2
3
4
::'@echo off
::'cscript //nologo //e:vbscript "%~f0" %*
::'exit /b
WScript.Echo "Hello, world!"
Фокус в чём - после апострофа стоит символ SUB (код 26, шестнадцатиричный 0x1A, выглядит обычно как стрелка вправо). Здесь его не видно, но он нормально копируется через буфер обмена. CMD воспринимает его как разрыв строки (!), поэтому команды нормально выполняются. Для VBS символы : являются разделителями команд, он их никак не воспринимает, а далее уже коментарий, символ SUB никак на VBS не влияет.

Недостаток - нельзя использовать оператор Option Explicit (он получается не первым).

П.С. Первое нормальное решение для VBS.
П.П.С. Фокус с символом SUB интересный, можно его ещё куда-нибудь приспособить.

Добавлено через 7 часов 22 минуты
Ещё с форумов dostips.com и script-coding
Гибридный (комбинированный) скрипт cmd+wsf
Bash
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
<?xml : version="1.0" encoding="UTF-8" ?> ^<!------------------------- cmd ----
@echo off
echo cmd
cscript //nologo "%~f0?.wsf" //job:JS //job:VBS
exit /b
---------------------------------------------------------------------- wsf --->
<package>
  <job id="JS"> <!----------------------------------------------------- js --->
    <script language="VBScript"><![CDATA[
      sub vbsEcho() : WScript.Echo "cmd.js.vbs" : end sub
    ]]></script>
    <script language="JScript"><![CDATA[
      WScript.Echo("cmd.js");
      vbsEcho();
    ]]></script>
  </job>
  <job id="VBS"> <!--------------------------------------------------- vbs --->
    <script language="JScript"><![CDATA[
      function jsEcho() { WScript.Echo("cmd.vbs.js"); }
    ]]></script>
    <script language="VBScript"><![CDATA[
      WScript.Echo "cmd.vbs"
      call jsEcho
    ]]></script>
  </job>
</package>
Интересный способ вызова скрипта как wsf "%~f0?.wsf"

И оттуда же комбинированный CMD+HTML
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- :
@echo off
start "" mshta.exe "%~f0"
exit /b
-->
<html>
<head>
<title>HTML-in-BATCH</title>
</head>
<body>
<h1>Hello, world!</h1>
</body>
</html>
А от меня - вместо mshta.exe можно использовать hh.exe
3
Dragokas
Эксперт WindowsАвтор FAQ
16969 / 7054 / 856
Регистрация: 25.12.2011
Сообщений: 10,868
Записей в блоге: 16
08.01.2015, 21:56  [ТС] #62
Отжатие клавиши "CapsLock" (BAT / VBS)

Bash
1
2
3
4
5
6
7
8
echo Set objShell = CreateObject("WScript.Shell") > temp.vbs
echo Set objWord = CreateObject( "Word.Application" ) >> temp.vbs
echo if objWord.CapsLock ^<^> 0 then >> temp.vbs
echo objShell.SendKeys "{capslock}" >> temp.vbs
echo end if >> temp.vbs
echo objWord.Quit >> temp.vbs
cscript //nologo temp.vbs
del temp.vbs
В системе должен быть установлен "MS Word".
2
Dragokas
Эксперт WindowsАвтор FAQ
16969 / 7054 / 856
Регистрация: 25.12.2011
Сообщений: 10,868
Записей в блоге: 16
24.01.2015, 23:27  [ТС] #63
Рисование фрактала Мандельброта

Автор: Aacini (dostips.com)

1. Запустите батник. В папке появится шрифт Terminal 1x1.FNT
2. Скопируйте файл шрифта в папку Windows\Fonts
3. Создайте ярлык к батнику. В свойствах пропишите -> вкладка "Шрифт" -> Размер 1х1 (точечный)
и размер экрана выставьте по-больше (800х600).

Запускать через ярлык.

Bash
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
@if (@CodeSection == @Batch) @then
 
 
@echo off
 
rem Mandelbrot Set graphic in text mode
rem Batch-JScript hybrid version optimized for high resolution screens
rem Include "Terminal 1x1.FNT" font file and installation instructions
rem Antonio Perez Ayala
 
setlocal EnableDelayedExpansion
if "%~1" equ "DrawLines" goto DrawLines
 
rem Create "Terminal 1x1.FNT" file if not exists
if not exist "Terminal 1x1.FNT" (
   call :ExtractBinaryFile "Terminal 1x1.FNT"
   echo/
   echo In order to install a "Terminal" raster font right-click on it and select
   echo "Install", or open Fonts via Control Panel and drag^&drop the font file.
   echo/
   echo To use the installed font in a Command-line window, follow these steps:
   echo/
   echo 1. Right-click on any MS-DOS Command-line icon and select "Create shortcut"
   echo    or "Copy".
   echo 2. Open the folder that contain the programs that will be used in this window
   echo    and type Ctrl-V (paste^); a new MS-DOS shortcut icon is created.
   echo 3. Open the new icon, right-click on the title bar and select "Properties".
   echo 4. Open "Font" tab, select "Bitmap fonts" and "1x1" size.
   echo 5. Open "Layout" tab and enter a large size in Buffer and Window sizes; for
   echo    example: Width: 800, Height: 600 (same values in BOTH Buffer and Window^).
   echo 6. Click OK, type EXIT and press Enter.
   echo/
   echo After that, it is suggested to rename the new icon to include the resolution
   echo and the font size; for example: "MS-DOS 800x600 @ 1x1". To use this icon:
   echo open it, type the name of the program to execute and press Enter.
   echo/
   pause
   goto :EOF
)
 
rem Working values: maximum screen coordinates
rem The Command-line window MUST have the same values in BOTH Buffer and Window sizes
set /A maxY=0, maxX=0
for /F "skip=2 tokens=2" %%a in ('mode con') do (
   if !maxY! equ 0 ( set /A maxY=%%a-2
   ) else if !maxX! equ 0 ( set /A maxX=%%a-1
   )
)
 
if not exist ColorChar.exe call :ExtractBinaryFile ColorChar.exe
rem Create the semaphore-signal file and start the asynchronous process
echo X > Flag.out
if exist Flag.in del Flag.in
rem Get output lines from JScript section and show they with ColorChar.exe
cls
CScript //nologo //E:JScript "%~F0" %maxY% %maxX% | "%~F0" DrawLines
del Flag.out
pause
goto :EOF
 
:DrawLines
   rem Wait for "Data Available" signal
   if not exist Flag.in goto DrawLines
   rem Read the input line sent by JScript code
   set line=
   set /P "line="
   rem Set "Data Read" acknowledgement
   ren Flag.in Flag.out
   rem Check the standard "End Of piped File" mark
   if not defined line goto :EOF
   ColorChar %line%
goto DrawLines
 
 
rem ExtractBinaryFile from hexadecimal digits placed in a "resource" in this .bat file
:ExtractBinaryFile filename.ext
setlocal EnableDelayedExpansion
set "start="
set "end="
for /F "tokens=1,3 delims=:=>" %%a in ('findstr /N /B "</*resource" "%~F0"') do (
   if not defined start (
      if "%%~b" equ "%~1" set start=%%a
   ) else if not defined end set end=%%a
)
(for /F "skip=%start% tokens=1* delims=:" %%a in ('findstr /N "^" "%~F0"') do (
   if "%%a" == "%end%" goto decodeHexFile
   echo %%b
)) > "%~1.hex"
:decodeHexFile
< "%~1.hex" Cscript //nologo //E:JScript "%~F0" Extract "%~1"
del "%~1.hex"
exit /B
 
 
<resource id="Terminal 1x1.FNT">
00034403[2]416e746f6e696f20506572657a204179616c612028616b6120416163696e6929006163696e692900446c6c5c6e74646c6c2e646c6c[24]
9001ff010001[2]01000100207f212061[5]3b03[6]da02[3]01[29]0100da02[2]0100db02[2]0100dc02[2]0100dd02[2]0100de02[2]0100df02
[2]0100e002[2]0100e102[2]0100e202[2]0100e302[2]0100e402[2]0100e502[2]0100e602[2]0100e702[2]0100e802[2]0100e902[2]0100ea
02[2]0100eb02[2]0100ec02[2]0100ed02[2]0100ee02[2]0100ef02[2]0100f002[2]0100f102[2]0100f202[2]0100f302[2]0100f402[2]0100
f502[2]0100f602[2]0100f702[2]0100f802[2]0100f902[2]0100fa02[2]0100fb02[2]0100fc02[2]0100fd02[2]0100fe02[2]0100ff02[2]01
[2]03[2]01000103[2]01000203[2]01000303[2]01000403[2]01000503[2]01000603[2]01000703[2]01000803[2]01000903[2]01000a03[2]01
000b03[2]01000c03[2]01000d03[2]01000e03[2]01000f03[2]01001003[2]01001103[2]01001203[2]01001303[2]01001403[2]01001503[2]
01001603[2]01001703[2]01001803[2]01001903[2]01001a03[2]01001b03[2]01001c03[2]01001d03[2]01001e03[2]01001f03[2]01002003[2]
01002103[2]01002203[2]01002303[2]01002403[2]01002503[2]01002603[2]01002703[2]01002803[2]01002903[2]01002a03[2]01002b03[2]
01002c03[2]01002d03[2]01002e03[2]01002f03[2]01003003[2]01003103[2]01003203[2]01003303[2]01003403[2]01003503[2]01003603[2]
01003703[2]01003803[2]01003903[2]08003a03[3][6x80]0080[7]80[3]808080008080[3]8080[2]8000[6x80][2][9x80]00[5x80]008080[4]
[11x80]00[15x80][3]80005465726d696e616c00
</resource>
 
<resource id="ColorChar.exe">
4d5a900003[3]04[3]ffff[2]b8[7]40[35]b0[3]0e1fba0e00b409cd21b8014ccd21546869732070726f6772616d2063616e6e6f74206265207275
6e20696e20444f53206d6f64652e0d0d0a24[7]55b5b8fd11d4d6ae11d4d6ae11d4d6ae9fcbc5ae18d4d6aeedf4c4ae13d4d6ae5269636811d4d6ae
[8]5045[2]4c010300ff23cd52[8]e0000f010b01050c0004[3]04[7]10[3]10[3]20[4]40[2]10[3]02[2]04[7]04[8]40[3]04[6]03[5]10[2]10
[4]10[2]10[6]10[11]1c20[2]28[84]20[2]1c[27]2e74657874[3]a202[3]10[3]04[3]04[14]20[2]602e7264617461[2]ea[4]20[3]02[3]08[14]
40[2]402e64617461[3]20[4]30[3]02[3]0a[14]40[2]c0[480]e806[3]50e87302[2]558bec81c4f4dffffffc6af5e86e02[2]8945fc6800304000
ff75fce85802[2]8dbdfcdfffff89bdf8dfffffe81302[2]e83202[2]8a064684c00f846001[2]3c2f75672bbdf8dfffff74168d85f4dfffff5057ff
b5f8dfffffff75fce88b01[2]8bbdf8dfffff8a064684c00f842d01[2]2c303c0976082c073c0f76022c208a264684e40f841401[2]80fc20741286
c42c303c0976082c073c0f76022c20d51066a316304000eb853c2275208a064684c00f84e6[3]3c227405880747ebec8a06463c2274f4e961ffffff
3c300f82c9[3]3c390f87c1[3]e8e3[3]8ae080ff2a740a80ff58740580ff7875278adc468a06463c300f829d[3]3c390f8795[3]e8b7[3]0fb7c88a
c3f3aae914ffffff80fc20737780fc09751f8b0d0430400003cf2b8df8dfffff83e10783e908f7d9b020f3aae9ebfeffff2bbdf8dfffff7418508d85
f4dfffff5057ffb5f8dfffffff75fce889[3]588bbdf8dfffff88276a008d85f4dfffff506a01ffb5f8dfffffff75fce8fd[3]6800304000ff75fce8
e4[3]e998feffff882747e990feffff2bbdf8dfffff74168d85f4dfffff5057ffb5f8dfffffff75fce82f[3]33c0c9c3e8[4]6683e00f66b90a008a
3e4680ff30721480ff39770f66f7e180ef30660fb6d76603c2ebe44ec3558bec6a00ff7514ff7510ff750cff7508e880[3]8b4d10578b7d0c66a116
304000f366ab8b0d04304000ff751451ff7510ff750cff7508e85e[3]5f6800304000ff7508e83e[3]c9c21000[6xcc]e847[3]8bf08a06463c2275
098a06463c2275f9eb0c8a06463c20740484c075f54ec38a06463c2074f94ec3ccff2514204000ff2500204000ff2504204000ff2508204000ff250c
204000ff25102040[351]6e20[2]8c20[2]9c20[2]ac20[2]ca20[2]6020[6]4420[10]dc20[3]20[22]6e20[2]8c20[2]9c20[2]ac20[2]ca20[2]
6020[6]9b004578697450726f6365737300f500476574436f6e736f6c6553637265656e427566666572496e666f[2]6a0147657453746448616e646c
65[2]ee025772697465436f6e736f6c654100f2025772697465436f6e736f6c654f757470757441747472696275746500e600476574436f6d6d616e
644c696e6541006b65726e656c33322e646c6c[302]07[489]
</resource>
 
 
@end
 
 
if ( WScript.Arguments(0) != "Extract" ) {
 
// Calculate Mandelbrot Set points and output they to Batch section
 
fso = new ActiveXObject("Scripting.FileSystemObject");
 
// Horizontal range: for 4:3 screen use range=3 (-1,2), for 16:9 screen use range=4 (-1.5,2.5)
var           yTop=1.1250,
    xLeft=-1.0000, xRight=2.0000,
           yBottom=-1.1250,       maxLevel=32,  // larger maxLevel values produce finer image details
    maxY=parseInt(WScript.Arguments(0)), maxX=parseInt(WScript.Arguments(1)),
    xStep=(xRight-xLeft)/maxX, yStep=(yBottom-yTop)/maxY, yPos=yTop-yStep,
    color="0123456789ABCDDEEEE";
 
for ( var y = 0; y <= maxY; y++ ) {
   yPos+=yStep; 
   var xPos=xLeft-xStep, line="", prevPixel="", count=0, pixel;
   for ( var x = 0; x <= maxX; x++ ) {
      xPos+=xStep;
      var xIter=xPos, yIter=yPos, xSquare=xIter*xIter, ySquare=yIter*yIter, root=xSquare+ySquare, level=0;
      for ( var i = 1; i <= maxLevel; i++ ) {
         if ( root < 4 ) {
            yIter=2*xIter*yIter-yPos; xIter=xSquare-ySquare-xPos; xSquare=xIter*xIter; ySquare=yIter*yIter; root=xSquare+ySquare;
         } else {
            level=i;
            break;
         }
      }
      pixel = (level<color.length) ? color.charAt(level) : "F";
   // Use next line instead of previous one when maxLevel > 500
   // pixel = (level<color.length) ? color.charAt(level) : ((level<36)?"1":"F");
      if ( pixel != prevPixel ) {
         line+=" /"+prevPixel+" 219*"+count;
         if ( line.length > 1000 ) {
            sendLine(line);
            line = "";
         }
         prevPixel=pixel;
         count=1;
      } else {
         count++;
      }
   }
   line+=" /"+prevPixel+" 219*"+count;
   sendLine(line);
}
// Wait for last "Data Read" acknowledgement
while ( ! fso.FileExists("Flag.out") ) {
      WScript.Sleep(1);
}
// Send the standard "End Of piped File" mark
WScript.Echo();
fso.MoveFile("Flag.out", "Flag.in");
 
} else {
 
// Extract a hexadecimal "resource" into a binary file
 
// Convert Ascii hexadecimal digits from Stdin to a binary string
var count, byte, output = "";
while ( !WScript.Stdin.AtEndOfStream ) {
   var input = WScript.Stdin.ReadLine();
   for ( var index = 0; index < input.length; ) {
      if ( input.charAt(index) == '[' ) {
         for ( count = ++index; input.charAt(index) != 'x' &&
                                input.charAt(index) != ']' ; index++ ) ;
         count = parseInt(input.slice(count,index++));
         if ( input.charAt(index-1) == 'x' ) {
            byte = String.fromCharCode(parseInt(input.substr(index,2),16));
            index += 3;
         } else {
            byte = String.fromCharCode(0);
         }
         for ( var i = 1; i <= count; i++ ) output += byte;
      } else {
         output += String.fromCharCode(parseInt(input.substr(index,2),16));
         index += 2;
      }
   }
}
 
// Write the binary string to the output file
var ado = WScript.CreateObject("ADODB.Stream");
ado.Type = 2;  // adTypeText = 2
ado.CharSet = "iso-8859-1";  // right code page for output (no adjustments)
ado.Open();
ado.WriteText(output);
ado.SaveToFile(WScript.Arguments(1),2); // adSaveCreateOverWrite = 2
ado.Close();
 
}
 
function sendLine ( line ) {
   // Wait for "Data Read" acknowledgement
   while ( ! fso.FileExists("Flag.out") ) {
      WScript.Sleep(1);
   }
   // Send the line to Batch code
   WScript.Echo(line);
   // Set "Data Available" signal
   fso.MoveFile("Flag.out", "Flag.in");
}
5
Миниатюры
Тонкости языка, редкие команды и сложные скрипты  
Dragokas
Эксперт WindowsАвтор FAQ
16969 / 7054 / 856
Регистрация: 25.12.2011
Сообщений: 10,868
Записей в блоге: 16
02.02.2015, 14:49  [ТС] #64
Перенаправление потока в подпрограмму на примере парсера CSV-файлов.
Автор: Aacini (dostips.com)

Код не имеет ограничений на кол-во полей в CSV.
Принцип в общем-то напоминает код от FraidZZ в его парсере файла в псевдомассив.

Bash
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
@echo off
setlocal EnableDelayedExpansion
 
rem Create heading array:
set /P headingRow=< %1
set i=0
for %%h in (%headingRow%) do (
    set /A i+=1
    set heading[!i!]=%%~h
)
 
rem Process the file:
call :ProcessFile < %1
exit /B
 
:ProcessFile
set /P line=
:nextLine
    set line=:EOF
    set /P line=
    if "!line!" == ":EOF" goto :EOF
    set i=0
    for %%e in (%line%) do (
        set /A i+=1
        for %%i in (!i!) do echo !heading[%%i]!%%~e
    )
goto nextLine
exit /B
2
Smitis
1629 / 338 / 39
Регистрация: 15.10.2012
Сообщений: 529
08.02.2015, 20:52 #65
Исследование с dostip - недокументированные символы в масках файлов http://www.dostips.com/forum/viewtopic.php?f=3&t=6207
"<" - работает как и "*", но не захватывает точку, относящуюся к расширению файла.
">" - работает как и "?", но не захватывает точку, относящуюся к расширению файла.

Например
Bash
1
del /q *
удалит все файлы (символ * захватит все символы), а команда
Bash
1
del /q "<"
только файлы без расширения (символ < захватит только символы до последней точки).

Работают не только для команды dir, которая вынесена в заголовок темы на dostip, но и для других команд, и, похоже, даже для функций WinApi.

VBS:
Visual Basic
1
CreateObject("Scripting.FileSystemObject").DeleteFile "<"
А вот PowerShell такие маски не осилил.
7
Somebody
2799 / 1610 / 251
Регистрация: 03.12.2007
Сообщений: 4,213
Завершенные тесты: 3
08.02.2015, 21:27 #66
Цитата Сообщение от Smitis Посмотреть сообщение
и, похоже, даже для функций WinApi
В WinAPI ничего такого нет. DeleteFile удаляет только один файл, никаких масок.
0
Smitis
1629 / 338 / 39
Регистрация: 15.10.2012
Сообщений: 529
08.02.2015, 22:07 #67
Somebody
Только что проверил, FindFirstFile понимает такие маски.
0
Somebody
2799 / 1610 / 251
Регистрация: 03.12.2007
Сообщений: 4,213
Завершенные тесты: 3
09.02.2015, 00:19 #68
Я имел в виду, что в WinAPI с масками работают только функции поиска. А вот, кстати, нашлось, откуда эта фича идёт:
http://stackoverflow.com/questions/2...ildcard-or-bug
https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx
1
sov44
1758 / 742 / 128
Регистрация: 09.04.2011
Сообщений: 1,313
24.02.2015, 22:25 #69
Способ конвертации целых чисел в шестнадцатеричное представление
Bash
1
2
cmd /c exit /b 3735928559
echo %=ExitCode%
источник http://www.dostips.com/forum/viewtopic.php?p=32071#p32071
из коллекции CMD/BAT: Хитрости интерпретатора
4
Dragokas
Эксперт WindowsАвтор FAQ
16969 / 7054 / 856
Регистрация: 25.12.2011
Сообщений: 10,868
Записей в блоге: 16
29.03.2015, 00:01  [ТС] #70
Получение доступа к 64-разрядным веткам реестра из 32-битного интерпретатора.

Нашел недокументированную фишку утилиты REG.exe

Если дописать в конце команды ключ /reg:64, это будет аналогично флагу KEY_WOW64_64KEY.

Пример:
Windows Batch file
1
%SystemRoot%\SysWow64\cmd.exe /c REG ADD HKLM\SOFTWARE /v Test
если ОС 64-битная, создаст параметр Test в ветке:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node

Windows Batch file
1
%SystemRoot%\SysWow64\cmd.exe /c REG ADD HKLM\SOFTWARE /v Test /reg:64
создаст параметр Test в ветке:
HKEY_LOCAL_MACHINE\SOFTWARE
4
Dragokas
Эксперт WindowsАвтор FAQ
16969 / 7054 / 856
Регистрация: 25.12.2011
Сообщений: 10,868
Записей в блоге: 16
11.05.2015, 00:09  [ТС] #71
Обновление иконок рабочего стола / папки (по типу нажатия F5)

Иногда после выполнения файловых операций (создание/удаление, смена иконки) изменения в папке могут сразу не отображаться (пока не нажмешь F5).

Эта команда поможет:
Windows Batch file
1
%SystemRoot%\System32\ie4uinit.exe -ClearIconCache
Совместимость: Windows XP/Vista/7/8/8.1/10.

(увидел в установщике браузера Vivaldi )
Эта команда идентична API-функции:
C++
1
SHChangeNotify (SHCNE_ASSOCCHANGED, 0, 0, 0);
Т.е. систему информируют о том, что якобы сменились ассоциации файлов,
но по сути это влечет за собой и перерисовку всего остального (иконки и т.п.)

Более мощный вариант на VB6.
5
sov44
1758 / 742 / 128
Регистрация: 09.04.2011
Сообщений: 1,313
11.05.2015, 10:24 #72
Цитата Сообщение от Dragokas Посмотреть сообщение
Эта команда поможет...
Когда-то написал батник для обновления кэша иконок:
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
@echo off
setlocal enabledelayedexpansion
 
Echo Для чистки кэша иконок
Echo закройте все работающие приложения
Echo.
pause
 
:: попытка 1 чистка кэша
ie4uinit.exe -ClearIconCache
echo.
set /p x="Проблема решена? да-Enter, нет-любая клавиша   :"
 
if not defined x goto end
 
:: попыпка 2 контрольная радикальная
tasklist | >nul find /i "explorer.exe" && taskkill /f /im "explorer.exe" 1>nul
Ver | Find "5." >Nul && (
del /a:h "%userprofile%\Local Settings\Application Data\IconCache.db" 2>nul
) || (
del /a:h "%userprofile%\AppData\Local\IconCache.db" 2>nul
)
start "" %Windir%\explorer.exe
 
:end
Echo.
Echo Готово^^!
Echo Кликните по этому окну и нажмите любую клавишу
pause>nul
exit /b
5
Dragokas
Эксперт WindowsАвтор FAQ
16969 / 7054 / 856
Регистрация: 25.12.2011
Сообщений: 10,868
Записей в блоге: 16
31.05.2015, 15:29  [ТС] #73
Преобразование буквы в верхний регистр

Идея: ComSpec

Windows Batch file
1
2
3
4
5
6
7
8
@echo off
SetLocal EnableExtensions
 
set char=z
for /f "delims=" %%a in ('"find "" "%char%" 2>&1"') do set x=%%a& call set char=%%x:~-1%%
echo %char%
 
pause
4
ComSpec
3406 / 1951 / 627
Регистрация: 26.02.2014
Сообщений: 1,457
03.06.2015, 14:36 #74
Создание файлов с порядковыми номерами в имени

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@echo off
setlocal
 
:: Начальное имя файла вводите вместе с нужным расширением.
set/p "name=Введите имя файла: "
 
(
set n=-1
:loop
set/a n+=1
for %%i in ("%name%") do (
 if not exist "%%~ni%n%%%~xi" (
  rem:>"%%~ni%n%%%~xi"
 ) else (
  goto loop
 )
)
)
 
endlocal
exit/b 0
Здесь применён оригинальный приём: основной код преднамеренно заключён в скобки для использования задержки в применении присваиваемых значений переменной (счётчика) в условиях невключённого отложенного расширения переменных, для этой же цели счётчику присваивается начальное значение "-1", а не "0". То есть при использовании кода, когда файл с именем без номера отсутствует в директории, счётчику присваивается значение "0", а не "1", но оно не может использоваться, значение переменной (счётчика) фактически остаётся пустым, и файл создаётся без номера в имени.
3
Dragokas
Эксперт WindowsАвтор FAQ
16969 / 7054 / 856
Регистрация: 25.12.2011
Сообщений: 10,868
Записей в блоге: 16
31.07.2015, 17:31  [ТС] #75
Комбинирование форматов: гибрид .CMD + .WSF

Автор: Liviu

cscript / wscript не содержит специального параметра ключа //E, чтобы явно указать движок для обработки файла с произвольным расширением имени в качестве сценарного задания WSF, поэтому нельзя просто переименовать файл .wsf в -> .cmd и запустить через cscript.

Однако, Liviu нашел обходной способ сделать все именно по такому сценарию.
Для этого задается специфическое имя файла со знаком "?":

Windows Batch file
1
cscript //nologo "%~f0?.wsf"
cscript думает, что файл имеет расширение .wsf, тем не менее обрабатывает файл %~f0

Демонстрация:

Сценарий с 2-мя заданиями:
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
<?xml : version="1.0" encoding="UTF-8" ?> ^<!------------------------- cmd ----
@echo off
echo cmd
cscript //nologo "%~f0?.wsf" //job:JS //job:VBS
exit /b
---------------------------------------------------------------------- wsf --->
<package>
  <job id="JS"> <!----------------------------------------------------- js --->
    <script language="VBScript"><![CDATA[
      sub vbsEcho() : WScript.Echo "cmd.js.vbs" : end sub
    ]]></script>
    <script language="JScript"><![CDATA[
      WScript.Echo("cmd.js");
      vbsEcho();
    ]]></script>
  </job>
  <job id="VBS"> <!--------------------------------------------------- vbs --->
    <script language="JScript"><![CDATA[
      function jsEcho() { WScript.Echo("cmd.vbs.js"); }
    ]]></script>
    <script language="VBScript"><![CDATA[
      WScript.Echo "cmd.vbs"
      call jsEcho
    ]]></script>
  </job>
</package>
C:\tmp>cmd-wsf.cmd
cmd
cmd.js
cmd.js.vbs
cmd.vbs
cmd.vbs.js
Сценарий без заданий:

Windows Batch file
1
2
3
4
5
<!-- : --------------------------------------------------------------- cmd ----
@cscript //nologo "%~f0?.wsf" & exit /b & rem ------------------------ vbs --->
<job><script language="VBScript">
WScript.Echo "cmd.vbs - no CDATA so <" & "/script> would cause XML error here"
</script></job>
C:\tmp>cmd-vbs.cmd
cmd.vbs - no CDATA so </script> would cause XML error here
3
ComSpec
3406 / 1951 / 627
Регистрация: 26.02.2014
Сообщений: 1,457
20.08.2015, 08:14 #76
Правильный вывод заранее сформированных строк



Код для пакетного файла:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
@echo off
 
for %%i in (
 
abcdefg
hijklmn
opqrstu
vwxyz
 
) do echo %%i
 
pause>nul
.


Если в строках будут присутствовать пробелы, символы табуляции и символы

=
;
,
,

то такие строки нужно заключать в кавычки и применять модификатор "~":

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
@echo off
 
for %%i in (
 
"abc defg"
"hijk=lmn"
"opqr;stu"
"vw,xyz"
 
) do echo.%%~i
 
pause>nul
.


Если в строках будут присутствовать символы

^
&
)
|
<
>
,

то эти символы нужно экранировать с помощью символа "^":

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
@echo off
 
for %%i in (
 
abc^&defg
hijk^)lmn
opqr^|stu
vw^<xyz
 
) do echo.%%i
 
pause>nul
(или также заключать строки в кавычки и применять модификатор "~").


Символ

%
в строках необходимо удваивать.


Символы

*
?
в строках не допускаются.


Наличие символа

"
в строках в отдельных случаях возможно, но в общем случае нежелательно.


Если в строках будет присутствовать символ

я
(в кодировке "Win-1251"), то такую строку также обязательно нужно заключать в кавычки и использовать модификатор "~":

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
@echo off
 
for %%i in (
 
"яблоко"
"ряд"
"змея"
"я"
 
) do echo.%%~i
 
pause>nul
.

Символ "я" в кодировке "Win-1251" воспринимается интерпретатором как пробельный символ и при соблюдении тех же требований, что и для пробела, выводится в консольное окно также в виде пробела, а при выводе результата в файл -- как буква "я".

Сравните результаты вывода в файл для этих двух кодов (кодировка пакетного файла -- "Win-1251"):

Windows Batch file
1
2
3
4
5
6
7
8
9
10
@echo off
 
for %%i in (
 
яблоко
ряд
змея
я
 
) do echo %%i>>"strings.txt"
и

Windows Batch file
1
2
3
4
5
6
7
8
9
10
@echo off
 
for %%i in (
 
"яблоко"
"ряд"
"змея"
"я"
 
) do echo.%%~i>>"strings.txt"
.



Скопировано из темы "Вывод заранее сформированных строк".
4
Dragokas
Эксперт WindowsАвтор FAQ
16969 / 7054 / 856
Регистрация: 25.12.2011
Сообщений: 10,868
Записей в блоге: 16
18.02.2016, 02:42  [ТС] #77
Вывод файла c конца (в обратной последовательности строк) через Sort

Windows Batch file
1
sort /+2147483647 file.txt
Копирование содержимого нескольких файлов в один
(от alpap)
1
greg zakharov
Покинул форум
1947 / 823 / 236
Регистрация: 07.05.2015
Сообщений: 1,645
24.04.2016, 13:43 #78
Любопытная фича (баг?) regsvr32
Windows Batch file
1
2
rem удалить перед http знак _
regsvr32 /s /u /n /i:_http://www.piriform.com/ccleaner/download/portable/downloadfile scrobj.dll
Загрузит во временные файлы встроенного браузера (IE) ccleanerX.zip, - это возможно благодаря поддержке установки компонентов по сети. Правда на некоторых ссылках regsvr32 рога себе все же обламывает.
2
ComSpec
3406 / 1951 / 627
Регистрация: 26.02.2014
Сообщений: 1,457
01.05.2016, 08:52 #79
Перезапись содержимого текстового файла в верхнем регистре:

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
@echo off
 
set "file=example.txt"
 
>nul chcp 1251
<"%file%">$ (
 for /f "delims=" %%i in ('find/n /v ""') do @(
  set x=%%i& call set "x=%%x:?=$#$%%"& call set "x=%%x:"=$@$%%"
  for /f "tokens=3*" %%j in ('2^>^&1 cmd/v/c find "" "!x!"') do @(
   set x=%%k
   cmd/v/c echo[!x:*]^^=!
  )
 )
)
>nul chcp 866
<$>"%file%" (
 for /f "delims=" %%i in ('find/n /v ""') do @(
  >nul chcp 1251
  set x=%%i& call set "x=%%x:$#$=?%%"& call set "x=%%x:$@$="%%"
  cmd/v/c echo[!x:*]^^=!
 )
)
del $
 
exit/b 0
.



Перезапись содержимого текстового файла в нижнем регистре:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@echo off
 
set "file=example.txt"
 
>nul chcp 1251
<"%file%">$ (
 for /f "delims=" %%i in ('find/n /v ""') do @(
  set x=%%i& call set "x=%%x:\=$`$%%"& call set "x=%%x:|=${$%%"& call set "x=%%x:/=$@$%%"
  call set "x=%%x::=$#$%%"& call set "x=%%x:<=$'$%%"& call set "x=%%x:>=$;$%%"
  call set "x=%%x:?=$,$%%"& call set "x=%%x:"=$+$%%"
  for /f "delims=" %%j in ('cmd/v/c rem:^^^>"!x!"^^^& dir/b/l "!x!"^^^& del "!x!"') do @(
   set x=%%j& call set "x=%%x:$`$=\%%"& call set "x=%%x:${$=|%%"& call set "x=%%x:$@$=/%%"
   call set "x=%%x:$#$=:%%"& call set "x=%%x:$'$=<%%"& call set "x=%%x:$;$=>%%"
   call set "x=%%x:$,$=?%%"& call set "x=%%x:$+$="%%"
   cmd/v/c echo[!x:*]^^=!
  )
 )
)
>nul move $ "%file%"
 
exit/b 0
.
3
ComSpec
3406 / 1951 / 627
Регистрация: 26.02.2014
Сообщений: 1,457
02.05.2016, 10:20 #80
Три варианта самоудаления пакетного файла по завершении его выполнения без вывода сообщения об ошибке
Не удается найти пакетный файл.
:

1)
Windows Batch file
start/b cmd /c del "%~f0"
;

2)
Windows Batch file
2>nul goto& del "%~f0"
;

3)
Windows Batch file
"%~f0">"%~f0"& del "%~f0"
.
3
02.05.2016, 10:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.05.2016, 10:20

Редкие программы
тема и тупая, но в институте задали такой вопрос: какие программы считаются...

Lotusscript: редкие конструкции
Здравствуйте, коллеги. Накидайте мне здесь, пожалуйста, хитрых, редких,...

Редкие отключения и сбои ПК
Добрый день! Около 4-ех месяцев назад поменял процессор с i3-3225 на i5-3450...


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

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

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