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

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

Модерирует : KLASS, IFkO

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

Открыть новую тему     Написать ответ в эту тему

KLASS



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Старые и смежные темы: по CMD и в Программах | по PowerShell | В помощь системному администратору | Прикладное программирование

PowerShell
Версии | Ассоциация и подпись сценариев
Сценарий для ассоциации файлов PowerShell и запуска неподписанных скриптов.
 
Прочее
  • Если используете "белый список" в брандмауэре Windows, то для работы сценариев в сети необходимо создать 2 исходящих правила для svchost.exe и PowerShell.exe.
  • В отличие от батников, кодировка скриптов на PowerShell должна быть 1251 (ANSI). Начиная с версии PowerShell Core 6.0, кодировка по умолчанию UTF8NoBOM.
Расширение возможностей
Функции
Write-Color
Output-DebugString
Провайдеры
Готовые скрипты
Ошибки и предупреждения в журнале событий по электронной почте (в4.0)
Преобразование алиасов в скриптах к полным командам.
Получение детализированной информации из файлов.
Скачивание файлов по списку из файла .csv, ведение лога
Компиляция страниц html сохранённых из браузера в chm
 
Полезные ссылки | Будет ли репозиторий PowerShell на ru-board?

Cmd
Для перекодирования кирилицы 866<—>1251 пользуйтесь онлайн сервисом Перекодировщик кириллицы
 
Готовые решения и частые вопросы
 
Описания работы команд и символов участниками темы:
setlocal enabledelayedexpansion и переменные окружения
символы & и && в командной строке
Переменная %0
 
Полезные ссылки и утилиты

WSH (VBScript, JScript)
Программирование "удобняшек" на VBScript

Примечания:
• Большие куски кода заключайте в тэг [ more ]
• Чтобы не копировались концевые пробелы из форума, жмите на ссылку "Редактировать" в посте, и уже из редактора копируйте код без пробелов иначе сценарий может работать неправильно. Также для удаления концевых пробелов пользуйтесь скриптом от Nagual, или VBS-Скрипт-Модулем от ViSiToR.
• Сторонние консольные утилиты можно использовать только в виде готового решения и только в рамках сценариев. Никаких обсуждений и обучений работе с утилитами не предусмотрено и прямо запрещено правилами топика.
Шапка и около-темные вопросы |

Всего записей: 7476 | Зарегистр. 12-10-2001 | Отправлено: 13:40 17-02-2018 | Исправлено: m00slim25, 22:28 01-11-2018
Smitis

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

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


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

Вопрос не в том, как это работает, вопрос в том, что это не очень надёжно. Зрительно не всегда возможно сразу определить, к какому блоку относиться переменная. Или по другому - по имени переменной невозможно определить, какую информацию она содержит и изменить это (дать осмысленное имя нельзя). А это ухудшает читабельность кода. А значит снижает надёжность.

Цитата:
Навскидку - вряд ли. Но в сомнительных случаях, открываю спецификацию и запускаю поиск...

Тут один вундервафлист нам рассказывал, как в PS всё просто, что чуть ли не сам за программиста думает. И как здорово, не отвлекаясь на мелочи, думать о глобальных вселенских проблемах (не дословно, но смысл такой).
 


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

Всего записей: 1454 | Зарегистр. 09-02-2003 | Отправлено: 18:55 18-11-2018 | Исправлено: Smitis, 18:56 18-11-2018
LevT



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

Цитата:
Или по другому - по имени переменной невозможно определить, какую информацию она содержит и изменить это

 
Это не баг, а фича.
 
 

Цитата:
(дать осмысленное имя нельзя)

 
$filename = $_
если так приспичило

Всего записей: 10857 | Зарегистр. 14-10-2001 | Отправлено: 19:01 18-11-2018
Smitis

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

Цитата:
Это не баг, а фича.

Пусть будет фича. Фича, снижающая читабельность кода. Так лучше?

Цитата:
$filename = $_
если так приспичило

Спасибо, Кэп! Ваш совет как всегда своевременен и сходу решает все проблемы.


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

Всего записей: 1454 | Зарегистр. 09-02-2003 | Отправлено: 19:46 18-11-2018
YuS_2



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

Цитата:
вопрос в том, что это не очень надёжно. Зрительно не всегда возможно сразу определить, к какому блоку относиться переменная.

Возможно. А может быть, что это просто дело привычки... не так уж много вариантов ведь. При частом использовании, это непременно отложится в памяти и будет использоваться "на автомате"...

Цитата:
Или по другому - по имени переменной невозможно определить, какую информацию она содержит и изменить это (дать осмысленное имя нельзя). А это ухудшает читабельность кода. А значит снижает надёжность.

Ну, я не знаю, у меня пока особых проблем не возникало... да и в любом случае, озвученный Вами выше способ обхода, всегда в наличии. Ведь на все случаи жизни именованными переменными, к тому же автоматическими, запастись невозможно (кроме того, это сильно усложнило бы использование однотипных операций), поэтому в частных случаях просто можем присвоить значение другой переменной, с любым именем и можем оперировать уже её значением. Т.е. положение же не безвыходное...
 

Цитата:
И как здорово, не отвлекаясь на мелочи, думать о глобальных вселенских проблемах

Ну, понятно же, что "думать" и "предполагать" совсем не эквивалент "реальности" и "существованию"...

Всего записей: 2102 | Зарегистр. 03-02-2009 | Отправлено: 19:56 18-11-2018 | Исправлено: YuS_2, 19:59 18-11-2018
LevT



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


Цитата:
Фича, снижающая читабельность кода.

 
Кому это мешает, вольны PS не использовать.
Мне - не мешает. И когда я совсем недавно сам наткнулся на $_ в блоке catch, я только порадовался возможности освежить знания.
 
Код с вложенными скриптблоками $_ вообще-то не предназначен для чтения чайниками--новичками-подмастерьями, для них пишется такое.

Всего записей: 10857 | Зарегистр. 14-10-2001 | Отправлено: 20:00 18-11-2018
Baltazar500



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите, ЧЯДНТ ?
Код:
setlocal
 
:aaa
for /f %%a in ('type 123.txt') do set aaa=%%a
 
:bbb
for /f %%a in ('type 123.txt') do call :ccc %%a
 
:ccc
echo %~1
if %aaa%==%~1 nircmd wait 3000 && goto bbb
if %~1==123 nircmd wait 3000 && goto :aaa
 
endlocal
 
pause
В скрипте мониторится содержимое файла 123.txt и скрипт его гоняет по кругу, пока значение не меняется или не становится !=123. Далее по идее должен идти пауза и завершение скрипта, но после паузы его продолжает гонять по кругу. В целом есть решение в виде exit'a после паузы, но мне кажется это больше костыль, чем правильное решение.

Всего записей: 1082 | Зарегистр. 19-09-2011 | Отправлено: 20:02 18-11-2018
Smitis

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

Цитата:
Мне - не мешает.

Я абсолютно уверен, что для написания вундерфавель всё это не мешает. Поэтому, прошу, Вас, не заморачивайтесь такими сложными проблемами.


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

Всего записей: 1454 | Зарегистр. 09-02-2003 | Отправлено: 20:04 18-11-2018
iNNOKENTIY21

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

Цитата:
user-agent=Wget  

Спасибо, user-agent пробовал, но firefox, Wget не догадался бы. И про ftp не знал..

Всего записей: 1099 | Зарегистр. 16-08-2012 | Отправлено: 20:10 18-11-2018
Smitis

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

Цитата:
но после паузы его продолжает гонять по кругу

Потому что завершения командного файла из :ccc вернёт управление в точку вызова call :ccc.
Кроме того, вызов call в случае goto нормально не завершается. Стек вызовов конечно большой, но в случае долгой работы он может и закончиться...


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

Всего записей: 1454 | Зарегистр. 09-02-2003 | Отправлено: 20:16 18-11-2018
YuS_2



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

Цитата:
В целом есть решение в виде exit'a после паузы, но мне кажется это больше костыль, чем правильное решение.


Код:
Команда CALL допускает использование меток в качестве
адресата вызова. Применяется следующий синтаксис:
 
    CALL :метка аргументы
 
При вызове создается новый контекст текущего пакетного файла
с заданными аргументами, и управление передается на инструкцию,
расположенную сразу после метки.  Для выхода из такого
пакетного файла необходимо дважды достичь его конца.  Первый
выход возвращает управление на инструкцию, расположенную
сразу после строки CALL, а второй выход завершает выполнение
пакетного файла.

то бишь, правильный вызов call должен быть оформлен примерно так:

Код:
call :mark
 
rem здесь либо выход из скрипта exit, либо прыжок через блок кода, вызываемого по call
goto next
 
:mark
rem тут блок кода для выполнения по вызову call
exit /b
 
:next
rem продолжение скрипта...

Всего записей: 2102 | Зарегистр. 03-02-2009 | Отправлено: 20:23 18-11-2018
Baltazar500



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Smitis, YuS_2, спасибо за разъяснения, буду разбираться )))

Всего записей: 1082 | Зарегистр. 19-09-2011 | Отправлено: 20:26 18-11-2018 | Исправлено: Baltazar500, 20:28 18-11-2018
YuS_2



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

Цитата:
спасибо за разъяснения

Да не за что...
Тут просто надо запомнить, что по Call происходит переход на метку (в случае вызова подпрограммы по метке), последующее выполнение всего кода за этой меткой до команды exit/b, а при отсутствии этого exit/b, до конца файла и обязательный возврат на следующую инструкцию за самим Call...
Т.е. с организацией таких циклов надо быть осторожнее, чтобы не свалиться в "бесконечный" (как сказали выше, стек не безразмерный, поэтому в кавычках) цикл.

Всего записей: 2102 | Зарегистр. 03-02-2009 | Отправлено: 20:37 18-11-2018
Открыть новую тему     Написать ответ в эту тему

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

Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Сценарии для Windows

Имя:
Пароль:
Сообщение

Для вставки имени, кликните на нем.

Опции сообщенияДобавить свою подпись
Подписаться на получение ответов по e-mail
Добавить тему в личные закладки
Разрешить смайлики?
Запретить коды



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

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.Board
© Ru.Board 2000-2018

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru