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

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

Автор: stoun
Дата сообщения: 08.04.2011 08:19
Доброе время суток. Имеется вот такой скрипт для передачи файла на удаленный фтп сервер:
-------
@echo on
echo user ada 23jg> ftp.dat
echo bin>> ftp.dat
echo put e:\sysinfo.tib>> ftp.dat
echo quit>> ftp.dat
ftp -n -s:ftp.dat ip
del ftp.dat
-------
хотел сделать запуск этого скрипта через планировщик, указал учетку, дату время, решил проверить работу задания, в итоге получил следующее:
-------------
E:\>echo user ada 23jg 1>ftp.dat

E:\>echo bin 1>>ftp.dat

E:\>echo put e:\sysinfo.tib 1>>ftp.dat

E:\>echo quit 1>>ftp.dat

E:\>ftp -n -s:ftp.dat ip

E:\>echo user ada 23jg 1>ftp.dat

E:\>echo bin 1>>ftp.dat

E:\>echo put e:\sysinfo.tib 1>>ftp.dat

E:\>echo quit 1>>ftp.dat

E:\>ftp -n -s:ftp.dat ip
------------------
и это все до бесконечности...как можно решить эту проблему подскажите пожалуйста

P.S. Заранее благодарен
Автор: res2001
Дата сообщения: 08.04.2011 08:40
stoun
Батник твой часом не ftp.bat зовется?
Автор: Jay90
Дата сообщения: 08.04.2011 10:24
Всем доброго времени суток.
Делаю батник, который:
1) ищет файл на пк и записывает в переменную $Path путь до файла.

Код: DIR /b/s/a-d C:\1.txt
Where /r D:\ 1.txt
for /f "tokens=*" %%a in ('Dir /b/s/a-d C:\hosts') Do Set $Path=%%a
Автор: res2001
Дата сообщения: 08.04.2011 11:06
Jay90
Where /r D:\ 1.txt - что это?

Цитата:
2) теперь нужно в нескольких файлах по очереди найти текст и заменить его на найденный путь, хранимый в переменной $Path. У заменяемых файлов известно название, но не известен путь.

В соседней ветке как раз обсуждается похожий случай с заменой в файле.
Автор: Jay90
Дата сообщения: 08.04.2011 11:15

Цитата:
Where /r D:\ 1.txt  - что это?

я хотел сделать поиск по обоим дискам) чтобы не только на С, но и на D искал. Можно как-нибудь по другому?

Сделал так:

Код: @echo off
SETLOCAL EnableDelayedExpansion
DIR /b/s/a-d C:\1.fdb
for /f "tokens=*" %%a in ('Dir /b/s/a-d C:\hosts') Do Set $Path=%%a

1>1.txt (
echo "%Path%",
)
echo\&pause
Автор: res2001
Дата сообщения: 08.04.2011 12:00
Jay90

Цитата:
получилось что в файл 1.txt вернулся не один путь к базе,а набор адресов причем вообще не нужных:

Ты присваиваешь переменной "$Path", а в файл выводишь "Path" - это 2 разные переменные.
Кстати переманная Path системная, если ее поменяешь как-нить не корректно, то может что-нить перестать работать

Поиск файла hosts на дисках C и D:

Код: for /f "tokens=*" %%a in ('Dir /b/s/a-d C:\hosts d:\hosts') Do Set "Path2=!Path2!;%%~dpa"
Set "Path2=%Path2:~1%
echo %Path2%
Автор: 5peciali5t
Дата сообщения: 08.04.2011 12:07
01MDM
благодарю
Автор: Jay90
Дата сообщения: 08.04.2011 12:23
Спасибо, ищет везде теперь) Но пути все равно не те:

Код: @echo off
SETLOCAL EnableDelayedExpansion
DIR /b/s/a-d C:\1.fdb
for /f "tokens=*" %%a in ('Dir /b/s/a-d C:\hosts d:\hosts') Do Set "Path2=!Path2!;%%~dpa"
Set "Path2=%Path2:~1%
echo %Path2%

1>1.txt (
echo "%Path2%",
)
echo\&pause
Автор: res2001
Дата сообщения: 08.04.2011 12:35
Jay90
Дык какой тебе файл то искать надо?
Я взял из твоего же кода файл hosts.
Если не оно, то замени на нужное имя в дире.
Автор: Jay90
Дата сообщения: 08.04.2011 12:47

Цитата:
Дык какой тебе файл то искать надо?
Я взял из твоего же кода файл hosts.
Если не оно, то замени на нужное имя в дире.

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

Последний вопрос:

Код: 1>1.txt (
echo "%Path2%", )
Автор: res2001
Дата сообщения: 08.04.2011 13:16
Jay90
Пусть путь к файлу в переменно outdir:

1>%outdir%1.txt echo "%Path2%"
Автор: Jay90
Дата сообщения: 08.04.2011 14:00
хм почему то не видит путь из переменной outdir... Пишет: Системе не удается найти указанный путь.
кладу в 123456.txt путь до базы:

Код: @echo off
SETLOCAL EnableDelayedExpansion

for /f "tokens=*" %%a in ('Dir /b/s/a-d C:\1.fdb D:\1.fdb') Do Set "Path2=!Path2!;%%~dpa"
Set "Path2=%Path2:~1%
echo %Path2%

for /f "tokens=*" %%a in ('Dir /b/s/a-d C:\123456.txt D:\123456.txt') Do Set "outdir=!outdir!;%%~dpa"
Set "outdir=%outdir:~1%
echo %outdir%

1>%outdir%123456.txt
echo %Path2%

echo\&pause
Автор: res2001
Дата сообщения: 08.04.2011 14:24
Jay90

Цитата:
хм почему то не видит путь из переменной outdir... Пишет: Системе не удается найти указанный путь. кладу в 123456.txt путь до базы:

Честно признаться, я нифига не понял что ты хочешь получить!
Если хочешь чтоб путь лежал в каком-то файле,а потом из него доставть и присвоить переменной, то это так:
for /f "delims=" %%a in (123456.txt) do set "outdir=%%a"
путь лежит в файле 123456.txt, сам файл лежит в текущем каталоге.

Может просто задашь жестко путь для базы в переменную и будешь ею в батнике пользоваться.

Добавлено:

Цитата:
1>%outdir%123456.txt
echo %Path2%

вот это надо писать в одну строку, так как было в моем примере.
Автор: Jay90
Дата сообщения: 08.04.2011 14:40
есть база данных, заношу путь до нее в Path2.
есть файл настроек, туда надо занести путь до базы из переменной Path2.
этот файл настроек 123456.txt - он неизвестно где лежит так как пользователь может поставить инсталятор программы куда угодно - поэтому ищу путь до него.
найдя путь до него я в него - в 123456.txt заношу путь до базы Path2.


Код: @echo off
SETLOCAL EnableDelayedExpansion
rem ищу путь до базы, успешно нахожу
for /f "tokens=*" %%a in ('Dir /b/s/a-d C:\1.fdb D:\1.fdb') Do Set "Path2=!Path2!;%%~dpa"
Set "Path2=%Path2:~1%
echo %Path2%

rem ищу путь до файла настроек, вроде как по аналогии все
for /f "tokens=*" %%a in ('Dir /b/s/a-d C:\123456.txt D:\123456.txt') Do Set "outdir=!outdir!;%%~dpa"
Set "outdir=%outdir:~1%
echo %outdir%

rem и самое интересное - в файл настроек копирую путь до базы - почему то не пашет
1>%outdir%123456.txt echo %Path2%
Автор: king_stiven
Дата сообщения: 08.04.2011 19:44
Jay90
Сформулируй своими словами что надо, без употребления терминов типа переменная.


Добавлено:
1>"%outdir%123456.txt" echo %Path2%
Автор: Fromrussia
Дата сообщения: 09.04.2011 19:13
Можно как-то выполнить задачу, которую я описал здесь http://forum.ru-board.com/topic.cgi?forum=8&topic=40818#1 Хотя бы скелет батника.
Автор: 01MDM
Дата сообщения: 09.04.2011 19:59
Fromrussia
Попробуй:

Код:
@echo off

for %%i in (jpg ogg avi) do (

for /f "tokens=*" %%j in (' dir /b /s /a "C:\*.%%i" ') do (

2>nul md "D:%%~pj"
move "%%j" "D:%%~pj"

)

)
Автор: Fromrussia
Дата сообщения: 09.04.2011 20:23
01MDM
Если я заменю move на copy ничего не изменится? Все-таки живые люди, надо потестить скрипт
Автор: 01MDM
Дата сообщения: 09.04.2011 20:41
Fromrussia
Тогда просто скопируешь. Просто создай тестовую папку с несколькими подпапками разной глубины, и насоздавай пустых файлов разных расширений, подправь пути и протестируй:

