Ответ 1
Продолжение линии:
call C:\WINDOWS\system32\ntbackup.exe ^
backup ^
/V:yes ^
/R:no ^
/RS:no ^
/HC:off ^
/M normal ^
/L:s ^
@daily.bks ^
/F daily.bkf
Каковы некоторые из менее известных, но важных и полезных функций пакетных файлов Windows?
Руководство:
Уточнение: мы ссылаемся на скрипты, обработанные cmd.exe, который по умолчанию используется в вариантах WinNT.
(См. также: Пакетные файлы Windows:.bat vs .cmd?)
Продолжение линии:
call C:\WINDOWS\system32\ntbackup.exe ^
backup ^
/V:yes ^
/R:no ^
/RS:no ^
/HC:off ^
/M normal ^
/L:s ^
@daily.bks ^
/F daily.bkf
PUSHD path
Переводит вас в каталог, указанный по пути.
POPD
Возвращает вас в каталог, из которого вы "нажали".
Не уверен, насколько это полезно в пакетном файле, но это очень удобная команда для использования в командной строке:
C:\some_directory> start .
Это откроет проводник Windows в папке "some_directory".
Я нашел это великолепным временем.
Мне всегда было трудно читать комментарии, отмеченные ключевым словом в каждой строке:
REM blah blah blah
Легче читать:
:: blah blah blah
Переменные подстроки:
> set str=0123456789
> echo %str:~0,5%
01234
> echo %str:~-5,5%
56789
> echo %str:~3,-3%
3456
Команда FOR! Хотя я ненавижу писать пакетные файлы, я благодарен за это.
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
будет анализировать каждую строку в файле myfile.txt, игнорируя строки, начинающиеся с точки с запятой, передавая второй и третий токены из каждой строки в тело, с токенами, разделенными запятыми и/или пробелами. Обратите внимание, что для операторов body ссылаются на% i, чтобы получить второй токен,% j, чтобы получить третий токен, и% k, чтобы получить все оставшиеся токены после третьего.
Вы также можете использовать его для перебора каталогов, содержимого каталога и т.д.
Вместо помех script с REM или:: строками, я делаю следующее в верхней части каждого script:
@echo OFF
goto :START
Description of the script.
Usage:
myscript -parm1|parm2 > result.txt
:START
Обратите внимание, как вы можете использовать символы канала и перенаправления, не выходя из них.
Путь (с приводом), где script: ~ dp0
set BAT_HOME=%~dp0
echo %BAT_HOME%
cd %BAT_HOME%
Часть% ~ dp0 уже упоминалась, но на самом деле ее больше:
символ после ~ определить информацию, которая была извлечена.
Отсутствие письма приводит к возврату имени файла патча
d - возвращает букву диска
p - возвращает путь
s - возвращает короткий путь
x - возвращает расширение файла
Поэтому, если вы выполните script test.bat ниже из папки c:\Temp\long dir name \,
@echo off
echo %0
echo %~d0
echo %~p0
echo %~dp0
echo %~x0
echo %~s0
echo %~sp0
вы получаете следующий вывод
test c: \Temp\long dir name\ c:\Temp\long dir name\ .bat c:\Temp\LONGDI~1\test.bat \Temp\LONGDI~1\
И если параметр передан в ваш script, как в
test c:\temp\mysrc\test.cpp
те же манипуляции могут выполняться с переменной% 1.
Но результат разложения% 0 зависит от местоположения!
На "верхнем уровне" пакета он расширяется до текущего имени файла партии.
В функции (вызов) она расширяется до имени функции.
@echo off
echo %0
call :test
goto :eof
:test
echo %0
echo %~0
echo %~n0
Выход (файл batchfile запущен с myBatch.bat)
myBatch.bat
:test
:test
myBatch
Используя CALL, EXIT/B, SETLOCAL и ENDLOCAL, вы можете реализовать подпрограммы с локальными переменными.
Пример:
@echo off
set x=xxxxx
call :sub 10
echo %x%
exit /b
:sub
setlocal
set /a x=%1 + 1
echo %x%
endlocal
exit /b
Откроется
11
xxxxx
хотя: sub изменяет x.
Sneaky трюк, чтобы подождать N секунд (не часть cmd.exe, но не является дополнительным программным обеспечением, поскольку он поставляется с Windows), см. строку ping. Вам нужно N + 1 пинг, так как первый пинг выходит без задержки.
echo %time%
call :waitfor 5
echo %time%
goto :eof
:waitfor
setlocal
set /a "t = %1 + 1"
>nul ping 127.0.0.1 -n %t%
endlocal
goto :eof
Выход из "сантехники":
echo ^| ^< ^> ^& ^\ ^^
Возможность запускать команды и обрабатывать выходные данные (например, обратные ссылки "$()" в bash).
for /f %i in ('dir /on /b *.jpg') do echo --^> %i
Если в именах файлов есть пробелы, используйте это:
for /f "tokens=*" %i in ('dir /on /b *.jpg') do echo --^> %i
Создание пустого файла:
> copy nul filename.ext
Чтобы скрыть весь вывод из команды redirect нa > nul 2 > & 1.
Например, некоторые программы командной строки выводят вывод, даже если вы перенаправляете нa > nul. Но, если вы перенаправляете вывод как строка ниже, все выходные данные будут подавлены.
PSKILL NOTEPAD >nul 2>&1
EDIT: см. Игнорирование вывода команды для объяснения того, как это работает.
PAUSE
Останавливает выполнение и выводит следующую подсказку:
Press any key to continue . . .
Полезно, если вы хотите запустить пакет, дважды щелкнув его в проводнике Windows и хотите увидеть результат, а не только флеш окна командной строки.
Эквивалент bash (и других оболочек)
echo -n Hello # or
echo Hello\\c
который выводит "Hello
" без конечной новой строки. Взломанный cmd для этого:
<nul set /p any-variable-name=Hello
set /p
- способ запросить пользователя для ввода. Он испускает данную строку и затем ждет (в той же строке, то есть без CRLF), чтобы пользователь мог набрать ответ.
<nul
просто передает пустой ответ команде set /p
, поэтому итоговым результатом является строка испускаемого приглашения. (Используемая переменная остается неизменной из-за пустого ответа.)
Проблемы: невозможно выводить знак ведущего равенства, а в Vista символы пробелов удаляются, но не на XP.
Поиск и замена при настройке переменных среды:
> @set fname=%date:/=%
... удаляет "/" из даты для использования в именах файлов с отметкой времени.
и подстроки тоже...
> @set dayofweek=%fname:~0,3%
Целочисленная арифметика:
> SET /A result=10/3 + 1
4
Командные разделители:
cls & dir
copy a b && echo Success
copy a b || echo Failure
Во второй строке команда после && выполняется только в том случае, если первая команда выполнена успешно.
На третьей строке команда после || выполняется только в том случае, если первая команда не удалась.
Вывести пустую строку:
echo.
Вы можете связать, если инструкции, чтобы получить эффект, как короткое замыкание булевых `и '.
if foo if bar baz
Чтобы быстро преобразовать текстовый файл Unicode (16 бит / char) в файл ASCII DOS (8 бит /char).
C:\> type unicodeencoded.txt > dosencoded.txt
в качестве бонуса, если это возможно, символы правильно отображаются.
если структура блока:
if "%VS90COMNTOOLS%"=="" (
echo: Visual Studio 2008 is not installed
exit /b
)
Отложенное разложение переменных (с подстроками, заброшенными для хорошей меры):
@echo off
setlocal enableextensions enabledelayedexpansion
set full=/u01/users/pax
:loop1
if not "!full:~-1!" == "/" (
set full2=!full:~-1!!full2!
set full=!full:~,-1!
goto :loop1
)
echo !full!
endlocal
Не обеспечивает много функциональности, но вы можете использовать команду title для нескольких применений, например, предоставить статус в длинном script на панели задач или просто повысить обратную связь с пользователем.
@title Searching for ...
:: processing search
@title preparing search results
:: data processing
пример вычитания строк на date
и time
, чтобы получить файл с именем "YYYY-MM-DD HH: MM: SS.txt"
echo test > "%date:~0,4%-%date:~5,2%-%date:~8,2% %time:~0,2%_%time:~3,2%_%time:~6,2%.txt"
Я использую color
, чтобы указать, завершился ли мой script успешно, не удался или понадобился какой-то ввод, изменив цвет текста и фона. Это действительно помогает, когда у вас есть машина, доступная вашему взгляду, но довольно далеко.
цвет XY
где X и Y - шестнадцатеричное значение от 0
до F
, где X - фон, Y - текст, когда цвет X = Y не изменится.
цвет Z
изменяет цвет текста на "Z" и устанавливает черный фон, "цвет 0" не будет работать
для имен цветов вызывают
цвет?
У вас нет редактора и вам нужно создать пакетный файл?
copy con test.bat
Просто введите команды, нажмите клавишу ввода для новой строки. Нажмите Ctrl-Z и Enter, чтобы закрыть файл.
Общий контроль над выходом с помощью символов пробела и пробела.:
echo. ^<resourceDir^>/%basedir%/resources^</resourceDir^>
TheSoftwareJedi уже упомянул команду for, но я собираюсь упомянуть ее снова, поскольку она очень эффективна.
Следующий результат выводит текущую дату в формате YYYYMMDD, я использую это при создании каталогов для резервных копий.
for /f "tokens=2-4 delims=/- " %a in ('DATE/T') do echo %c%b%a