Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
3449 / 1110 / 494
Регистрация: 29.05.2016
Сообщений: 4,566

Разбор скрипта

03.12.2019, 13:37. Показов 1816. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Большая просьба помочь разобраться в коде:
Windows Batch file
1
2
3
4
Setlocal EnableDelayedExpansion
set LIST=
for %%i in (*) do set LIST=!LIST! %%i
echo %LIST%
Из кода мне ясно, что первая строчка включает отложенное раскрытие переменных, вторая строчка удаляет значение переменной LIST, в третьей строчке идёт выполнение цикла и здесь у меня возникает непонимание. Для чего переменной LIST присваивается её же несуществующее значение и каким образом именно этот способ выводит в строчку всё содержимое каталога, из которого запускается данный скрипт? Заранее благодарен!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.12.2019, 13:37
Ответы с готовыми решениями:

При запуске sh-скрипта из bat-файла команда clang из sh-скрипта неверно работает
Я запускаю через bat.файл sh.скрипт в котором находится одна команда clang code.c -o code.exe Вот кусок кода из bat C: ...

Разбор скрипта
Тема из разряда реверса.. Я СИшный программист, но в особенностях js не рублю совершенно. Попалась вот такая функция (она в аттаче, форум...

Разбор скрипта
Добрый вечер, Поскажите пжл, что делают след куски кода: if (/^agi_(\w+)\:\s+(.*)$/) { $AGI{$1} = $2; if ($res...

21
 Аватар для volodin661
6799 / 2298 / 349
Регистрация: 10.12.2013
Сообщений: 7,924
03.12.2019, 16:04
На этот вопрос, доводивший меня почти до безумия долгими петербургскими ночами, ответа я не знал.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
03.12.2019, 16:44
Цитата Сообщение от Karen87 Посмотреть сообщение
Для чего переменной LIST присваивается её же несуществующее значение и каким образом именно этот способ выводит в строчку всё содержимое каталога, из которого запускается данный скрипт?
Об этом куценько написано в справке по команде set /? прямо рядом с вашим примером - "связывание времени выполнения".

P.S. Синтаксис cmd никогда не имел внятного логического объяснения, точно также как не существует ни одного официального манускрипта по устройству cmd от microsoft. Поэтому microsoft уже давно похоронила своего "мертвеца" и полностью переключилась на powershell. К чем снова и снова выкапывать его кости и пытаться что-то построить на них, когда существует примерно 100500 альтернатив?
0
 Аватар для volodin661
6799 / 2298 / 349
Регистрация: 10.12.2013
Сообщений: 7,924
03.12.2019, 16:52
Цитата Сообщение от Garry Galler Посмотреть сообщение
Поэтому microsoft уже давно похоронила своего "мертвеца" и полностью переключилась
Да она им и не пользовалась сама никогда. Есть у неё небольшие скрипты, но там всё как надо - предельно примитивно,
никакой обработки текстов, никаких циклов for и разрешённыхотложенныхрасширений.
0
3449 / 1110 / 494
Регистрация: 29.05.2016
Сообщений: 4,566
03.12.2019, 17:16  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
Об этом куценько написано в справке по команде set /?
Нашёл, но всё равно, хоть убейте не понимаю зачем нужно set LIST= и логику set LIST=!LIST!...
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
03.12.2019, 17:17
Цитата Сообщение от volodin661 Посмотреть сообщение
Да она им и не пользовалась сама никогда
В общем да, все внутренние скрипты (ранних windows) чуть посложнее простого списка команд написаны исключительно на vbs.
Разве что, как исключение, файл C:\Windows\System32\Msdtc\Trace\msdtcvtr .bat, в котором аж на 600 строк разного рода процедур:
Finds the index of the named switch, Get a switch argument by index,Get a parsed argument by index,Parse a command line into switches and args, Delete registry values, Get next random number, Get a single line of keyboard input и т.д.
Кто-то очень сильно заморочился в 2009-м, чтобы все это написать.
0
 Аватар для volodin661
6799 / 2298 / 349
Регистрация: 10.12.2013
Сообщений: 7,924
03.12.2019, 18:11
Цитата Сообщение от Karen87 Посмотреть сообщение
хоть убейте не понимаю зачем нужно
Вот.
В самую точку.
Мы с Гарри тоже не понимаем, хоть убей, зачем тебе это нужно ?
0
3449 / 1110 / 494
Регистрация: 29.05.2016
Сообщений: 4,566
03.12.2019, 18:20  [ТС]
PowerShell логичнее для восприятия?
0
 Аватар для volodin661
6799 / 2298 / 349
Регистрация: 10.12.2013
Сообщений: 7,924
03.12.2019, 18:22
PowerShell
1
$files = gi *
0
3449 / 1110 / 494
Регистрация: 29.05.2016
Сообщений: 4,566
03.12.2019, 18:26  [ТС]
Я так понимаю выражение после знака равенства присваивает переменной весь список файлов в каталоге?
0
 Аватар для volodin661
6799 / 2298 / 349
Регистрация: 10.12.2013
Сообщений: 7,924
03.12.2019, 18:35
в отличие от несусветной белиберды из твоего первого поста
Цитата Сообщение от Karen87 Посмотреть сообщение
Windows Batch file
1
2
3
4
Setlocal EnableDelayedExpansion
set LIST=
for %%i in (*) do set LIST=!LIST! %%i
echo %LIST%
на выходе из которой шиш с маслом,

здесь на выходе управляемый список реальных объектов с продуманными и отлично документированными свойствами и методами.
0
3449 / 1110 / 494
Регистрация: 29.05.2016
Сообщений: 4,566
03.12.2019, 18:38  [ТС]
Начнем с того, что белиберда в качестве примера шла в справке, продолжим тем, что на выходе список файлов каталога, из которого запускается скрипт, а закончим тем, что не нужно хамить, уважаемый
0
 Аватар для volodin661
6799 / 2298 / 349
Регистрация: 10.12.2013
Сообщений: 7,924
03.12.2019, 18:39
Цитата Сообщение от Karen87 Посмотреть сообщение
Я так понимаю выражение после знака равенства присваивает переменной весь список файлов в каталоге?
да.

но не обязательно список файлов.
это может быть и список обьектов из Registry ( зависит от контекста и Провайдера ).
0
3449 / 1110 / 494
Регистрация: 29.05.2016
Сообщений: 4,566
03.12.2019, 18:40  [ТС]
И, кстати, на ты мы с Вами не переходили. Видимо о культуре общения powershell Вас не уведомлял...
0
 Аватар для volodin661
6799 / 2298 / 349
Регистрация: 10.12.2013
Сообщений: 7,924
03.12.2019, 18:42
'Белиберда' и остальные пассажи относилась не к тебе, а к cmd.
Странно, что приходится это разъяснять.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
03.12.2019, 18:48
Цитата Сообщение от Karen87 Посмотреть сообщение
PowerShell логичнее для восприятия?
PowerShell
1
2
# получить три самых меньших по размеру файла в каталоге (если не указан, то текущий)
dir -File|sort length | select -first 3
Логично?
PowerShell
1
2
# файлы больше 1 kb 
dir | ? {$_.Length -gt 1kb}
Логично?

PowerShell
1
2
#минимальный, максимальный, суммарный и средний размер всех файлов в текущем каталоге.
dir| measure length -min -max -aver -sum
Логично?

PowerShell
1
2
# подсчитать кол-во строк, слов и символов в тексте, вывести как список
cat test.txt|measure -line -word -char|fl
fl - это сокращение для команды format-list.
cat - это алиас для get-content
dir - алиас для Get-ChildItem

Многие часто используемые команды имеют такие алиасы для удобства.
0
 Аватар для volodin661
6799 / 2298 / 349
Регистрация: 10.12.2013
Сообщений: 7,924
03.12.2019, 19:04
Цитата Сообщение от Karen87 Посмотреть сообщение
Видимо о культуре общения powershell Вас не уведомлял...
Дорогой друг, я потратил своё время, стараясь сделать так, чтобы ты не тратил свою молодость на вышеупомянутую белиберду.
Предмета для технической дискуссии тут нет, всё очевидно.
Но на дискуссию по поводу принудительной вежливости я тратить своё время не хочу,
для меня тут тоже всё очевидно.
0
3449 / 1110 / 494
Регистрация: 29.05.2016
Сообщений: 4,566
03.12.2019, 19:14  [ТС]
Вас никто не принуждал, не стоило делать одолжение, а демонстративная надменность и пренебрежение к человеку, который не совсем "в теме" чести Вам не делает. Успехов в добровольном хамстве, я Вас прощаю!
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
03.12.2019, 21:37
Цитата Сообщение от Karen87 Посмотреть сообщение
что на выходе список файлов каталога
В cmd нет никаких списков\массивов. От слова совсем. Так что на выходе батника просто строка сконкатенированная через пробел.
В отличие от powershell, где есть все стандартные типы данных и у этих типов данных есть все нужные методы.
PowerShell
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
PS C:\> > $files = dir -file -name # для удобства берем только файлы и только имена файлов вместо полных путей
PS C:\> > $files
autoexec.bat
BCD_Backup_05Sep2018
config.sys
for_test.bat
msvcrt.dll.txt
RakhniDecryptor.1.21.26.1_23.06.2019_23.50.17_log.txt
rename.py
slist.txt
test.vhd
 
PS C:\> > $files.GetType()  # что у нас за тип данных?
 
IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array
 
PS C:\> > # Массив System.Array с типом данных System.Object (то есть универсальный массив). Значит можно взять значения по индексам
PS C:\> > $files[0..3]  # срез списка из элементов от нулевого до третьего
autoexec.bat
BCD_Backup_05Sep2018
config.sys
for_test.bat
 
PS C:\> > # А если мы хотим узнать что умеет делать этот объект типа массив?
PS C:\> > ,$files|member   # запятая перед именем переменной нужна  только для объекта типа массив, чтобы получить именно его атрибуты, а не атрибуты содержащихся в нем строк. Либо пишем: member -InputObject $files
 
 
   TypeName: System.Object[]
 
Name           MemberType            Definition
----           ----------            ----------
Count          AliasProperty         Count = Length
Add            Method                int IList.Add(System.Object value)
Address        Method                System.Object&, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Address(int )
Clear          Method                void IList.Clear()
Clone          Method                System.Object Clone(), System.Object ICloneable.Clone()
CompareTo      Method                int IStructuralComparable.CompareTo(System.Object other, System.Collections.IComparer comparer)
Contains       Method                bool IList.Contains(System.Object value)
CopyTo         Method                void CopyTo(array array, int index), void CopyTo(array array, long index), void ICollection.CopyTo(array array, int
Equals         Method                bool Equals(System.Object obj), bool IStructuralEquatable.Equals(System.Object other, System.Collections.IEqualityCo
Get            Method                System.Object Get(int )
GetEnumerator  Method                System.Collections.IEnumerator GetEnumerator(), System.Collections.IEnumerator IEnumerable.GetEnumerator()
GetHashCode    Method                int GetHashCode(), int IStructuralEquatable.GetHashCode(System.Collections.IEqualityComparer comparer)
GetLength      Method                int GetLength(int dimension)
GetLongLength  Method                long GetLongLength(int dimension)
GetLowerBound  Method                int GetLowerBound(int dimension)
GetType        Method                type GetType()
GetUpperBound  Method                int GetUpperBound(int dimension)
GetValue       Method                System.Object GetValue(Params int[] indices), System.Object GetValue(int index), System.Object GetValue(int index1,
IndexOf        Method                int IList.IndexOf(System.Object value)
Initialize     Method                void Initialize()
Insert         Method                void IList.Insert(int index, System.Object value)
Remove         Method                void IList.Remove(System.Object value)
RemoveAt       Method                void IList.RemoveAt(int index)
Set            Method                void Set(int , System.Object )
SetValue       Method                void SetValue(System.Object value, int index), void SetValue(System.Object value, int index1, int index2), void SetV
ToString       Method                string ToString()
Item           ParameterizedProperty System.Object IList.Item(int index) {get;set;}
IsFixedSize    Property              bool IsFixedSize {get;}
IsReadOnly     Property              bool IsReadOnly {get;}
IsSynchronized Property              bool IsSynchronized {get;}
Length         Property              int Length {get;}
LongLength     Property              long LongLength {get;}
Rank           Property              int Rank {get;}
SyncRoot       Property              System.Object SyncRoot {get;}
Как-то так...

Добавлено через 43 минуты
Цитата Сообщение от Karen87 Посмотреть сообщение
не понимаю зачем нужно set LIST= и логику set LIST=!LIST!...
Вот вам пример нормальной логики конкатенации: берем некий список (в данном случае, просто цифры от 1 до 5) и склеиваем (конкатенируем) их к пустой переменной $list разделяя пробелом (полный аналог батника из вашего примера).
PowerShell
1
2
3
4
5
6
7
8
PS C:\> > $list = ""
PS C:\> > foreach ($i in 1..5) {
>>     $list =  "$list $i"  # тоже самое что и $list = $list + " " + $i
>> }
>> echo $list
>>
 1 2 3 4 5
PS C:\> >
Что тут особенного? Не нужно никакой магии с включением\отключением расширенного отложенного выполнения команд
(заклинание Setlocal EnableDelayedExpansion). Не нужно никаких процентиков или восклицательных знаков для раскрытия значений переменных. Переменная $list будет логично изменяться на каждой итерации цикла, то есть так как мы этого ожидаем интуитивно. На каждой итерации цикла к ней будет добавляться новое значение:
Code
1
2
3
4
5
[1] $list = 1
[2] $list = 1 2
[3] $list = 1 2 3
[4] $list = 1 2 3 4
[5] $list = 1 2 3 4 5
Запись $list = $list + $i в большинстве языков программирования можно сократить и написать так:
Code
1
$list += $i
Более того, в powershll для этого вообще цикл не нужен:

PowerShell
1
2
PS C:\> > 1..5 -join " "  # надеюсь, понятно, что вместо циферок здесь могло быть что угодно
1 2 3 4 5
Ну а зачем безвестные (ну реально никто не знает их имен) создатели cmd решили, что такую вот элементарную операцию нужно обязательно выполнять с заклинаниями, танцам с бубнами и восклицаниями!, нужно спрашивать у них. Вот только какой с них спрос спустя три десятка лет...
0
3449 / 1110 / 494
Регистрация: 29.05.2016
Сообщений: 4,566
04.12.2019, 08:49  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
В cmd нет никаких списков\массивов.
Благодарю Вас, всё очень доступно объяснили. Подскажите, пожалуйста, с чего начать изучение powershell? Может быть есть классическая литература, признанная большинством пользующимся данным инструментом?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.12.2019, 08:49
Помогаю со студенческими работами здесь

Книга "Конечный автомат 2: Возвращение". Часть 1. Разбор. Глава 8. Имя, проверка строки и разбор до. На том ли я пути?
Наверное, иногда прилюдно выругаться полезно... Стоило мне в предыдущей теме написать "омерзительный конечный автомат", как...

Как можно связать работу скрипта из балуна с работой скрипта на странице?
Первый раз задаю вопрос, извините если не в тот раздел. В общем, делаю метку через Яндекс карты и в балунКонтент записываю кнопку с...

Выполнение php скрипта по заданию cron и .htaccess каталога скрипта
Гуру, направьте как?: Есть php скрипт, который раз в неделю должен делать рассылку по базе мэйлов. Лежит на хостинге в папке. Если его...

Как из одного скрипта изменить переменную (int) другого скрипта?
У меня есть два скрипта (money который отвечает за общее количество денег и CarBuy который отвечает за покупку машины). Мне нужно, чтобы...

Запуск скрипта для анализа папки и запуска другого скрипта
Мне нужно написать скрипт, который каждую секунду (или 5 сек) сканировал определенную папку на поиск определенного файла. Например...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru