Ru-Board.club
← Вернуться в раздел «Microsoft Windows»

» Задачи на bat-файлах 10

Автор: manstopper
Дата сообщения: 24.06.2011 14:59
Ребята, можете модифицировать вот такой батник?

Chcp 1251
set $m=%CD%
set $f=dir.txt
set mp=500

(for /f "delims=" %%a in ('dir /b/s "%$m%"') do @(set "b=%%~dpna"&call echo.%%b:~0,%mp%%%%%~xa))>"%$f%"

Он выводит список всех файлов и папок в текущем каталоге в файл dir.txt. Но выводит все вперемешку и с абсолютными путями. Задача состоит в выводе в текстовый файл такой конструкции. Сначала выводятся только файлы в виде списка в формате Type: filesandordirs; Name: {app}\путь к файлу относительно запущенного батника\файл.ххх Затем в этот список добавляются папки в виде: Type: dirifempty; Name: {app}\путь к папке относительно запущенного батника\папка\

Это нужно для секции [UninstallDelete] в инсталляторе Inno Setup, если при распаковке использованы внешние архивы.
Автор: wolf0425
Дата сообщения: 24.06.2011 15:42

Цитата:
set "b=%%~dpna"&call echo.%%b:~0,%mp%%%%%~xa

классный код. берем значит из полного имени (без расширения) первые 500 символов и нимало не сомневаясь на каком там месте там обрезана строка - дописываем расширение, если там был файл с путем в 600 знаков - значит ему не повезло, молча прописываем получившееся левое имя.расширение в список, если было просто длинное имя - молча урезаем половину...


Цитата:
Сначала выводятся только файлы в виде списка

сначала пишешь постановку задачи чтоб из неё было понятно было что такое Type, filesandordirs, Name, {app}, \путь к файлу относительно запущенного батника\, dirifempty, потом ещё раз думаешь нужен ли тебе \путь к файлу относительно запущенного батника\ или все же \путь к файлу относительно текущего каталога\
а также что же точно там нужно ограничивать на 500 байт и зачем.
Автор: manstopper
Дата сообщения: 24.06.2011 20:48

Цитата:
классный код. берем значит из полного имени (без расширения) первые 500 символов и нимало не сомневаясь на каком там месте там обрезана строка - дописываем расширение, если там был файл с путем в 600 знаков - значит ему не повезло, молча прописываем получившееся левое имя.расширение в список, если было просто длинное имя - молча урезаем половину...

Я взял готовый код, за неимением знаний по этой теме...

Цитата:
пишешь постановку задачи

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

[more=Подробнее...]Допустим, каталог содержит такое:
12345 (эта папка внутри имеет файл 123.txt)
22345 (пустая папка)
567.xxx
789.yyy
543.ttt

Помещаем в эту папку батник и запускаем его. На выходе получаем файл list.txt, который выглядит так:
Type: filesandordirs; Name: {app}\12345\123.txt
Type: filesandordirs; Name: {app}\567.xxx
Type: filesandordirs; Name: {app}\789.yyy
Type: filesandordirs; Name: {app}\543.ttt
Type: dirifempty; Name: {app}\12345\
Type: dirifempty; Name: {app}\22345\

То есть сначала идет список всех файлов с относительными путями с добавлением перед путем и именем файла Type: filesandordirs; Name: {app}\
Затем добавляются только папки (вне зависимости от того, пустые они или нет) с добавлением перед путем к папке Type: dirifempty; Name: {app}\

Type: filesandordirs; Name: {app}\ и Type: dirifempty; Name: {app}\ - это синтаксис скрипта установщика Inno Setup. Батник просто добавляет это как текст.[/more]
Автор: 01MDM
Дата сообщения: 24.06.2011 22:27
manstopper

Код: @echo off
1>nul chcp 1251
subst z: "c:\some\folder"
pushd z:
for /f "tokens=*" %%i in (' dir /b /s /a ') do 1>>"%~dp0\list.txt" echo %%~pnxi
popd
subst z: /d
Автор: manstopper
Дата сообщения: 25.06.2011 09:45
01MDM, спасибо. Почти то что нужно. А нельзя вывести сначала только файлы, а потом отдельно папки? Для моих целей я поменял строку:
for /f "tokens=*" %%i in (' dir /b /s /a ') do 1>>"%~dp0\list.txt" echo %%~pnxi
на
for /f "tokens=*" %%i in (' dir /b /s /a ') do 1>>"%~dp0\list.txt" echo Type: filesandordirs; Name: {app}%%~pnxi

Для файлов выводит как надо. А перед папками нужен другой текст.
Автор: 01MDM
Дата сообщения: 25.06.2011 10:34
manstopper

Цитата:
А нельзя вывести сначала только файлы, а потом отдельно папки?


Код:
....
for /f "tokens=*" %%i in (' dir /b /s /a-d ') do 1>>"%~dp0\list.txt" echo %%~pnxi
for /f "tokens=*" %%i in (' dir /b /s /ad ') do 1>>"%~dp0\list.txt" echo %%~pnxi
....
Автор: manstopper
Дата сообщения: 25.06.2011 11:21
01MDM, спасибо огромное. Теперь все работает как надо.
Автор: batniki
Дата сообщения: 25.06.2011 16:44
есть консольная утилита со следующем выводом

Код:
ViewBin... NK.bin
Image Start = 0x80000000, length = 0x02A1E4C0
Start address = 0x00000000
Checking record #40 for potential TOC (ROMOFFSET = 0xFD8B2DFC)
Checking record #134 for potential TOC (ROMOFFSET = 0xFE66DDE0)
Checking record #200 for potential TOC (ROMOFFSET = 0xFEDA4DEC)
Checking record #221 for potential TOC (ROMOFFSET = 0xFEDE7DE8)
Checking record #296 for potential TOC (ROMOFFSET = 0x00000000)
NOTICE! Record 296 looked like a TOC except DLL first = 0x400CC032, and DLL last
= 0x41C6C0FF
Done.
Автор: 01MDM
Дата сообщения: 25.06.2011 19:07
batniki
Исходя из твоего примера. Забил в 1.txt:

Код:
@echo off
setlocal

for /f "tokens=1,2 delims=," %%i in ('findstr "length" 1.txt') do call:set "%%i" "%%j"
echo %imagestart% %length%
goto:eof

:set
set "x=%~1"
1>nul set "%x: =%"
set "x=%~2"
1>nul set "%x: =%"
Автор: Free_Soft
Дата сообщения: 25.06.2011 20:50
batniki
...а может так:

Код: for /f "Tokens=3,5 Delims==, " %%a in ('console.exe ^| findstr /i /c:"Image Start"') do set ImageStart=%%a& set length=%%b
Автор: Jin32
Дата сообщения: 26.06.2011 17:05
Задача такая, надо добавить в начало файла его название, примерно так :
Было так(эти три строчки все содержимое файла):

Код: ###############
#343-90-31-352#
###############
Автор: 01MDM
Дата сообщения: 26.06.2011 17:54
Jin32

Код:
@echo off
for %%i in (*.AR) do (

1>"~%%~nxi" (

echo ========== %%~nxi ==========
type "%%~nxi"

)

move "~%%~nxi" "%%~nxi"

)
Автор: Jin32
Дата сообщения: 26.06.2011 18:12
01MDM
Спасибо, вроде получилось то что надо.
Автор: cerkovsky
Дата сообщения: 27.06.2011 19:39
Подскажите плз. Есть такой батник

@echo off
Chcp 1251
del "%ALLUSERSPROFILE%\Рабочий стол\report"
copy D:\Game\report "%ALLUSERSPROFILE%\Рабочий стол\report"
start D:\Game\play.exe
exit

Файл "report" не имеет какого-либо расширения и содержит в себе цифры
(количество сыграных игр). Как сделать чтоб вместо файла "репорт" он бы имел название - текущее число в этом файле (то есть 23, или 4512, или 7699223)?
Автор: ipmanyak
Дата сообщения: 27.06.2011 20:36
cerkovsky перед copy D:\Game\report вы должны парсить файл, если он текстовый, и выцеплять отуда поле сыгранных игр.,если оно имеет фиксированное место, это проще, если переменное сложнее. Как парсить текстовый файл смотрите хелп команды for /?
Автор: wolf0425
Дата сообщения: 27.06.2011 21:04
cerkovsky
Цитата:
Файл "report" не имеет какого-либо расширения и содержит в себе цифры
цифр таи одна строка и кроме них там ничего нет?
если так, то
Код: @echo off
Chcp 1251
set /p report=<D:\Game\report
copy /y D:\Game\report "%ALLUSERSPROFILE%\Рабочий стол\%report%"
start D:\Game\play.exe
exit
Автор: cerkovsky
Дата сообщения: 27.06.2011 21:25
файл не имеет расширения, но читается текстовым редактором и цифра находится всегда в начале файла (вверху слева).

Добавлено:
wolf0425
Спасибо, всё работает!
Автор: RSEREGAR
Дата сообщения: 27.06.2011 22:14
Нужен батник, который проверяет хост в сети (пингует) и, спустя 2 минуты, как только он появился, запустить на нем через psexec программу
Автор: Elroir
Дата сообщения: 27.06.2011 22:43
RSEREGAR

Код:
@echo off
:checkLoop
ping -n 1 hostname | find /i "ttl=" >nul && goto runProgram
ping -n 6 -w 1000 127.0.0.1 > nul
goto checkLoop
:runProgram
ping -n 121 -w 1000 127.0.0.1 > nul
psexec ...
Автор: wolf0425
Дата сообщения: 28.06.2011 02:10