Код:
....
for /f "tokens=*" %%j in (' dir /b /s /a "C:\Some\Test\Folder\*.%%i" ') do (
....
Автор: Fromrussia
Дата сообщения: 09.04.2011 21:26
01MDM
Правильно ли я понимаю логику и синтаксис?

Код: @echo off

for %%i in (jpg ogg avi) do (

for /f "tokens=*" %%j in (' dir /b /s /a "<полный_путь_к_папке>\*.%%i" ') do (

rem 2>nul md "D:%%~pj"
2>nul "\\server\folder\%%~pj"
copy "%%j" "\\server\folder\%%~pj"

)

)
Автор: 01MDM
Дата сообщения: 09.04.2011 21:56
Fromrussia
Нет. Создай тестовое дерево с файлами, например:

Код:
@echo off

md "c:\test\test 1\test 11\test 111";"c:\test\test 2\test 22\test 222"

for %%i in (txt jpg avi ogg mp3 bmp doc docx exe) do (

for /r c:\test /d %%j in (*) do cd.>"%%j\test.%%i"

)
Автор: king_stiven
Дата сообщения: 10.04.2011 08:03
Посоветуйте надёжную утилиту для паузы на несколько часов. Sleep почему то вместо паузы на 20400 секунд ждала 23000 секунд.
Автор: 01MDM
Дата сообщения: 10.04.2011 08:35
king_stiven
Попробуй:

Код:
nircmdc wait 2040000
Автор: Free_Soft
Дата сообщения: 10.04.2011 11:40
king_stiven
в Win7 Timeout /?
Автор: Misha1989
Дата сообщения: 10.04.2011 12:20
01MDM
Цитата:
nircmdc wait 2040000

Не, там 1000 миллисекунд. Поэтому так:

Код: nircmdc wait 20400000
Автор: wolf0425
Дата сообщения: 10.04.2011 22:22

Цитата:
Посоветуйте надёжную утилиту для паузы на несколько часов.
а нафига такую паузу отрабатывать одной утилитой? тривиальный пинг на минуту в сумме с циклом-счетчиком дают паузу произвольной длительности и, при желании, прогресс в шапке окна - чтоб в случае чего видеть сколько ждать.
Автор: Free_Soft
Дата сообщения: 11.04.2011 08:10
Туплю:
имеется папка, в которой должен быть единственный файл с известным расширением и произвольным именем (напр., *.jpg).
Как инициировать ошибку, если в папке появится другой файл с таким же расширением?
Автор: res2001
Дата сообщения: 11.04.2011 09:32
king_stiven

Цитата:
Посоветуйте надёжную утилиту для паузы на несколько часов.

Лучше добавить одноразовое задание в шедулер, запускаемое через несколько часов.
Хотя возникнет сложность с вычислением времени запуска задания.

Free_Soft

Цитата:
Как инициировать ошибку, если в папке появится другой файл с таким же расширением?

Так можно:

Код: @echo off
::Запоминаем имя и расширение файла:
for /f %%a in ('dir /b /a:-d *.jpg 2^>nul') do set "fname=%%a" & set "ext=%%~xa"

::Проверяем на наличие других файлов с тем же расширением.
for /f %%a in ('dir /b /a:-d *%ext% 2^>nul ^| findstr /v "%fname%" ') do echo.Ошибка & exit
Автор: ipmanyak
Дата сообщения: 11.04.2011 09:57
Free_Soft Думаю, что только подсчетом количества файлов. Типа
for /f "tokens=*" %%i in ('dir /b /s /a:-d "%1\*.*"') do set /a count_f+=1
echo %count_f% "files"
if %count_f% neq 1 echo error
pause


Автор: wolf0425
Дата сообщения: 11.04.2011 11:40
Free_Soft
Цитата:

Как инициировать ошибку, если в папке появится другой файл с таким же расширением?



Цитата:
Думаю, что только подсчетом количества файлов.
ага, но пример невредно упростить:

for /f "skip=1" %%i in ('dir /b /a-d *.jpg') do goto :error_not_only

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071

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


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