Скрытые функции пакетных файлов Windows

232
задан 12 revs, 3 users 30% 23 May 2017 в 02:34
поделиться

66 ответов

Продолжение строки:

call C:\WINDOWS\system32\ntbackup.exe ^
    backup ^
    /V:yes ^
    /R:no ^
    /RS:no ^
    /HC:off ^
    /M normal ^
    /L:s ^
    @daily.bks ^
    /F daily.bkf
185
ответ дан 2 revs, 2 users 60% 23 November 2019 в 03:33
поделиться

Для быстрого преобразования текстового файла Unicode (16bit/char) в файл (8bit/char).

C:\> type unicodeencoded.txt > dosencoded.txt

DOS ASCII в качестве награды, если это возможно, символы правильно отображаются.

14
ответ дан RealHowTo 23 November 2019 в 03:33
поделиться

Можно объединить в цепочку если операторы для получения эффекта как булевская переменная замыкания накоротко 'и'.

if foo if bar baz
15
ответ дан Jack 23 November 2019 в 03:33
поделиться

Произведите пустую строку:

echo.
15
ответ дан paxdiablo 23 November 2019 в 03:33
поделиться

Разделители команды:

cls & dir
copy a b && echo Success
copy a b || echo Failure

В 2-й строке, команда после & & только выполнения, если первая команда успешна.

В 3-й строке, команда после || только работает, если первая команда перестала работать.

16
ответ дан 2 revs, 2 users 96% 23 November 2019 в 03:33
поделиться

Целочисленная арифметика:

> SET /A result=10/3 + 1
4
17
ответ дан Chris Noe 23 November 2019 в 03:33
поделиться

Поиск и замена при установке переменных среды:

> @set fname=%date:/=%

... удаляет "/" из даты использования в именах файлов с меткой времени.

и подстроки также...

> @set dayofweek=%fname:~0,3%
18
ответ дан 2 revs, 2 users 89% 23 November 2019 в 03:33
поделиться

Эквивалент удара (и другие оболочки)

echo -n Hello # or
echo Hello\\c

, который выводы" Hello" без запаздывающей новой строки. cmd взламывает, чтобы сделать это:

<nul set /p any-variable-name=Hello

set /p способ предложить пользователю вход. Это испускает данную строку и затем ожидает, (на той же строке, т.е. никаком CRLF), чтобы пользователь ввел ответ.

<nul просто каналы пустой ответ на эти set /p команда, таким образом, конечным результатом является испускаемая строка приглашения. (Используемая переменная остается неизменной из-за пустого reponse.)

проблемы: не возможно произвести ведущий знак "равно", и на Vista, ведущей пробельные символы, удалены, но не на XP.

25
ответ дан 3 revs, 3 users 61% 23 November 2019 в 03:33
поделиться
PAUSE

выполнение Остановок и дисплеи следующая подсказка:

Press any key to continue . . .

Полезный, если Вы хотите выполнить пакет путем двойного щелчка по нему в Windows Explorer и хотеть на самом деле видеть вывод, а не просто флэш-память окна команд.

25
ответ дан 2 revs, 2 users 92% 23 November 2019 в 03:33
поделиться

Для сокрытия всего вывода от команды перенаправляют к> nul 2> & 1.

, Например, некоторый вывод дисплея программ командной строки, даже если Вы перенаправляете к> nul. Но при перенаправлении вывода как строка ниже весь вывод будет подавлен.

PSKILL NOTEPAD >nul 2>&1

РЕДАКТИРОВАНИЕ: См. Игнорировать вывод команды для объяснения того, как это работает.

28
ответ дан 2 revs 23 November 2019 в 03:33
поделиться

Создание пустого файла:

> copy nul filename.ext
30
ответ дан 2 revs, 2 users 89% 23 November 2019 в 03:33
поделиться

Способность к командам выполнения и процессу вывод (как обратные галочки '$ ()' в ударе).

for /f %i in ('dir /on /b *.jpg') do echo --^> %i

, Если существуют пробелы в именах файлов, используйте это:

for /f "tokens=*" %i in ('dir /on /b *.jpg') do echo --^> %i
31
ответ дан 2 revs, 2 users 50% 23 November 2019 в 03:33
поделиться

Выход из "инфраструктуры":

echo ^| ^< ^> ^& ^\ ^^
37
ответ дан Chris Noe 23 November 2019 в 03:33
поделиться

Подлый прием для ожидания секунд N (не часть cmd.exe, но не дополнительное программное обеспечение, так как это идет с Windows), посмотрите строку ping. Вам нужны ping N+1, так как первый ping выходит без задержки.

    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
42
ответ дан paxdiablo 23 November 2019 в 03:33
поделиться

При помощи ВЫЗОВА, ВЫХОД/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.

43
ответ дан 2 revs 23 November 2019 в 03:33
поделиться

