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

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

Автор: Elroir
Дата сообщения: 20.12.2007 09:34
cluster
cmd не умеет работать с массивами. Он умеет проходить по всем строчкам файла и разбирать каждую строчку на отдельные "токены" (tokens). Разделители для токенов можно задавать.
В твоем случае, если я правильно понял, надо пройтись по всем строчкам списка, не разделяя строчку на токены. Если все верно, тогда делаем так:
1. Выносим список в отдельный файл, скажем list.txt.
2. Создаем и запускаем батник:

Код:
@echo off
for /f "tokens=*" %%a in (list.txt) do set /p=<nul>"%%a"
Автор: 01MDM
Дата сообщения: 20.12.2007 12:03
cluster
В чистом виде массивов как таковых нет, но можно создать псевдомассив из собрания переменных. Например:

Код:
@echo off
setlocal
set "staff:Дирижер=Иван Иваныч"
set "staff:Скрипач=Марк Яковлевич"
set "staff:Билeтер=Рая Павловна"

for /f "tokens=2,3 delims=:=" %%i in ('set staff') do echo %%j это %%i
Автор: wolf0425
Дата сообщения: 20.12.2007 12:07
посоветуйте как быстро найти самый свежий из файлов типа
folder1\file.ext
folder3\file.ext
folder6\file.ext
folder9\file.ext

список папок - генерится,
file.ext имеет атрибут hiden

Сканировать папки folder*\ на вложенные подкаталоги НЕ нужно (и незачем и медленно будет - там много всего), интересует именно лежащий в корне каждой папки файл.
Автор: Elroir
Дата сообщения: 20.12.2007 13:58
wolf0425
Наверно, если файлы небольшие, быстрее всего будет не вытаскивание и сравнение даты и времени, а копирование файла file.ext из каждой папки (for-ом) в определенную директорию командой xcopy /D и анализ выполнения команды по errorlevel-у. Ну и, соответственно, сохранение названия последней директории, из которой копирование прошло успешно.
Автор: wolf0425
Дата сообщения: 20.12.2007 14:20
Elroir в конкретной задумке - копирование не годится: минимум один из файлов залочен намертво.
Да и файлы бывают великоваты для копирования - один вот вижу ~8Мб.
можно, правда, попробовать соседнее имяфайла - они по примерно одинаковому закону меняются и файлики поменьше, надо подумать - всегда ли соответствует порядок...
Но всё равно чем-то не нравится.

ох, видимо так и придется делать вложенные for для выковыривания времени...
Автор: 01MDM
Дата сообщения: 20.12.2007 16:25
wolf0425
Посмотри в сторону wmic

Код:
wmic path CIM_LogicalFile where (FileName="index" and Extension="html" and Hidden=true) get CreationDate,Path
Автор: wolf0425
Дата сообщения: 20.12.2007 17:48
01MDM мне "на логическом диске" даром не сдалось, причем даже проверка всех подкаталогов перечисленных папок - уже недопустима по времени.
Надо проверить 2-10 конкретных файлов, лежащих в одном (строго) шаге от заданного каталога.
Автор: gogo222
Дата сообщения: 20.12.2007 20:22
Создать командный файл К6.bat, который проверяет наличие заданного в качестве параметра файла и в случае, если файл существует, ищет в нем подстроку, также заданную как параметр. для Windows XP
ПОМОГИТЕ СДЕЛАТЬ! СРОЧНО!!
Автор: Elroir
Дата сообщения: 20.12.2007 21:40
gogo222

Код:
@echo off
if exist "%~1" findstr "%~2" "%~1"
Автор: kventom
Дата сообщения: 20.12.2007 21:56
Elroir если не сложно можно в примерах?
Автор: w3rd
Дата сообщения: 20.12.2007 22:04
Можно ли сделать такой вот батник:
Скачивается файл с фтп сервера в указанную папку. В этой папке такой же файл с таким же именем, нужно сравнить и если есть различие - заменить свежескачанным файлом.
Спасибо.
Автор: NIKZZZZ
Дата сообщения: 20.12.2007 22:20
w3rd