Цитата:
ping -n 6 -w 1000 127.0.0.1 > nul

может пояснишь смысл вписывания ключа -w 1000 ?
В смысле - что, появились винды, где по умолчанию у пинга какой-то другой таймаут для повторений?
Автор: Elroir
Дата сообщения: 28.06.2011 09:46
wolf0425
Привычка. Оно тебе мешает?

Добавлено:
Кстати:

Цитата:

-w Timeout : Specifies the amount of time, in milliseconds, to wait for the Echo Reply message that corresponds to a given Echo Request message to be received. If the Echo Reply message is not received within the time-out, the "Request timed out" error message is displayed. The default time-out is 4000 (4 seconds).

Это с сайта Microsoft-a, Windows XP Professional Product Documentation
Автор: NIKZZZZ
Дата сообщения: 28.06.2011 11:04
По поводу паузы в батнике, ping не лучший вариант, может работать некорректно.
[more=Pause.bat]@echo off

rem created with PLoP TextAsm v0.92 http://plop.at

echo `hLAX-P@P]h X-WW-HG(FQ(FQ(FT(F[(FZ)F_)Fc)Fe>!temp.com
echo hhVUX)FY)Fa)FVh`RX- PPYhГQX- PP`P_.=c_tPWmA,AAbZ_E,coLNLFABNBOFIDMFDJIM>>!temp.com
echo MIIONIIOMALPAAPALOAAABLJBIABPDKELIIBPAPPOALPFJPDLJBKAADCMAKKPOMAOCPLLPHJ>>!temp.com
echo PDLJBKAAKKPOMAOCPLLJAKAALPEIPDKKPOMAOCPLMGAGEDPDDOMGAGEHPDDPMGAGFFPDAAMM>>!temp.com
echo ILPFLPAAABLJAEAADDNLDDNCDDMAKMDMANHEPCDMAKHEOODMAAHEAPFGLOBIPDADPAKMIIIH>>!temp.com
echo BIPEEDFOOCOCKABIPEMAOAACIKBOBJPEMAOLAEAKMDKKKABJPEMAOAAEIKBOBKPEMAOLACAK>>!temp.com
echo MDKKKABKPEMAOAAGIKBOBLPEAKMDKKIBPPAAPAHCKIGBAOGIAAABMDAAMEPGAGBCAEBAHEAK>>!temp.com
echo FHILDONFAIDKAFFPHECCPOMEFHILDONBAIDKAFFPHEBIPOMEPGAGBCAEAIHEAKFHILDONNAI>>!temp.com
echo DKAFFPHEADOJEDPPOLGGPGAGECAEABHEBLIADOBIAEAAHEAJILBGEFAJOIHCAAOLPOKBKDAD>>!temp.com
echo KDBGAALIPPEMMNCBPGAGAIAEPPHEAFMGAGAJAE>>!temp.com
echo Dh/GBqkDA+i9AIA+qQMGdQm0CbrNAs0h62OAPqkDAnQHtAm6hwLNIYA+qQMDdQm0Cbr+As0h>>!temp.com
echo 60W0LM0h6EMAiDaoA7QBzRZ1NLQszSE4NqgDdOzoLACDPqUDAHQG/w6lA+vcgz6jAwB0DMcG>>!temp.com
echo pQM7AP8OowPrybQJuqADzSG4AEzNIYA+qQMCdQHDYKGlA7+eA8ZF/yDoFgChowO/kQPGRf8g>>!temp.com
echo 6AkAungDtAnNIWHDYLsKAMYFMAvAdAwz0vfzgMIwiBVP6/Bhw2C+gQDofACAPA10XYE8LW11>>!temp.com
echo DoPGAuhrAOhQAKOjA+vkgTwtc3UOg8YC6FcA6DwAo6UD69CBPC1odReDxgLGBqkDA+g+AIA8>>!temp.com
echo DXQfxgapAwXrGIE8LW51DYPGAugmAMYGqQMC6wXGBqkDBmHDxgapAwGL/lboFgAr94vOXlHo>>!temp.com
echo GwBZA/HDgDwgdQNG6/jDgDwgdAiAPA10A0br88NTUlYzwDPSuwoA9+OL0Kw8MHIPPDl3CyX/>>!temp.com
echo ACwwA9CLwuLoXlpbw1BMT1AgV2FpdCBwcm9ncmFtICAgdjEuMSBDb2RlZCBieSBFbG1hciBI>>!temp.com
echo YW5saG9mZXIgICBodHRwOi8vcGxvcC5hdA0KCiRFcnJvcjogd3JvbmcgcGFyYW1ldGVyIHVz>>!temp.com
echo ZSAtaCBmb3IgaGVscA0KJC1tLXMtaC1ud2FpdCBbLXMgdmFsdWVdIFstbSB2YWx1ZV0gWy1u>>!temp.com
echo XSBbLWhdDQoKIHdhaXRzIGZvciBzb21lIHRpbWUNCgogLXMgICBzZWNvbmRzDQogLW0gICBt>>!temp.com
echo aW51dGVzDQogLW4gICBubyBvdXRwdXQNCiAtaCAgIGhlbHANCiQNV2FpdGluZy4uLiAgICBN>>!temp.com
echo aW51dGVzOiAgICAgU2Vjb25kczogICAkDQokAAAAAA==>>!temp.com

echo Waiting 5 seconds

!temp.com -s 5 -n

del !temp.com
[/more]
Автор: Elroir
Дата сообщения: 28.06.2011 11:17
NIKZZZZ
Это тысячу раз обсуждалось. В большинстве случаев ping сработает. А вот если нет, тогда можно/нужно использовать альтернативные варианты.
Автор: NIKZZZZ
Дата сообщения: 28.06.2011 11:57
Elroir

Цитата:
В большинстве случаев ping сработает.

Решение слишком не универсальное, например файрвол может влиять на это. Да и ping сетевая операция, он все-таки выполняется, хоть и на local host, и может мешать.
В windows 7 удобнее использовать choice.exe, но к сожалению ее нет в XP.

Автор: Elroir
Дата сообщения: 28.06.2011 12:06
NIKZZZZ

Цитата:
например файрвол может влиять на это

А вот для этого я и вставляю в ping ключ "-w"
Все другие решения предполагают либо создание дополнительного файла/скрипта, либо использование сторонних утилит. И то и другое универсальным решением не назовешь.
Всегда найдется система, где подобное решение неприемлемо.
Автор: wolf0425
Дата сообщения: 28.06.2011 12:16

Цитата:
wolf0425
Привычка. Оно тебе мешает?
меня оно озадачивает - для формирования привычки должны быть какие-то причины. А вдруг мне это тоже надо?

NIKZZZZ
Цитата:
Решение слишком не универсальное, например файрвол может влиять на это.
с кривыми или параноидальными - может, но с нормальными настройками - не влияет.
И ping localhost - рекомендованная микрософтом ступенька проверки корректности работы IP.
на случай, когда фаерволом ICMP обращения с локалхоста на локалхост зачем-то запрещены - есть альтернативный вариант ключей - ping 127.255.255.255 -n 1 -w 1000


Цитата:
Да и ping сетевая операция, он все-таки выполняется, хоть и на local host, и может мешать.
это рассуждение о сферической лошади в вакууме или ты можешь привести реальный пример корректных настроек винды, когда пинг - действительно мешает?


Автор: res2001
Дата сообщения: 28.06.2011 12:23
NIKZZZZ

Цитата:
Решение слишком не универсальное

Решение есть и по универсальней и по правильней:
ping -n 1 -w 1000 127.255.255.255
Пингуем заведомо не существующий адрес для того чтобы пинг ответ не приходил никогда, тогда срабатывает опция -w.


Добавлено:
Кстати, если пинговать 127.0.0.1, то при получении ответа пинг не ждет до окончания тайм-аута, а сразу возвращает результат.
Автор: Elroir
Дата сообщения: 28.06.2011 12:50
wolf0425

Цитата:
для формирования привычки должны быть какие-то причины

Вот теперь я всмомнил откуда она у меня появилась. Достаточно давно я пользовался Agnitum Outpost Firewall, так вот он, как раз, по умолчанию запрещал ответы на ping.
Автор: wolf0425
Дата сообщения: 28.06.2011 13:25

Цитата:
Достаточно давно я пользовался Agnitum Outpost Firewall, так вот он, как раз, по умолчанию запрещал ответы на ping.
Кстати говоря - кривость страшная, и сам Agnitum и его дефолтовая реализация стелсмоды с правилом запрещать пакеты, идущие с локалхоста на локалхост (правило приходилось всегда править, и вовсе не ради пингов).


Цитата:
Кстати, если пинговать 127.0.0.1, то при получении ответа пинг не ждет до окончания тайм-аута, а сразу возвращает результат.
вот-вот, в варианте насмерть запрещенного ICMP вышепроцитированный озадачивший меня ping -n 6 -w 1000 127.0.0.1 > nul дает 11-секундную задержку, а не ожидаемую 5-секундную.
вывод: если уж не лень прописывать -w NNNN - пинговать нужно недоступный адрес, причем однократно и с задержкой на полное время. Этот ввариант в общем-то и правильнее, но обычно все ленятся.
Автор: res2001
Дата сообщения: 28.06.2011 13:37

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

согласен

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071

Предыдущая тема: зависает установка Windows XP: 39 минут


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.