^
. Если после него будет идти пустая строка, то в команду будет вставлен перевод строки.echo ^
Hello,^
world!
Hello, world!
setlocal enabledelayedexpansion
set A=^
Hello,^
world!
echo !A!
^
специальные символы (его самого, символы перенаправления, соединения команд, закрывающую скобку (внутри составных команд), желательно, кавычку…), дважды экранировать восклицательные знаки при отложенном раскрытии переменных, если текст между ними может быть воспринят как имя переменной… В общем, упражняйтесь.:: Определяет переменную ВОЗВРАТ КАРЕТКИ (используется как !CR!)
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"
:: Определяет переменную ПЕРЕВОД СТРОКИ (используется как !LF!)
set LF=^
:: Две пустые строки сверху важны - не удалять!
chcp 65001
Echo !St!>>"%NewFileName%"
в любом случае вставляет перевод после выводимой строки. Чтобы этого не происходило, можно вместо echo
использовать set /p
с вводом из пустого устройства (forum.script-coding.com/viewtopic.php?id=2945):set /p =!St!<nul >>"%NewFileName%"
for /f "usebackq" %%a in (`echo %%h %%i
`
(но, например, ниже чем у неэкранированного знака "
).|
стал частью команды, а не её ограничителем, его необходимо экранировать знаком ^
. set "randomFile=!pyti_k_15_perebivkam[!randomIndex!]!"
call set "randomFile=!pyti_k_15_perebivkam[%%randomIndex%%]!"
call
для отложенного раскрытия переменных, при котором могут быть свои трудности. (
set /p "s1="
set /p "s2="
set /p "s3="
) <input.txt
more
:more +3 input.txt >>output.txt
more +3 <input.txt >>output.txt
(
set /p "s1="
set /p "s2="
set /p "s3="
echo !s3!
echo !s2!
echo !s1!
more
) <input.txt >output.txt
del input.txt
ren output.txt input.txt
more
find /v ""
Условный
for /f "Tokens=*" %f in ('dir /l/b/a-d') do (rename "%f" "%f")
поэтому не срабатывает.
Вручную приходится делать Abc.jpg -> 1Abc.jpg -> abc.jpg
(ren "%f" "to_lower_%f" && ren "to_lower_%f" "%f")
for %g in ("%~nxf") do if not "%f"==%g
:for /f "delims=" %f in ('dir /l/b/a-d') do for %g in ("%~nxf") do if not "%f"==%g (ren "%f" "to_lower_%f" && ren "to_lower_%f" "%f")
for /f "delims=" %%f in ('dir /l/b/a-d') do for %%g in ("%%f*") do (
if /i "%%f"=="%%g" if not "%%f"=="%%g" (
ren "%%f" "to_lower_%%f" && ren "to_lower_%%f" "%%f"
)
)
RD %cd% не удаляет? — Должно же быть какое-то сообщение об ошибке, которое нужно привести в вопросе.
for %%D in (.) do (cd ..& rd "%%~fD")
CD
не определена, используйте одноимённую псевдопеременную:cd ..& rd "%CD%"
RD
скорее всего потребует дополнительные ключи (/S
и /Q
).tasklist /fi "IMAGENAME eq vlc.exe" | find /c /i "vlc.exe">file.tmp
set /p "VAR="<file.tmp
del file.tmp
/f
вывод команды:for /f %%V in ('tasklist /fi "IMAGENAME eq vlc.exe" ^| find /c /i "vlc.exe"') do set "VAR=%%V"
cmd.exe
.) ping
перенаправляется на вход сложной команды.|
) в cmd
(сказанное не относится к перенаправлению в/из файл(а)), когда с какой-то из сторон стоит внутренняя или составная команда, для неё запускается отдельный процесс cmd.exe
, поэтому лучше задать это явно, чтобы иметь возможность точно указать параметры его запуска, как мудро и проделано в рассматриваемом примере (но, похоже, забыли про обычно используемый в таких случаях ключ /d
для отключения выполнения возможных команд из реестра при запуске нового процессаcmd
).1. Как работает эта часть кода (pause&pause)>nul
pause
ожидает ввод от пользователя и, когда на её вход поступает строка, прекращает ждать, >nul
подавляет (перенаправляет на пустое устройство) приглашение от pause
нажать любую клавишу (в данном случае подавляется весь вывод составной команды, состоящей из двух pause
).>nul
использовать, например, две команды set /p
, даже и не указывая перед знаком равенства имя переменной, в которую вводится строка.2. Как работает эта часть set /p "data=" && echo(!date! !time! !data!)
cmd
, то есть из выходного потока ping
, помещается (set /p
) в переменную окружения data
и в случае успеха (&&
), за который считается то, что была введена непустая строка (иначе переменная окружения не изменяется), выполняется следующая команда echo
, выводящая строку из разделённых пробелами псевдопеременных date
, time
и только что установленной переменной data
. date
иtime
содержат текущие дату и время, но только если не определены одноименные переменные окружения, поэтому для учёта всех возможных случаев их следовало бы в начале явным образом сбросить./v
команды cmd
. (Возможно также для отложенного раскрытия использовать команду call
…)echo
— это не открывающая скобка составной команды, а разделитель между командой echo
и её аргументом, а закрывающая скобка относится к составной команде в цикле for /l %a in () do
.ping -n 2 8.8.8.8>nul
после бесконечного цикла, я не знаю и буду рад увидеть разъяснения этому.7.10.2022 21:47:58,02 Ответ от 8.8.8.8: 7.10.2022 21:47:58,04 число байт=32 время=244мс TTL=104 7.10.2022 21:47:59,04 Ответ от 8.8.8.8: 7.10.2022 21:47:59,04 число байт=32 время=240мс TTL=104 7.10.2022 21:48:00,05 Ответ от 8.8.8.8: 7.10.2022 21:48:00,05 число байт=32 время=233мс TTL=104
set /a
не следует без необходимости и понимания заключать имена переменных в знаки процента, так как в этом случае их значения будут подставлены до выполнения составной команды, что приведёт к ошибкам, например, в цикле.set /a "sum = (x + x) * c * x"
set /a sum = "(x + x) * c * x"
@echo off
setlocal enableextensions enabledelayedexpansion
:0
if "%~1" == "" (
set /p in="Входной файл: "
call :0 !in!
exit /b
)
if not exist "%~1" (
echo "%~f1" не найден.
endlocal
exit /b 1
)
set /a i = 0
for /f "usebackq skip=1 delims=" %%L in ("%~1") do (
if "%%L" == "<post>" (
set /a i += 1
(echo ^<?xml version="1.0" encoding="UTF-8"?^>)>!i!.xml
)
(echo(%%L)>>!i!.xml
)
endlocal
<post>
, которые должны начинаться с начала строки и не иметь пробелов в конце строки. ren "-@xxx*" " *"
for %%i in (" *") do for /f "tokens=*" %%j in ("%%i") do ren "%%i" "%%j"
|
на ^^^|
:set LINE=block_image_update(map_partition("product_a"), package_extract_file("product.transfer.list"), "product.new.dat.br", "product.patch.dat") ^^^|^^^| abort("E2001: Failed to update product image.");
|
для set
и ещё раз экранируются |
и уже ^
для echo
.|
и )
:setlocal enabledelayedexpansion
set s=1
if %s% == 1 (
set LINE=block_image_update(map_partition("product_a"^), package_extract_file("product.transfer.list"^), "product.new.dat.br", "product.patch.dat"^) ^|^| abort("E2001: Failed to update product image."^);
echo !LINE! >> file
)
start
:LOW Запуск приложения с приоритетом IDLE.
BELOWNORMAL Запуск приложения с классом приоритета BELOWNORMAL
КОМАНДА1 && КОМАНДА2
КОМАНДА1 || КОМАНДА2
КОМАНДА && echo Ошибок нет! || echo Ошибка!
&
между командами в одной строке. Для размещения одной простой команды на нескольких строках можно использовать ^
в конце переносимой строки…)