Цитата:
Скачивается файл с фтп сервера в указанную папку. В этой папке такой же файл с таким же именем, нужно сравнить и если есть различие - заменить свежескачанным файлом.

А зачем что-то сравнивать? Просто скачать и все.


Автор: king_stiven
Дата сообщения: 20.12.2007 22:24
wolf0425

Надо проверить 2-10 конкретных файлов, лежащих в одном (строго) шаге от заданного каталога.

А чуть чуть поподробней, с конкретными примерами имён? Что значит самый свежий-по созданию или изменению?Проверить 10 файлов, это должно занять каке то доли секунды.
Автор: w3rd
Дата сообщения: 20.12.2007 22:26
NIKZZZZ можно в принципе и не сравнивать, но желательно сравнить, а в идеале ещё и выдать сообщение: "Нет изменений" или типа того. Реально сделать ?
Автор: NIKZZZZ
Дата сообщения: 20.12.2007 22:42
w3rd


Код: ren file tmp.tmp
wget .... file
comp file tmp.tmp >nul
if not errorlevel 0 (
echo Файл обновился
)
del /q tmp.tmp
Автор: w3rd
Дата сообщения: 20.12.2007 23:06
NIKZZZZ, а директорию для скачки куда вставить ?
Можешь для примера написать: file.txt скачивается с www.12345.com в директорию C:/folder
Спасибо.
Автор: Elroir
Дата сообщения: 20.12.2007 23:09
kventom

Цитата:
если не сложно можно в примерах?

Что в примерах?
Автор: NIKZZZZ
Дата сообщения: 20.12.2007 23:41
w3rd

Цитата:
директорию для скачки куда вставить ?

Это в описании Wget или другой качалки смотреть надо.

Автор: wolf0425
Дата сообщения: 21.12.2007 00:21
king_stiven
дано: папка, в ней подпапки(1) с неизвестными именами, в каждой - файл с известным именем и куча подпапок.
надо найти подпапку(1) в которой этот файл модифицировался последним.
делать вложенные for /d ... for и переставлять циферки в результате %~ti для сравнения через if - мне кажется слишком громоздким, хотя заведомо сработает и других идей пока нет.
Автор: king_stiven
Дата сообщения: 21.12.2007 07:37
wolf0425

Понял задачу так:
В папке C:\ находятся папки

1
2
3
4
5
...

В этих паках есть или нет файлы file.ext

1\file.ext
2\file.ext
3\file.ext
4\2.txt
5\file.ext
...

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


Код: @echo off
set data1=0
set data2=0
for /f "tokens=*" %%a in ('dir /b /a:d') do (
set "d=%cd%\%%a"
call :yui
)
echo %papka%
goto :eof
:yui
for %%b in ("%d%\file.ext") do (
for /f "tokens=1,2,3,4,5 delims=.,:, " %%c in ("%%~tb") do (
if %%e%%d GTR %data1% (
set "papka=%d%"
set "data1=%%e%%d"
set "data2=%%c%%f%%g"
)
if "%%e%%d"=="%data1%" (
if %%c%%f%%g GTR %data2% (
set "papka=%d%"
set "data1=%%e%%d"
set "data2=%%c%%f%%g"
)
)
goto hj
)
)
:hj
Автор: 01MDM
Дата сообщения: 21.12.2007 09:11
king_stiven
wolf0425, одной строчкой все равно не получится

Код:
@echo off
setlocal
for /d %%i in (*) do (
    pushd "%%i"
    for /f %%i in ('dir /b /ah file.ext') do set "file-%%~ti=%%~fi"
    popd
)
for /f "tokens=2,3 delims=-=" %%i in ('set file ^| sort /r') do echo %%j && goto:eof
Автор: wolf0425
Дата сообщения: 21.12.2007 10:18
последнее, от 01MDM - похоже в неадекватном порядке отсортирует: у %%~ti весьма неудобный формат.