Путь (с диском), где сценарий: ~dp0

set BAT_HOME=%~dp0
echo %BAT_HOME%
cd %BAT_HOME%
54
ответ дан RealHowTo 23 November 2019 в 03:33
поделиться

% ~dp0 часть уже был упомянут, но существует на самом деле больше к ней: символ (символы) после ~ определяет информацию, которая извлечена.
Никакой результат буквы в возврате имени файла исправления
d - возвращается, буква диска
p - возвращает путь
, с - возвращает короткий тракт
, x - возвращает расширение файла
Поэтому при выполнении сценария 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\

И если параметр передается в Ваш сценарий как в [1 111]
тест 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
49
ответ дан 3 revs, 2 users 75%Hartmut 23 November 2019 в 03:33
поделиться

Вместо того, чтобы замусорить сценарий R.E.M или:: строки, я делаю следующее наверху каждого сценария:

@echo OFF
goto :START

Description of the script.

Usage:
   myscript -parm1|parm2 > result.txt

:START

Примечание, как можно использовать канал и символы перенаправления, не выходя из них.

60
ответ дан Patrick Cuff 23 November 2019 в 03:33
поделиться

команда FOR! В то время как я очень не хочу писать пакетные файлы, я благодарен за него.

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

проанализировал бы каждую строку в myfile.txt, игнорируя строки, которые начинаются с точки с запятой, передавая 2-й и 3-й маркер от каждой строки до для тела, с маркерами, разграниченными запятыми и/или пробелами. Заметьте для ссылки операторов body %i заставлять 2-й маркер, %j заставлять 3-й маркер и %k получать все остающиеся маркеры после 3-го.

можно также использовать это для итерации по каталогам, содержанию каталога, и т.д.

72
ответ дан 2 revs 23 November 2019 в 03:33
поделиться

Переменные подстроки:

> set str=0123456789
> echo %str:~0,5%
01234
> echo %str:~-5,5%
56789
> echo %str:~3,-3%
3456
79
ответ дан Chris Noe 23 November 2019 в 03:33
поделиться

Я всегда находил трудным прочитать комментарии, которые отмечены ключевым словом на каждой строке:

REM blah blah blah

Легче читать:

:: blah blah blah
87
ответ дан Chris Noe 23 November 2019 в 03:33
поделиться

Не уверенный, насколько полезный это было бы в пакет файл, но это - очень удобная команда для использования в командной строке:

C:\some_directory> start .

Это откроет Windows Explorer в "some_directory" папке.

я нашел это большим средством экономии времени.

109
ответ дан LeopardSkinPillBoxHat 23 November 2019 в 03:33
поделиться

если блочная структура:

if "%VS90COMNTOOLS%"=="" (
  echo: Visual Studio 2008 is not installed
  exit /b
)
14
ответ дан Ferruccio 23 November 2019 в 03:33
поделиться

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

@title Searching for ...
:: processing search
@title preparing search results
:: data processing
12
ответ дан Hartmut 23 November 2019 в 03:33
поделиться

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

следующие выводы текущая дата в формате YYYYMMDD, я использую это при генерации каталогов для резервных копий.

for /f "tokens=2-4 delims=/- " %a in ('DATE/T') do echo %c%b%a
9
ответ дан 2 revs, 2 users 89% 23 November 2019 в 03:33
поделиться

Полный контроль по выводу с интервалом и символами ESC.:

echo.    ^<resourceDir^>/%basedir%/resources^</resourceDir^>
10
ответ дан 2 revs, 2 users 89% 23 November 2019 в 03:33
поделиться

пример строкового вычитания на 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, чтобы указать, заканчивается ли мой сценарий успешно, отказавший, или нужен в немного введенных путем изменения цвета текста и фона. Действительно помогает, когда у Вас есть некоторая машина в пределах Вашего представления, но вполне далеко

цветной XY

, где X и Y шестнадцатеричное значение от 0 до F, где X - фон, Y - текст, когда X = Y цвет не изменится.

цветной Z

изменяет цвет текста на 'Z' и устанавливает черный фон, 'окрасьте 0', не будет работать

на названия вызова цветов

цвет?

11
ответ дан 4 revs, 3 users 91% 23 November 2019 в 03:33
поделиться

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

copy con test.bat

Просто тип далеко команды, нажатие вводит для новой строки. Нажмите Ctrl-Z и Enter для закрытия файла.

11
ответ дан Hartmut 23 November 2019 в 03:33
поделиться

Задержанное расширение переменных (с подстроками, добавленными в придачу):

    @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
12
ответ дан paxdiablo 23 November 2019 в 03:33
поделиться
PUSHD path

Берет Вас к каталогу, определенному путь .

POPD

Забирает Вас к каталогу, от которого Вы "продвинули".

150
ответ дан 4 revs, 2 users 97% 23 November 2019 в 03:33
поделиться