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

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

66 ответов

Установка переменных среды из файла с помощью SET / P

SET /P SVNVERSION=<ver.tmp
1
ответ дан 23 November 2019 в 03:33
поделиться

Метод установки уровня ошибки на любое желаемое число:

CMD /C EXIT number
1
ответ дан 23 November 2019 в 03:33
поделиться

goto: eof pasteboard

Я добавляю «goto: eof» в конец моих скриптов в качестве удобного места для фрагментов кода. Таким образом, я могу быстро копировать / вставлять в эту область и из нее, без необходимости комментировать / раскомментировать.

goto :eof
:: code scraps
call this.bat
call that.bat
set TS=%DATE:~10%%DATE:~4,2%%DATE:~7,2%-%TIME:~0,2%%TIME:~3,2%%TIME:~6%%
for /R C:\temp\ %%G in (*.bak) DO del %%G
1
ответ дан 23 November 2019 в 03:33
поделиться

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

TYPE %1
TYPE %2
TYPE %3
TYPE %4
TYPE %5
...etc

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

if [%1] NEQ [] (
TYPE %1
)
if [%2] NEQ [] (
TYPE %2
)
if [%3] NEQ [] (
TYPE %3
)
if [%4] NEQ [] (
TYPE %4
)
if [%5] NEQ [] (
TYPE %5
)
...etc

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

Вместо этого попробуйте использовать команду SHIFT:

:loop
IF [%1] NEQ [] (
TYPE %1
) ELSE (
GOTO end
)
SHIFT
GOTO loop
:end

SHIFT сдвинет все параметры на один вниз, так что% 2 станет% 1, а% 3 станет% 2 и т. д.

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

НАЙТИ как замену для grep.
Я с помощью find взломал себе небольшую "телефонную книгу". Очень полезно:

@echo off
:begin
set /p term=Enter query: 
type phonebookfile.txt |find /i "%term%"
if %errorlevel% == 0 GOTO :choose
echo No entry found
set /p new_entry=Add new entry: 
echo %new_entry% >> phonebookfile.txt 
:choose
set /p action=(q)uit, (n)ew query or (e)dit? [q] 
if "%action%"=="n" GOTO anfang
if "%action%"=="e" (
    notepad phonebookfile.txt
    goto :choose
)

Очень быстро и эффективно.

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

Извлечь случайные строки текста

@echo off

:: Get time (alas, it's only HH:MM xM

for /f %%a in ('time /t') do set zD1=%%a



:: Get last digit of MM

set zD2=%zD1:~4,1%



:: Seed the randomizer, if needed

if not defined zNUM1 set /a zNUM1=%zD2%


:: Get a kinda random number

set /a zNUM1=zNUM1 * 214013 + 2531011

set /a zNUM2=zNUM1 ^>^> 16 ^& 0x7fff


:: Pull off the first digit

:: (Last digit would be better, but it's late, and I'm tired)

set zIDX=%zNUM2:~0,1%


:: Map it down to 0-3

set /a zIDX=zIDX/3


:: Finally, we can set do some proper initialization

set /a zIIDX=0

set zLO=

set zLL=""


:: Step through each line in the file, looking for line zIDX

for /f "delims=@" %%a in (c:\lines.txt) do call :zoo  %zIDX%  %%a


:: If line zIDX wasn't found, we'll settle for zee LastLine

if "%zLO%"=="" set zLO=%zLL%

goto awdun


:: See if the current line is line zIDX

:zoo


:: Save string of all parms

set zALL=%*


:: Strip off the first parm (sure hope lines aren't longer than 254 chars)

set zWORDS=%zALL:~2,255%


:: Make this line zee LastLine

set zLL=%zWORDS%


:: If this is the line we're looking for, make it zee LineOut

if {%1}=={%zIIDX%} set zLO=%zWORDS%


:: Keep track of line numbers

set /a zIIDX=%zIIDX% + 1

goto :eof




:awdun

echo ==%zLO%==


:: Be socially responsible

set zALL=

set zD1=

set zD2=

set zIDX=

set zIIDX=

set zLL=

set zLO=

:: But don't mess with seed

::set zNUM1=

set zNUM2=

set zWORDS=
-2
ответ дан 23 November 2019 в 03:33
поделиться