Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Поиск файла с похожим именем

Ответить
Настройки темы
CMD/BAT - Поиск файла с похожим именем

Новый участник


Сообщения: 3
Благодарности: 1

Профиль | Отправить PM | Цитировать


Добрый день

Слабо еще знаком с команадми
Прошу Вашей помощи в решении рабочей задачки

Есть файл (KWTFCB_123.txt) в начале имени которого присутствует всегда один и тот же набор символов "KWTFCB", нумерация соответственно меняется. Это ответ на ранее посланный файл 123.txt.
В виду того, что количество этих сообщений огромно. Необходимо сделать батник, который будет брать за основу KWTFCB_123.txt и находить его пару 123.txt в другой директории.

Спасибо.

Отправлено: 10:10, 14-02-2012

 

Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Найти элементарно, но зачем? Что потом с этой парой файлов делать? А что делать, если соответствие не найдено? Какую утилитарную задачу Вы хотите решить?

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 16:28, 14-02-2012 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


unw1ck3d, например, так:
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

set sFile=%~nx1
set sPath=%~2

if defined sFile (
	if defined sPath (
		if exist "%sPath%\%sFile:KWTFCB_=%" (
			echo File [%sPath%\%sFile:KWTFCB_=%] found
		) else (
			echo File [%sPath%\%sFile:KWTFCB_=%] not found
		)
	) else (
		echo Usage: "%~nx0" ^<File^> ^<Path^>
	)
) else (
	echo Usage: "%~nx0" ^<File^> ^<Path^>
)

endlocal
exit /b
Первым аргументом пакетного файла указываете путь к «KWTFCB_XXX.txt», вторым аргументом — путь к папке с его парой «XXX.txt». Например:
Код: Выделить весь код
0001.cmd "E:\Песочница\0117\0002\KWTFCB_123.txt" "E:\Песочница\0117\0001"
P.S. Присоединюсь к вопросу коллеги megaloman'а.
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:49, 14-02-2012 | #3


Новый участник


Сообщения: 3
Благодарности: 1

Профиль | Отправить PM | Цитировать


megaloman, прошу меня простить, умолчал
задача сводиться к тому, что при успешном нахождении пары файлов выкидывать оба *.txt в третью директорию. Если же соответствие не найдено, то ничего не делать.
Причем KWTFCB_123.txt лежат все в одной директории, а поиск 123.txt происходит в многоуровневой директории.
Как можно производить поиск 123.txt в директории по всем папкам данной директории?

На самом деле задача еще больше. Первую часть мне удалось решить, а вот со второй частью справиться не хватило знаний. Команда help и все "вытекающие" мне не ясны.
Прошу Вас подсказать с какой литературой ознакомиться. Не могу понять операции с переменными.

На тот вопрос, который я задал Вам, мне предлагали решить задачу на C#.

Iska, спасибо за помощь!!!

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

Спасибо.

Последний раз редактировалось unw1ck3d, 15-02-2012 в 09:51.

Это сообщение посчитали полезным следующие участники:

Отправлено: 08:55, 15-02-2012 | #4


Старожил


Сообщения: 415
Благодарности: 257

Профиль | Отправить PM | Цитировать


unw1ck3d, да, можно.
Код: Выделить весь код
Set /P Var=Enter filename: ^>
Данный код выводит в консоль приглашение с текстом "Enter filename: >" и после ввода присваивает введённое значение переменной Var.
Ещё можете почитать Set /?
Это сообщение посчитали полезным следующие участники:

Отправлено: 09:01, 15-02-2012 | #5


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Вариант1
Код: Выделить весь код
@Echo Off

Set In1=E:\Delete\KWTFCB
Set In2=E:\Delete\123
Set Out=E:\Delete\KWTFCB_123

SetLocal EnableExtensions
SetLocal EnableDelayedExpansion

FOR %%k IN ("%In1%\KWTFCB_*.txt") DO (
	Set kFile=%%~nxk
	Set kFile=!kFile:KWTFCB_=!
               FOR /R "%In2%" %%f IN (!kFile!) DO If Exist "%%f" Move /Y "%%k" "%Out%\" && Move /Y "%%f" "%Out%\"
)
Вариант2
Код: Выделить весь код
@Echo Off

Set In1=E:\Delete\KWTFCB
Set In2=E:\Delete\123
Set Out=E:\Delete\KWTFCB_123

SetLocal EnableExtensions
SetLocal EnableDelayedExpansion

FOR %%k IN ("%In1%\KWTFCB_*.txt") DO (
	Set kFile=%%~nxk
	Set kFile=!kFile:KWTFCB_=!
               FOR /F "usebackq delims=" %%f IN (`Dir "%In2%\!kFile!" /b /s /A:-D`) DO Move /Y "%%k" "%Out%\" && Move /Y "%%f" "%Out%\"
)
Какой способ быстрее-не исследовал, подозреваю - второй. В любом случае надо определить Ваши реальные папки In1 In2 Out (без \ на конце). Первый способ наверное можно чуть ускорить, но это не принципиально

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 15-02-2012 в 12:18. Причина: Дополнение

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:15, 15-02-2012 | #6