а у king_stiven - получилось наверно то, что мне так не хотелось писать. в обед проверю.
А идея перетасовывать дату определив набор разделителей, а не просто позиционно - понравилась
Автор: 01MDM
Дата сообщения: 21.12.2007 11:31
wolf0425

Цитата:
похоже в неадекватном порядке отсортирует:

Да, возможны ошибки, вот немного изменил

Код:
@echo off
setlocal enabledelayedexpansion
for /d %%i in (*) do (
pushd "%%i"
for /f %%i in ('dir /b /ah file.ext 2^>nul') do (
for /f "tokens=1-5 delims=.: " %%1 in ("%%~ti") do set tc=%%3%%2%%1%%4%%5
set "file-!tc!=%%~fi"
)
popd
)
for /f "tokens=2,3 delims=-=" %%i in ('set file ^| sort /r') do echo %%j && goto:eof
Автор: BasiL
Дата сообщения: 21.12.2007 12:21
Опять нужна помощь с парсингом текста.
Задача - пропарсить текст с восклицательным знаком внутри цикла с включеным
setlocal enabledelayedexpansion
Т.к. знак ! это вновь посчитаная переменная, то сама переменная не может содержать знака !
Сначала у меня вообще строки с ! не парсились, т.к. обработчик считал что это переменная... и строки коверкались. Потому я для начала (перед setlocal enabledelayedexpansion) поместил код замены ! на #1#:

Код: for /r %source% %%a in (*.h,*.c,*.cpp) do (
    echo %%a
    for /f "eol=/ delims=! tokens=1-6" %%b in ('"findstr /c:"LPGEN(" /c:"LPGENT(" /c:"TranslateT(" /c:"_T(" "%%a""') do (
        echo %%b#1#%%c#1#%%d#1#%%e>>%tempfile%
     )
)
Автор: king_stiven
Дата сообщения: 21.12.2007 12:48
BasiL

Я пользуюсь утилиткой replacer.exe, вот пример замены !
replacer.exe SOURCE="нужный текст.txt" SEARCH="!" REPLACE="^!"
Автор: 01MDM
Дата сообщения: 21.12.2007 13:38
BasiL
Я особо не вникал в суть скрипта, насколько я понял, он меняет знаки в строке?
Если так, то пример, как заменить в файле все "!" на "%"

Код:
@echo off
for /f "tokens=*" %%i in ('type test.cmd') do (
    set "str=%%i"
    call:parse
)
goto:eof

:parse
set "str=%str:!=Ё%" && call:write
goto:eof

:write
setlocal enabledelayedexpansion
set "str=!str:Ё=%%!"
echo !str!
Автор: BasiL
Дата сообщения: 21.12.2007 13:57
01MDM
да, кажется это должно сработать.. проверю, спасибо.
king_stiven

Цитата:
Я пользуюсь утилиткой replacer.exe

Понятно, что используюя стороннию утилитку можно значительно упросить процесс... Особенно, если использовать регулярные выражения.
Но ради спортивного интереса и в целях самообразования хотелось бы получить вариант только с использованием средств системы (WinXP)

Добавлено:
01MDM

Цитата:
пример, как заменить в файле все "!" на "%"

не подходит, т.к. токен может содержать символ пайпа - | и символы перенаправления ввода вывода - > и <, или &

смотри

Цитата:
пример исходных строчек для анализа:

поэтому echo обламывается
Да и set тоже...
если только и эти знаки все менять...
Автор: Wenzel
Дата сообщения: 22.12.2007 20:13
Каким образом можно получить путь из полного имени файла?
Скажем, есть переменная содержащая "C:\dir1\dir2\dir3\file.ext", надо отбросить file.ext.
Причем имена могут быть любыми. Поискал - не нашел как сделать.
Думал использовать %variable:~x,y% но вместо x и y не удается использовать переменные
Автор: king_stiven
Дата сообщения: 22.12.2007 20:39
Wenzel

for /?
Автор: SergPfor
Дата сообщения: 22.12.2007 21:09
Wenzel
Посмотрите "Использование пакетных параметров командной строки" в справке.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869

Предыдущая тема: Доступ к реестру через RegEdit?


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