Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » Командная строка, батники, сценарии (bat, cmd)

Модерирует : gyra, Maz

Maz (19-09-2020 13:36): Командная строка, батники, сценарии (bat, cmd) Часть 6  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

cchameleone



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Командная строка, батники\сценарии (bat, cmd)
(часть 1) (часть 2) (часть 3) (часть 4)
Вопросы, задачи и их решения по работе с командной строкой, файлами, а также сопутствующие ссылки.

Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!! Чтобы не копировались концевые пробелы из форума, жмите на ссылку "Редактировать" в посте, и уже из редактора копируйте батник без пробелов.
 
Примечание: Большие куски кода заключайте в тэг [ more ].  

Смежные темы:
В помощь системному администратору » Автоматизация администрирования
Microsoft Windows » Сценарии Windows

Полезные ссылки:
· Из Windows XP Professional Product Documentation:
» Описание Cmd.exe » Command shell overview
» Using batch files » Using batch parameters » Using filters » Using command redirection operators
 
· Уроки bat-аники (для начинающих): первый и второй
· Курс из 19 лекций "Командная строка и сценарии Windows"
· Попов А. Командная строка и сценарии Windows (PDF). Курс лекций для начинающих
· Бокалий В. Командная строка (pdf-брошюрка в 20 страниц)
· Александров А., Дибров А. Урок bat-аники (pdf)
· Уильям Р. Станек - Командная строка Windows. Справочник администратора
 
· Скрываем консольные окна, Выполнение BAT-скриптов без вызова окна консоли
· cmdow — изменение параметров и видимости дос-окна, Статья в КОМПЬЮТЕРРАONLINE
· Набор GNU утилит для win32
· HS_Packet.7z - Пакет утилит для организации интерфейса в bat-файлах
· Использование ansi.sys
· blat — отправка почты из консоли
· Команды RunDll32
· Quick Batch File Compiler - Позволяет превратить ваш батник в независимое приложение
· Easy Batch Builder+Rus+Crack - Редактор BAT файлов.Через графический интерфейс программы вы сможете быстро конструировать пакетные файлы практически любой сложности. (В комплекте есть Лоадер созданный с помощью Sign Of Misery некоторые антивирусы обзывают его вирусом. Вам решать: ставить или не ставить) (ЗЕРКАЛО)
· Простой способ получать текущую дату всегда в одном формате (не зависит от языков и настроек) ещё и ещё
· Переход из 32-битной версии cmd.exe в 64-битную (1) (2)(3)

Всего записей: 2279 | Зарегистр. 16-10-2015 | Отправлено: 09:22 29-04-2016 | Исправлено: Maz, 08:47 26-03-2020
Silver Raven

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GCRaistlin
Знал бы - пофиксил. Пока что, явной причины не вижу...

Всего записей: 149 | Зарегистр. 12-10-2012 | Отправлено: 12:09 20-07-2019
Smitis



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Silver Raven
Так, чисто из спортивного интереса, Ваш скрипт с предыдущей страницы на PowerShell:

Код:
$ControlPanelFilesList = @(
    "Silver Raven mods pack data\Additional options\Alternate Start\Alternate Start - Live Another Life.esp"
    "Silver Raven mods pack data\Additional options\Alternate Start\Alternate Start - Live Another Life.bsa"
    "Silver Raven mods pack data\Additional options\Serana\Cured\00002b6c.nif"
    "Silver Raven mods pack data\Additional options\Serana\Vampire\00002b6c.nif"
    "Silver Raven mods pack data\Additional options\Vampires eyes\Blue\eyeargonianvampirefemale.dds"
    "Silver Raven mods pack data\ENB\enbseries\textures\SMAA_AreaTex.dds"
    "Silver Raven mods pack data\ENB\enbseries\textures\SMAA_SearchTex.dds"
    "Silver Raven mods pack data\ENB\enbseries\!_L_Dungeons.ini"
    "Silver Raven mods pack data\ENB\enbseries\!_L_Dwarven_Ruins.ini"
)
$ControlPanelFilesListMissingFiles = ""
 