Новый участник


Сообщения: 3
Благодарности: 1

Профиль | Отправить PM | Цитировать


Полная задача выглядит так:

В исходной директории с:\365-P\First хранятся запросы 123*.txt, разбросанные по папкам по следующей структуре
C:\365-P\First\Out\2012\01\10 (C:\365-P\YYYY\MM\DD)

Пользователь "ручками" отправляет документ 123*.txt на проверку. Файлы 123*.txt проходят проверку и сваливаются в виде ответов в одну папку без структуры c:\365-P\For_check\.

Отбор файлов происходит по одной строке "20@@@" внутри каждого KWTFCB_*.txt. Если строка присутствует в файле, то он падает в папку c:\365-P\For_check\Done. Если такой строки нет, то c:\365-P\For_check\Error.

Используя часть чужого кода, создал следующее:

cd For_check

findstr /l /m /x /c:20@@@ >>baselist.ext *.txt

Set List=baselist.ext
Set Dst=C:\365-P\For_check\done

if not exist %List% (
echo List-file not found!
exit 1
)
Set log="%~dpn0.log"
Set tmp="%~dpn0.tmp"
Set wrk="%~dpn0.lst"

echo ======= %date% %time:~0,8% =======>>%log%
del /f %wrk% 2>nul
dir /a /b /on /s>%tmp%
for /f "usebackq tokens=* delims=" %%F in ("%List%") do findstr /c:"%%F" %tmp%>>%wrk%
for /f "usebackq tokens=* delims=" %%F in (%wrk%) do (
copy /b /y "%%F" "%Dst%" >nul 2>nul
del /q "%%F"
if errorlevel 1 (echo Can`t copy %%F to "%Dst%">>%log%) else (echo File %%F copied>>%log%)
)

del /f %tmp%
del /f %wrk%
del /f %log%
del /q baselist.ext

move *.txt Error
cd Error
dir /b >> c:\365-P\For_check\errorlist.ext

Тело кода позаимствовал. Понял только как задать переменную. А вот все, что творит батник от команды "findstr" до "move" мне не понятно.

После этого начинается вторая часть задачи. Найти "пару" для каждого неверного ответа (где отсутствует строка 20@@@) и выгрузить оба файла в одну директорию.

Iska, попробовал Ваш код, но не могу разобраться, дабы подбить батник под свои цели. Но все равно спасибо.

Подскажите, что означает %слово% заключенное в проценты? 2>nul?

Отправлено: 14:01, 15-02-2012 | #7


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата unw1ck3d:
Подскажите, что означает %слово% заключенное в проценты? 2>nul? »
В каком контексте?

Отправлено: 15:50, 15-02-2012 | #8


Новый участник


Сообщения: 32
Благодарности: 4

Профиль | Отправить PM | Цитировать


unw1ck3d, обычно слово заключенное в "проценты" - это переменная. То есть:
Простой пример... Есть такая переменная - date - она, по умолчанию, равна текущей дате...
Echo date
даст на выход слово "date"
а вот
echo %date%
в моем случае, на момент написания сообщения даст результат "17.02.2012"
и, для примера...
set segod=segodnya %date%
Это мы создаем переменную "segod" со значением равным слову segodnya и, через пробел, текущей дате...
То есть
Echo %segod%
на выходе даст "segodnya 17.02.2012", только без кавычек...
Обычно так... про другие случаи я не знаю

-------
ira furor brevis est


Отправлено: 09:07, 17-02-2012 | #9


Новый участник


Сообщения: 4
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Помогите пожалуйста...
есть путь %PROGRAMFILES(X86)%\Kaspersky Lab\Kaspersky Free 18.0.0
версия (18.0.0) может бит 19.0.0 или 20.0.0
как определить версию и вести в
Код: Выделить весь код
set version=

Отправлено: 14:44, 19-08-2019 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Поиск файла с похожим именем

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Поиск, остановка процесса, поиск и замена файла на разных дисках Gawr33 Скриптовые языки администрирования Windows 11 23-04-2011 23:09
VBS/WSH/JS - [решено] Создание папок с именем файла и перемещение SySTek Скриптовые языки администрирования Windows 2 02-03-2011 15:38
CMD/BAT - [решено] Созд.*.txt по имени файла, с перемещением *.txt и файла в папку с именем файла. OSArev Скриптовые языки администрирования Windows 2 30-01-2011 11:58
[решено] Чтение текстового файла с неизвестным именем ZeroCrash AutoIt 4 01-07-2009 19:03
восстановление excel-файла, затертого другим файлом с тем же именем XPurple Хочу все знать 4 03-01-2006 13:47




 
Переход