почему не воспользоваться обычным shutdown поиграв с параметрами s t f
Счас смотрю почему у меня Hibernate отсутствует, вроде так: «Windows 8 especially if you’re a laptop user, You can click Sleep, Shut down, or Restart, but if you want to hibernate your machine, well, you’re outta luck. Why on earth would Microsoft remove this option? I have no idea.
1. You’ll need to access your system’s power settings, which you can do any number of ways. My preferred method: press Win-W (that’s the Windows key and the letter w) to bring up the Settings Search menu, then type power.
2. Click Change what the power buttons do.
3. Click Change settings that are currently unavailable.
4. Scroll down to the bottom of that window to find the «Shutdown settings» section.
5. Click the box next to Hibernate to enable the option.
6. Click Save changes.
Presto! Now, when you go to power down your system, you’ll see the Hibernate option in your list of choices. Also, in that same System Settings window (step 4), you can choose Hibernate for any of the «Power and sleep buttons and lid settings» options.
In other words, if you want your system to hibernate when you press the power button or close the lid, this is where you can configure that setting. Good stuff! «
Ну, вроде элементарно, перевод не нужен..
Всего записей: 457 | Зарегистр. 28-01-2006 | Отправлено:01:53 23-08-2013
ruomyes
BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Делал мануальчик как-то для себя по способам выключения компьютера и заодно хотел поделиться на форуме, но не закончил. И теперь вряд ли уже когда доделаю. Поэтому выкладываю то, что удалось собрать и протестировать, может кому пригодится.
В Windows XP существует несколько способов перезагрузки компьютера:
Режимы завершения работы Windows в свою очередь подразделяются на:
1. Системные режимы:
— Завершение работы до сообщения «Питание компьютера можно отключить» (на AT, на ATX выключение) aka Shutdown — Перезагрузка компьютера aka Reboot или только Windows в 9x/ME (с зажатым Shift) aka Restart — Выход из Windows (завершение пользовательского сеанса) aka Log off — Блокировка рабочей станции (смена пользователя) aka Lock Workstation (вызывается по Win+L, только NT и выше)
Утилита shutdown.exe из состава Windows XP или Windows 2003 также может использоваться и в Windows 2000.
Утилиты tsshutdn.exe и tsdiscon.exe предназначены для завершения работы серверов, использовать их на домашних компьютерах нецелесообразно. Исполняемые файлы этих утилит из состава Windows XP можно использовать и в серверных редакциях Windows 2000 (в Windows 2000 Professional нет, т.к. для работы требуются Службы терминалов), однако утилита tsdiscon.exe в Windows 2000 на практике не работает. В Windows 2k также работает указанная команда с rundll32. Экзешник powercfg.exe от Windows XP также запускается под Win 2k, но его функциональность под вопросом.
Команды перезагрузки и выключения компьютера через rundll32 в Windows 2000 и выше не работают (только в 9x/ME/NT).
Для завершения работы можно использовать специальные скрипты VBScript и JScript. Как и в предыдущем способе в них используются команды Win32Shutdown и Reboot с теми же числовыми значениями. Пример скрипта VBScript с уведомлением о перезагрузке.
Message = «Вы хотите перезагрузить компьютер?» YesNo = MsgBox(Message, vbYesNo) if YesNo = vbYes Then set objWMIService = GetObject(«winmgmts:<(Shutdown)>«) set colOperatingSystems = objWMIService.ExecQuery («Select * from Win32_OperatingSystem») for each objOperatingSystem in colOperatingSystems objOperatingSystem.Win32Shutdown(2) next end if
Вместо Win32Shutdown(2) можно использовать параметр Reboot. Для других операций по завершению работы (выключение, завершение сеанса, и т.п.) меняем число в параметре Win32Shutdown() на одно из указанных в предыдущем способе и переписываем текст уведомления. Если уведомление не нужно, удаляем из скрипта первые три и последнюю строчки. Объекты colOperatingSystems и objOperatingSystem можно заменить на colSoftware и objSoftware соответственно.
Можно также сделать скрипт, который будет просто выводить окно завершения работы:
Dim objShell set objShell = CreateObject(«Shell.Application») objShell.ShutdownWindows set objShell = nothing
Аналогичный скрипт на JScript выглядит следующим образом:
Выключение или перезагрузка компьютера из bat файла
Статья описывает, как выключить или перезагрузить компьютер на Windows из командной строки: PowerShell, JScript/VBScript с WSH, nhss, shutdown. А также дополнительно, как сделать выключение или перезагрузку с задержкой.
Выключить или перезагрузить компьютер из PowerShell
Выключить компьютер можно командной Stop-Computer из консоли PowerShell:
Перезагрузить компьютер можно командой Restart-Computer из консоли PowerShell:
Как это выглядит в консоли PowerShell:
Поскольку PowerShell сейчас устанавливается на Windows по умолчанию, то использование PS команды не требует дополнительных установок.
Чтобы выполнить выключение или перезагрузку через PowerShell из bat файла или из командной строки, их надо вызывать через powershell.
Например, команда перезагрузки локального компьютера в bat файле или командной строке:
Аналогично, команда выключения локального компьютера в bat файле или командной строке:
Выключить или перезагрузить компьютер из JScript/VBScript через WSH
Способ основан на использовании метода Win32Shutdown класса Win32_OperatingSystem:
Выключить компьютер можно следующим скриптом на JScript:
Перезагрузить компьютер можно следующим скриптом на JScript:
Пример на VBScript, с forced restart (добавляется 4):
Поскольку WSH сейчас установлен по умолчанию на Windows, то использование JScript/VBScript не требует установки каких-либо программных компонентов.
Выключить или перезагрузить компьютер программой nhss
Программа nhss предназначена для управления питанием компьютера и позволяет выполнять такие команды, как выключение, перезагрузка, ждущий режим, спящий режим.
Выключить компьютер можно следующей командой:
Перезагрузить компьютер можно следующей командой:
Команды просты в использовании, но потребуется установить программу nhss.exe и прописать путь к ней.
Выключить или перезагрузить компьютер командой shutdown
Выключить компьютер можно следующей командой:
Перезагрузить компьютер можно следующей командой:
Важно! Команда shutdown делает «грубое» завершение Windows, которое на практике приводило к тому, что не сохранялись настройки, сделанных в Windows в текущем сеансе. Поэтому хотя и выключение/перезагрузка компьютера через shutdown действительно срабатывает, я бы не рекомендовал использование shutdown для обычного завершения, а только для экстренных случаев, когда требуется максимально быстро завершить Windows, например, в случае Low Battery на ИБП.
Как выключить компьютер по таймеру
Чтобы настроить выключение компьютера через определенное время, например, через 1 час, это можно сделать выполнением команды выключения с задержкой, см. Сделать задержку в командном файле:
Или через PowerShell с задержкой в 30 минут:
Скрипт замены текста в файле
Синтез речи в скрипте и bat файле
Размер выделенной памяти в командной строке Windows
Выключение или перезагрузка компьютера из bat файла : 1 комментарий
Кодировка ANSI Вот довольно простой и функцианальный батник
Автоматическое выключение компьютеров в локальной сети
Сразу же оговорюсь: данный проект нужно было сделать как можно скорее и потому многое в нём выполнено довольно топорно, и в целом сделан он что называется «на коленке». Есть конечно планы доработки и «причёсывания» его, но пока руки не дошли.
Задача состояла в том, чтобы после завершения рабочего дня в локальной сети конторы не оставалось включённых компьютеров. Реализовав самую первую версию проекта я увидел его очень большой недостаток состоящий в том что он выключает всё поголовно (что находит). А это оказалось неправильно. Всё таки некоторые компьютеры должны работать, при этом нигде не должно остаться процессов 1С ни работающих ни, тем более, зависших. Ибо как и у очень многих под покровом ночи происходит автоматическое обновление базы данных этой самой 1С. собственными средствами она может справиться только с корректными процессами (отсоединить их), а вот зависшие увы ей неподвластны, но при этом они (зависшие процессы) в сочетании с обновлением БД перекорёживают эту самую БД.
Итак приступим. Когда задача полностью оформилась она выглядела так: необходимо приложение для Windows которое обойдя заданный диапазон IP-адресов локальной сети нашла бы в нём работающие в данный момент, дальше обратилась к двум спискам исключений выкинула бы из списка найденных «абсолютные исключения» (те с которыми делать не нужно ничего), а с теми которые входят и во второй список «исключений» проделала бы только то, что уничтожила на них только процессы из заданного ей списка, ну а остальные просто выключила. Вот такая вот получилась витиеватая задачка.
Начну с того, что проект основан на функции:
которая получает получает своим параметром полный текст консольной команды и возвращает текст порождаемый выполнение этой команды в консоли Windows. Признаюсь функция не моя я её где-то нашёл (ввиду того что это было уже довольно давно я точно не помню где, но подозреваю, что на delphiworld.narod.ru) поэтому я привожу её с оригинальными комментариями автора и без каких либо изменений (впрочем для использования в данной программе менять её не было никакой необходимости).
Теперь упомяну какие консольные команды использует данный проект для реализации возложенных на него задач:
1) это всем известный ping он выполняется здесь в таком виде:
2) это команда taskkill она выполняется в виде:
где значение параметра /S (обозначенное здесь как ) это DNS-имя компьютера с которым происходит операция, значение параметра /IM (обозначенное здесь как
) это имя процесса (точнее запускающего его файла, например winword.exe) и наконец параметр /F означает принудительное завершение процесса (без всяких вопросов пользователю: уверен он или нет, сохранить или нет и тому подобное). Этой командой, как вы наверное уже поняли, мы убиваем процессы на удалённом компьютере.
3) это выполнение скрипта (приведу его чуть чуть попозже) который выключает удалённый компьютер:
Теперь приведу сам скрипт для выключения удалённого компьютера:
Dim arg Dim temp if wscript.arguments.count <> 1 then wscript.echo «Ошибка в формате запуска скрипта. Формат запуска: wscript shutdown_net.vbs » wscript.quit 0 end if arg = wscript.arguments(0) temp = «winmgmts://» & arg Set OpSysSet = GetObject(temp).ExecQuery(«select * from Win32_OperatingSystem where Primary=true») for each OpSys in OpSysSet OpSys.Shutdown() ‘ wscript.echo «Выключаю хост » & arg & » отключён. » Next
Как я уже сказал чуть ранее ему в качестве параметра передаётся DNS-имя удалённого компьютера который нужно выключить. Именно DNS-имя увы но заставить его работать с IP-адресом так и не удалось. Скрипт был написан мною, но ввиду того что я далеко не специалист в VBScript он был написан «по мотивам примеров» и путём модификации примеров взятых с замечательного форума sysadmins.ru (к стати очень его вам рекомендую) сейчас даже тему на нём не вспомню потому, что было это довольно давно (наверное вы и сами заметили это из комментариев в самом скрипте).
Теперь нужно отметить, что начальные параметры программе передаются при помощи ini-файла. Пусть технология и устаревшая но очень надёжная и не требующая написания «конфигуратора» как например в случае если бы все параметры передавались ей при помощи ключей реестра.
PrefixLog — маска для начала имени файлов журнала (например если задано Log, то файл будет называться Log20150201.txt т.е. к префиксу просто прибавляется дата создания и расширение)
PrefixLog — путь к директории хранения log-файлов (у меня это реализовано как поддиректория директории запуска (прошу прощения за тавтологию))
DomainFlag — принимает значение yes/no говорящие о том что мы действуем в домене или воркгруппе соответственно
WorkGroup — имя воркгруппы или домена
Секция Isklucheniya она заведует «обычными исключениями» т.е. те которые не нужно выключать но на которых нужно «убить» критические процессы:
Count — это количество исключений в этой секции (одна из упомянутых топорностей порождённая недостатком времени)
Isk — это DNS-имя компьютера исключения где вместо должно стоять число которое просто обозначает его порядковый номер в этом файле конфигурации.
Секция Isklucheniya2 заведует «абсолютными исключениями» т.е. компьютерами с которыми вообще ничего делать не надо. Устроена она точно так же как и секция Isklucheniya.
И наконец секция KillProcess1 это список процессов которые нужно «убить» до того как послать удалённому компьютеру команду выключения. Сделано это потому, что на старых ОС (Windows XP) система не завершается если не сохранён например файл в Word выдаёт пользователю сообщение об этом и ждёт когда тот примет решение, а это в данном случае не допустимо (ибо пользователя просто нет). Устроена данная секция как предыдущие три.
Ну вот вроде как со всеми вводными разделался, перейду теперь к описанию самой программы.
В программе задействованы модули:
uses SysUtils, IniFiles, Windows, ShellApi;
Тут, я думаю, особых объяснения не нужно скажу только то что модуль IniFiles нужен для работы с ini-файлами, а ShellApi для работы с командами Windows.
Тут немного поясню: константы cif потребуется для определения является ли символ цифрой или нет, а константа NotShutDown для выявления компьютеров которые невозможно выключить нашим скриптом (например компьютеры или устройства работающие на ОС Linux).
Глобальные переменные программы:
var Isk:array[1..255] of String; IskCount:Integer; Script,StartIP,EndIP:String; IniF:TIniFile; CurrentDir:String; i,j:Integer; IP:String; rez:-1..1; FLog:TextFile; temp:String; Dir,ArgumentCMD:PChar; Isk2:array[1..10] of String; IskCount2:Integer; KillProcessCount:Integer; KillProcess:array[1..50] of String; bb:Boolean; KillProcessCount1:Integer; KillProcess1:array[1..50] of String; Error:String; PrefixLog,LogPath:String; DomainFlag:Boolean; WorkGroup:String; soobshenie:String;
И вот наконец мы добрались до текста тела программы (используемые локальные процедуры и функции будут описаны и приведены по ходу объяснения, кроме той которую я уже упомянул). И так текст программы:
Начинаем мы с того что вызываем функцию проверки ini-файла на корректность и заодно заполняющую вводные для программы из этого файла. Если файл содержит какие либо ошибки, то тест последней найденной сохраняется в переменной Error, выполнение программы не допускается, в журнал пишется соответствующее сообщение и на этом работа программы заканчивается.
Текст функции CurrentIni:
function CurrentIni(var ErrorMessage:String; name:String):Boolean; var bbb,nnn:Boolean; tt:String; k:Integer; Begin bbb:=True; CurrentDir:=GetCurrentDir+’\’; If not(FileExists(CurrentDir+name)) Then Begin bbb:=False; ErrorMessage:=’INI-файл не существует’; End Else Begin IniF:=TIniFile.Create(CurrentDir+name); tt:=IniF.ReadString(‘Isklucheniya’,’Count’,’0′); nnn:=True; for k:=1 to Length(tt) do If not(tt[k] in cif) Then nnn:=False; If nnn Then IskCount:=StrToInt(tt) Else Begin bbb:=False; ErrorMessage:=’Ошибка в строке Count секции Isklucheniya’; End; tt:=IniF.ReadString(‘Isklucheniya2′,’Count’,’0′); nnn:=True; for k:=1 to Length(tt) do If not(tt[k] in cif) Then nnn:=False; If nnn Then IskCount2:=StrToInt(tt) Else Begin bbb:=False; ErrorMessage:=’Ошибка в строке Count секции Isklucheniya2′; End; tt:=IniF.ReadString(‘KillProcess1′,’Count’,’0′); nnn:=True; for k:=1 to Length(tt) do If not(tt[k] in cif) Then nnn:=False; If nnn Then KillProcessCount1:=StrToInt(tt) Else Begin bbb:=False; ErrorMessage:=’Ошибка в строке Count секции KillProcess1′; End; tt:=IniF.ReadString(‘KillProcess’,’Count’,’0′); nnn:=True; for k:=1 to Length(tt) do If not(tt[k] in cif) Then nnn:=False; If nnn Then KillProcessCount:=StrToInt(tt) Else Begin bbb:=False; ErrorMessage:=’Ошибка в строке Count секции KillProcess’; End; Script:=IniF.ReadString(‘General’,’Script’,’proba.vbs’); If not(FileExists(CurrentDir+Script)) Then Begin bbb:=False; ErrorMessage:=’Ошибка в строке Script секции General’; End; StartIP:=IniF.ReadString(‘General’,’StartIP’,’none’); If NOT(ProverkaIP(StartIP)) Then Begin bbb:=False; ErrorMessage:=’Ошибка в строке StartIP секции General’; End; EndIP:=IniF.ReadString(‘General’,’EndIP’,’none’); If NOT(ProverkaIP(EndIP)) Then Begin bbb:=False; ErrorMessage:=’Ошибка в строке EndIP секции General’; End; If bbb Then Begin If NOT(IPMensheIliRavno(StartIP,EndIP)) Then Begin bbb:=False; ErrorMessage:=’Начальный IP-адрес больше конечного’; End; End; PrefixLog:=IniF.ReadString(‘General’,’PrefixLog’,’none’); If (PrefixLog=’none’) OR (PrefixLog=») Then PrefixLog:=’Log’; LogPath:=IniF.ReadString(‘General’,’LogPath’,’none’); LogPath:=CurrentDir+LogPath; If NOT(DirectoryExists(LogPath)) Then CreateDir(LogPath); tt:=IniF.ReadString(‘General’,’DomainFlag’,’no’); If tt=’yes’ Then Begin DomainFlag:=True; WorkGroup:=IniF.ReadString(‘General’,’WorkGroup’,»); End Else Begin DomainFlag:=False; WorkGroup:=»; End; If IskCount>245 then IskCount:=245; if IskCount>0 then begin for i:=1 to IskCount do Isk[i]:=IniF.ReadString(‘Isklucheniya’,’ISK’+IntToStr(i),’Error Name’); end; If IskCount2>10 then IskCount2:=10; if IskCount2>0 then begin for i:=1 to IskCount2 do Begin Isk2[i]:=IniF.ReadString(‘Isklucheniya2′,’ISK’+IntToStr(i),’Error Name’); bb:=False; For j:=1 to IskCount do If Isk[j]=Isk2[i] Then bb:=True; If Isk2[i]=’Error Name’ Then bb:=True; If NOT(bb) Then Begin IskCount:=IskCount+1; Isk[IskCount]:=Isk2[i]; End; End; End; If KillProcessCount1>25 then KillProcessCount1:=25; if KillProcessCount1>0 then begin for i:=1 to KillProcessCount1 do KillProcess1[i]:=IniF.ReadString(‘KillProcess1′,’Process’+IntToStr(i),’Error Name Process’); end; If KillProcessCount>25 then KillProcessCount:=25; if KillProcessCount>0 then begin for i:=1 to KillProcessCount do Begin KillProcess[i]:=IniF.ReadString(‘KillProcess’,’Process’+IntToStr(i),’Error Name Process’); bb:=False; for j:=1 to KillProcessCount1 do If KillProcess[i]=KillProcess1[j] Then bb:=True; If KillProcess[i]=’Error Name Process’ Then bb:=True; If NOT(bb) Then Begin KillProcessCount1:=KillProcessCount1+1; KillProcess1[KillProcessCount1]:=KillProcess[i]; End; End; end; IniF.Free; End; CurrentIni:=bbb; End;
Её параметрами являются уже упомянутая переменная Error и переменная содержащая имя ini-файла. Возвращает она True если файл корректен или False если нет. По моему в ней всё интуитивно понятно. Происходят различные проверки правильности самого файла и его содержимого и не более того. скажу только, что функция GetCurrentDir возвращает строковое значение директории запуска программы без последнего слеша, функция FileExists проверяет существование файла по его полному имени (она из стандартных библиотек Delphi), а метод ReadString это метод класса TIniFile который возвращает значение параметра из ini-файла его аргументами являются: имя секции ini-файла, имя переменной ini-файла и значение по умолчанию (на тот случай если считать не удалось).
это фрагмент где формируется имя файла журнала и в него записывается сообщение о начале работы программы.Далее циклом While перебираются все IP-адреса переменной IP тут собственно и происходит главное действо программы. Начинаем с начального который у нас содержится в переменной StartIP и далее пока не достигнем последнего (переменная EndIP). Сравнение реализовано функцией IPMensheIliRavno(IP,EndIP). Первый её аргумент это IP текущий а второй IP которого он не должен превысить (в нашем случае EndIP).Текст функции IPMensheIliRavno:
function IPMensheIliRavno(ip1,ip2:String):Boolean; var ss1,ss2:String; i:Integer; pp1,pp2:Integer; CountT:Integer; Begin ss1:=»; ss2:=»; CountT:=0; For i:=1 to Length(ip1) do Begin If ip1[i]=’.’ Then CountT:=CountT+1 Else If CountT=3 Then ss1:=ss1+ip1[i]; End; CountT:=0; For i:=1 to Length(ip2) do Begin If ip2[i]=’.’ Then CountT:=CountT+1 Else If CountT=3 Then ss2:=ss2+ip2[i]; End; pp1:=StrToInt(ss1); pp2:=StrToInt(ss2); If pp1
Ничего сложного в ней нет. А такой громоздкой она получилась потому, что все параметры её текстового типа (ещё одна не очень изящная вещь). Она Возвращает True если предел ещё не достигнут и False если достигнут. Надо заметить что везде и в этой функции тоже смещение и сравнение происходит только по последнему актанту IP-адреса.
Снова вернёмся к телу программы. дальше у нас всплывает функция ping которая передаёт своё значение переменной rez (прошу не путать в данном случае речь идёт о функции внутри программы а не о ping-е запускаемом в консоли Windows). приведём её текст:
Текст функции перекодировки:
procedure Convert1(var a:string); ANSI> var i:integer; begin for i:=1 to length(a) do if ord(a[i]) in [128..175] then a[i]:=chr(ord(a[i])+64) else if ord(a[i]) in [224..239] then a[i]:=chr(ord(a[i])+16) else if ord(a[i])=240 then a[i]:=chr(ord(168)) else if ord(a[i])=241 then a[i]:=chr(ord(184)); end;
писал не сам ввиду экономии времени и честно сказать банальной лени, но в ней всё по моему абсолютно понятно.
Вернёмся снова к тексту программы. Остановились мы на том, что в переменную rez записалось значение нашего пинга. Теперь перед нами три пути:
1) значение 0 — это компьютер не в сети, мы просто пишем в лог что он не в сети и переходим к следующему IP.
3) значение 1 — это означает что нам попался совершенно рядовой компьютер и нам его нужно просто выключить. Мы так же выясняем его имя, убиваем на нём процессы из списка тех которые мешают выключению и выключаем его но тут уже без использования функции GetDosOutput а напрямую стандартной функцией из библиотек Delphi ShellExecute потому как её консольный вывод нам не нужен. Только делаем это в том случае если можем это возможно, для определения чего используем константу NotShutDown, о которой я уже упоминал ранее. Ну и обо всём об этом тоже пишем в лог.
Теперь приведу текст функций только что мною упомянутых:
Ничего сложного основана она всё так же на стандартном консольном выводе команды ping из которого мы извлекаем DNS-имя пингуемого компьютера. Она возвращает, как указано в её комментарии, либо имя компьютера либо строку « ».
function KillP(host,proc:String):String; var ss:String; begin ss:=GetDosOutput(‘taskkill /S ‘+host+’ /IM ‘+proc+’ /F’); Convert1(ss); KillP:=ss; end;
Ещё более простая функция которая просто возвращает стандартный вывод команды taskkill.
Ну вот в общем то и всё. Возможно я конечно что-то не учёл или не договорил, в этом случае не стесняйтесь обращайтесь на почту или пишите в комментариях.