# Проверка наличия всех файлов для панели управления в Silver Raven mods pack data
$ControlPanelFilesList | where { -not (Test-Path $_)} | foreach {$ControlPanelFilesListMissingFiles += "`n"+$_}
if ($ControlPanelFilesListMissingFiles) {
    Write-Host "*ОШИБКА! Нижеуказанные файлы, необходимые для корректной работы программы, не найдены:$ControlPanelFilesListMissingFiles"
    Write-Host "Извлеките папку Silver Raven mods pack data из установочных архивов со сборкой в папку игры вручную и перезапустите панель управления."
    Write-Host "Убедитесь, что антивирусное ПО не блокирует ее работу."
}

Вместо отдельного файла со списком файлов - массив.


----------
Разум когда-нибудь победит

Всего записей: 3179 | Зарегистр. 09-02-2003 | Отправлено: 13:26 20-07-2019
VVL99

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Silver Raven (пост)
Цитата:
VVL99  
Хотелось бы взглянуть на код тех красивых разделителей строк, что вы показывали на своих скриншотах. Например, этот: https://jpegshare.net/images/02/c6/02c6fe0539262a177373ad8005d327ff.png
Конкретно этого уже нет, поскольку я заменил его следующим вариантом где отдельно имена файлов и отдельно адреса без имён файлов с указанием полного адреса включая диск.
А потом не совсем ясно про какие разделители идёт речь, про подсветку или переносы строки с подчёркиванием.
 
 
Добавлено:
Silver Raven
И всё это теперь в таком виде - https://dump.video/i/2l4HNt.mp4
только два варианта, один с опциями.

Всего записей: 4158 | Зарегистр. 03-02-2011 | Отправлено: 14:43 20-07-2019 | Исправлено: VVL99, 14:59 20-07-2019
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
GCRaistlin

Цитата:
Г. Остер. Вредные советы по написанию батников.

Подробней пожалуйста. Падение скорости знаю, повышение читаемости знаю. Что еще?
 
Silver Raven
Повторяю свои вопросы.

Цитата:
Во-первых - у Вас ошибка. if defined variable - должно быть без процентов.  
Во-вторых - Вы составляете список ControlPanelFilesListMissingFiles - и затем переписываете его единицей, не используя. Тогда зачем Вам список?  
В третьих - не пойму - Вы проверяете файлы по списку %$ControlPanelFilesList% и если что-то не находится - проходитесь по всему ini и все поля рассматриваете как список файлов? Но зачем?

Код под морем смотрели/пробовали?

Цитата:
Только что-то надо еще подергать, потому как в случае, если все проверяемые по списку файлы на месте, CMD-шник падает.  

Обратите особое внимание на свое  
if defined %ControlPanelFilesListMissingFiles%
Подсказка - вопрос №1.

Всего записей: 1883 | Зарегистр. 07-08-2002 | Отправлено: 18:24 20-07-2019 | Исправлено: Alex_Piggy, 18:24 20-07-2019
Silver Raven

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
Тут суть еще в том, что я совсем недавно взялся за цикл for и пока слабо понимаю его нюансы. По сути, мой код выше, безумная смесь догадок, подсказок и подсмотренных на просторах сети элементов, которые как-бы работают, иногда... До недавнего времени, такие вещи просто не требовались.
 
Короче, я просто пока никак не допру, что поправить
 

Цитата:
Код под морем смотрели/пробовали?

Очепятка?

Всего записей: 149 | Зарегистр. 12-10-2012 | Отправлено: 18:59 20-07-2019 | Исправлено: Silver Raven, 19:06 20-07-2019
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Silver Raven
Прошу прощения, Вы просто попали на старый ... не то чтобы холивар, но яростное расхождение во мнениях. Почти как с окавычиванием set. В общем - для справки и на будущее - endlocal обнуляет все изменения в переменных сделанные после последнего setlocal ( который, кстати, обладает максимально глубиной вложенности).
 

Цитата:
Цитата: Код под морем смотрели/пробовали?
Очепятка?

Нет. "Код под тегом more / подробнее" в позапрошлом посте.
Командная строка, батники, сценарии (bat, cmd)
 

Цитата:
Короче, я просто пока никак не допру, что поправить

1. Удалить пробелы в концах строк с set
2. Заменить  
if defined %ControlPanelFilesListMissingFiles% (
на  
if defined ControlPanelFilesListMissingFiles (
3. Затем поставьте скобку после  
for %%? in (%%B) do if not exist %%? set ControlPanelFilesListMissingFiles=1 && echo %%~?
И что-то может запуститься.

Всего записей: 1883 | Зарегистр. 07-08-2002 | Отправлено: 19:16 20-07-2019
Silver Raven

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
Тег "more" не заметил, сорри. Речь об этом варианте?:
 

Код:
 
call :read_control_panel_files_list_config "%ControlPanelFilesListConfig%"
   
 :: Проверка наличия всех файлов для панели управления в Silver Raven mods pack data  
set "ControlPanelFilesIsMissingFiles="
for %%? in (%$ControlPanelFilesList%) do (
if not defined ControlPanelFilesIsMissingFiles if not exist "%%~?" set "ControlPanelFilesIsMissingFiles=1"
)  
   
if defined ControlPanelFilesIsMissingFiles (
 color fc  
  echo.  
  echo.  
  echo.  
  echo *ОШИБКА! Нижеуказанные файлы, необходимые для корректной работы программы, не найдены:  
  echo.  
  echo.  
  for %%? in (%$ControlPanelFilesList%) do if not exist "%%~?" <nul set /p "x='%%~?', "
  echo.  
  echo.  
  echo.  
  echo *ОШИБКА! Вышеуказанные файлы, необходимые для корректной работы программы, не найдены.  
  echo.  
  echo Извлеките папку Silver Raven mods pack data из установочных архивов со сборкой в папку игры вручную и перезапустите панель управления. Убедитесь, что антивирусное ПО не блокирует ее работу.  
  echo.  
  echo.  
 pause  
 exit  
)
 
 
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  
 :: Чтение конфиг-файла fileslist.cfg  
:read_control_panel_files_list_config  
for /f "usebackq eol=; tokens=1,2* delims==" %%a in ("%~1") do set "$%%a=%%b"
exit /b
 

 
или моем:
 

Код:
 
call :read_control_panel_files_list_config "%ControlPanelFilesListConfig%"
 
:: Проверка наличия всех файлов для панели управления в Silver Raven mods pack data
setlocal EnableDelayedExpansion
for %%? in (!$ControlPanelFilesList!) do (
    if "" == "!!" endlocal
    if not exist "%%?" (
      set File=%%?
      setlocal EnableDelayedExpansion
      for /f "delims=" %%A in ("!ControlPanelFilesListMissingFiles!, !File!") do (
        endlocal
        set ControlPanelFilesListMissingFiles=%%A
      )
    )
)
 
if defined ControlPanelFilesListMissingFiles (
color fc
 echo.
 echo.
 echo.
 echo *ОШИБКА! Нижеуказанные файлы, необходимые для корректной работы программы, не найдены:
 echo.
 echo.
 
for /f "usebackq tokens=1* delims==" %%A  in ("%ControlPanelFilesListConfig%") do (
    for %%? in (%%B) do if not exist %%? set ControlPanelFilesListMissingFiles=1 && echo %%~?
)
 
 echo.
 echo.
 echo.
 echo *ОШИБКА! Вышеуказанные файлы, необходимые для корректной работы программы, не найдены.
 echo.
 echo Извлеките папку Silver Raven mods pack data из установочных архивов со сборкой в папку игры вручную и перезапустите панель управления. Убедитесь, что антивирусное ПО не блокирует ее работу.
 echo.
 echo.
pause
exit
)
 
 
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Чтение конфиг-файла fileslist.cfg
:read_control_panel_files_list_config
    for /f "usebackq eol=; tokens=1,2* delims==" %%A in ("%~1") do set "$%%A=%%B"
exit /b
 

Ваш вариант работает, вне моего CMD-шника. (внутри него пока никак. буду искать причину.) Только все в кучу выводит, я чуть изменил:
 

Код:
 
for %%? in (%$ControlPanelFilesList%) do if not exist "%%~?" <nul echo %%~?
 

 
UPD. Валится, если все искомые файлы на месте.

Всего записей: 149 | Зарегистр. 12-10-2012 | Отправлено: 19:41 20-07-2019 | Исправлено: Silver Raven, 20:12 20-07-2019
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Silver Raven
"Поправить" - в Вашем . Вижу Вы учли мои замечания. Теперь работает?

Цитата:
UPD. Валится, если все искомые файлы на месте.

Мой код или Ваш(первый или второй вариант из поста)? Без моего кода валится или нет? Расставьте "echo BreakN & pause" (где N - число) в подозрительных местах - после какого упадет?
Можете скинуть полный вариант?

Всего записей: 1883 | Зарегистр. 07-08-2002 | Отправлено: 20:30 20-07-2019 | Исправлено: Alex_Piggy, 20:32 20-07-2019
Silver Raven

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
Валится ваш вариант. Мой по прежнему не работоспособен.
 
Полный вариант CMD-шника (осторожно, много говнокода, может вызывать рвотные позывы!) с проверяемыми им файлами одним архивом: https://www.upload.ee/files/10246305/Silver_Raven_mods_pack_control_panel.zip.html

Всего записей: 149 | Зарегистр. 12-10-2012 | Отправлено: 21:44 20-07-2019 | Исправлено: Silver Raven, 21:45 20-07-2019
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Silver Raven
Увидел... Прошу прощения за спутанность объяснения.
Я рассматриваю call метки как вызов функции. Это спецкод, требующий определенных параметров и нельзя допускать, чтобы при последовательном выполнении батника курсор попадал на него - поэтому он с двух сторон должен быть выделен при помощи exit ("exit" перед меткой вызова и "exit /b" по завершении).
Сейчас вылетает потому что пытается выполнить "Чтение конфиг-файла fileslist.cfg" не при вызове через call с именем файла в качестве параметра - а в ходе выполнения батника без параметров. То есть пытается открыть файл с именем "%~1" - первый параметр батника, который не определен.
Мне кажется, что будет достаточно перед "Чтение конфиг-файла fileslist.cfg" добавить строку с  
goto :main_menu

Всего записей: 1883 | Зарегистр. 07-08-2002 | Отправлено: 22:30 20-07-2019
Silver Raven

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
Понял, спасибо за разъяснение. Только я поставлю call на autoupdate, т.к. этот модуль идет следующим по списку при запуске CMD-шника. Один знакомый мне говорил избегать goto как огня, он же пообещал с помочь с переходом на С# как-нибудь...
 
У меня есть еще пара небольших вопросов, не против, если я напишу о них в личку?

Всего записей: 149 | Зарегистр. 12-10-2012 | Отправлено: 23:32 20-07-2019 | Исправлено: Silver Raven, 23:34 20-07-2019
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy

Цитата:
Падение скорости знаю, повышение читаемости знаю. Что еще?

Первого вполне достаточно. Кроме того:

Код:
 
set "a=&"
call echo %%a%%
setlocal enabledelayedexpansion
echo !a!
 

Зачем использовать костыли, если есть нормальный способ?

----------
Magically yours
Raistlin

Всего записей: 3962 | Зарегистр. 18-04-2005 | Отправлено: 01:07 21-07-2019
VVL99

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Silver Raven
Всё, интерес пропал, вот окончательный результат - https://transfiles.ru/o6vwi
Всё так же как на видео. Строго не судите, это просто поделка.
 
Добавлено:
Цвет шрифта можно менять самому, это не сложно:
https://jpegshare.net/images/c0/1a/c01a498eefff0359c152fb4e7bedbfe3.png
https://jpegshare.net/images/23/b7/23b7c91a19ad77f7d358c608be1c7936.png
https://jpegshare.net/images/c4/2a/c42ad7932bcdc617089b5e99330b42e6.png

Всего записей: 4158 | Зарегистр. 03-02-2011 | Отправлено: 16:42 21-07-2019 | Исправлено: VVL99, 16:58 21-07-2019
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy

Цитата:
Вы просто попали на старый ... не то чтобы холивар, но яростное расхождение во мнениях. Почти как с окавычиванием set.

Кстати, о птичках. Как оказалось, такая работа с аргументом комстроки:

Код:
 
set Arg=%1
 
 
rem Don't delete 2 blank lines above
 

не является панацеей от падения скрипта - уронить его можно следующим образом:

Код:
test.cmd ^&

Вариант с

Код:
set "Arg=%1"

как известно, роняется так:

Код:
test.cmd "&"

 
Предлагаю вариант, который мне уронить не удалось:

Код:
 
2>nul ((set "Arg=%1"
) || set Arg=%1
 
)
 

Перевод строки перед последней скобкой обязателен. Дальнейшая работа с Arg, естественно, только через delayed expansion.
Из логики работы костыля вытекает различие в способах передачи неокавыченного символа "^" в аргументе в зависимости от наличия или отсутствия окавыченных спецсимволов: либо двумя, либо четырьмя "^":
Что хотим передать Какой аргумент комстроки используем    
&^ ^&^^    
^"a" ^^"a"    
"&"^ "&"^^^^

(Аргумент "&"^^ превратится в "&" плюс перевод строки.)
 
Добавлено:
GCRaistlin

Цитата:
Дальнейшая работа с Arg, естественно, только через delayed expansion.

Для одиночных символов из Arg можно и без delayed expansion:

Код:
 
if "%Arg:~1,1%%Arg:~1,1%!" == "vv" echo The 2nd char is v
 


----------
Magically yours
Raistlin

Всего записей: 3962 | Зарегистр. 18-04-2005 | Отправлено: 01:22 22-07-2019 | Исправлено: GCRaistlin, 21:38 16-08-2019
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброе время, GCRaistlin
У меня в Висте двойной перевод строки не работает (падает на "abea^&" без кавычек). Предлагаю вместо него попробовать использовать кавычки перед последней скобкой. Тогда амперсанд может становиться последним символом в строке.

Код:
2>nul ((set "Arg=%1" ) || set Arg=%1"")

PS

Код:
 
set "a=&"
call echo "%%a%%"

Вроде ж недавно - в пределах пары лет - это обсуждали - да, я не доверяю интерпретатору. Поэтому кавычки вокруг убираю при помощи тильды и в дальнейшем окавычиваю вручную. На 95% случаев этого достаточно.

Цитата:
Зачем использовать костыли, если есть нормальный способ?

Если б endlocal не влиял на переменные...
А так, к сожалению, вопрос - чьи костыли велосипеднее. Или чей велосипед костыльнее?

Всего записей: 1883 | Зарегистр. 07-08-2002 | Отправлено: 08:51 22-07-2019
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy

Цитата:
Если б endlocal не влиял на переменные...

Что-то не совсем понятно, о каком влиянии говорится?

Цитата:
А так, к сожалению, вопрос - чьи костыли велосипеднее. Или чей велосипед костыльнее?

Если говорить о костылях, то в cmd они очень часто нужны, как впрочем и в любом другом shell. Просто, где-то их надо больше, где-то меньше, не суть...

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 09:40 22-07-2019
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброе время, YuS_2

Цитата:
Что-то не совсем понятно, о каком влиянии говорится?  

Разве это уже поменяли? Возвращает значения до setlocal.  
setlocal /?

Цитата:
Начало локализации изменений среды в пакетном файле. Изменения среды,
внесенные после выполнения команды SETLOCAL, являются локальными
относительно текущего пакетного файла. Для восстановления их прежних
значений необходимо выполнить команду ENDLOCAL.

Теоретически можно было бы использовать setlocal disabledelayedexpansion - но там максимальная глубина вложенности около 32.

Цитата:
Если говорить о костылях, то в cmd они очень часто нужны, как впрочем и в любом другом shell. Просто, где-то их надо больше, где-то меньше, не суть...

И я про то же. Вопрос для кого какие костыли удобнее/привычнее/сподручнее... Но в любом случае - это костыли...

Всего записей: 1883 | Зарегистр. 07-08-2002 | Отправлено: 09:59 22-07-2019
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy

Цитата:
У меня в Висте двойной перевод строки не работает (падает на "abea^&" без кавычек).

Увлекся лаконизацией и не приметил слона. Тогда так:

Код:
 
2>nul (set "Arg=%1"
)
if errorlevel 1 (
  if defined _Tail set _Tail=
  if not errorlevel 1 (for /f %%z in ("") do cd) || rem
) else (
  set _Tail=1
)
if errorlevel 1 2>nul (set Arg=%1%_Tail%
 
)
 

Увы, без доппеременной никак.
 

Цитата:
Предлагаю вместо него попробовать использовать кавычки перед последней скобкой. Тогда амперсанд может становиться последним символом в строке.

Проверьте с ^^"&" и "&". С первым не упадет, но и ничего после этой комстроки не выполнит.
 

Цитата:
я не доверяю интерпретатору. Поэтому кавычки вокруг убираю при помощи тильды и в дальнейшем окавычиваю вручную.

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

Цитата:
На 95% случаев этого достаточно.

"Книга, в которой 80 % правды, на 100 % лжива".
 

Цитата:
Разве это уже поменяли? Возвращает значения до setlocal.

Этот-то вопрос закрыт точно:

Код:
 
setlocal enabledelayedexpansion
set a=1
for /f "delims=" %%A in ("!a!") do endlocal & set a=%%A
 


----------
Magically yours
Raistlin

Всего записей: 3962 | Зарегистр. 18-04-2005 | Отправлено: 12:08 22-07-2019 | Исправлено: GCRaistlin, 16:46 22-07-2019
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy

Цитата:
Разве это уже поменяли? Возвращает значения до setlocal.

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

Код:
@echo off
set x=1
setlocal
set x=4
endlocal&set x=%x%
echo %x%


Цитата:
в любом случае - это костыли

именно так.

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 14:45 22-07-2019
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Это не костыли, а нормально работающий способ, 100 %-но надежный и предсказуемый.
 
А теперь о настоящих костылях. По размышлении я пришел к выводу, что и новую конструкцию можно уронить:

Код:
test.cmd "&"1

при наличии файла 1.cmd запустит его. Это не дело. Вариант 3:

Код:
 
2>nul (set "Arg=%1"^^
)
if errorlevel 1 2>nul (set Arg=%1^^
rem Don't delete this line
) else set "Arg=%1" & goto $endif
if errorlevel 1 (set /a 0) else set Arg=%1
 
 
rem Don't delete 2 blank lines above
:$endif
 

Тоже не идеальный (и поэтому является костылем): не говоря про GOTO, роняется указанием "&"^|, "&"^<, "&"^>, а от ^^"& оставляет только кавычку. Но там и в лоб - при использовании set Arg=%1 и set "Arg=%1" - результат тот же.

----------
Magically yours
Raistlin

Всего записей: 3962 | Зарегистр. 18-04-2005 | Отправлено: 00:05 23-07-2019 | Исправлено: GCRaistlin, 00:22 23-07-2019
   

Страницы: 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

Компьютерный форум Ru.Board » Компьютеры » Программы » Командная строка, батники, сценарии (bat, cmd)
Maz (19-09-2020 13:36): Командная строка, батники, сценарии (bat, cmd) Часть 6


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru