Войти

Показать полную графическую версию : Поиск файла по введенному имени


Ceval
05-11-2012, 14:25
Помогите написать bat-файл, с поиском файлов такого вида *xxx*, (rt555.zip или acty555.pdf)
где * - возможны любые символы
ХХХ - цифры, которые обьединяют все эти файлы, но их нужно ввести с клавиатуры, они каждый раз разные
и с последующим их копированием
вот начал:

@Echo off
Set FDir="D:\AST"
set /P Maska="В ведите номер: "

FOR /R %FDir% %%i IN (%Maska%) DO Set FileName="%%i"
Echo %FileName%
set /p answer=Копируем на FTP(Y/N)?
if /i '%answer%'=='Y'
..
else
..

не получаться, не ищет

Iska
05-11-2012, 16:08
set /p sDigits=Enter digits for mask:

if defined sDigits (
for /f "delims=" %%i in ('dir /s /a "d:\ast\*%sDigits%*.*"') do echo %%i
)

Ceval
05-11-2012, 16:49
Iska, спасибо, работает, а можно вывод (echo %%i) сократить до даты и имя файла

Iska
05-11-2012, 17:06
Ceval, это я ошибся. Добавьте выделенный параметр в команду: «…('dir /s /b /a "d:\ast\…».

Ceval
05-11-2012, 17:26
и теперь все это дело скопировать, найденные файлы

@Echo off
set Ftp_vl="D:\FTP"
set /p sDigits=Enter digits for mask:

if defined sDigits (
for /f "delims=" %%i in ('dir /s /d /a "e:\ast\*%sDigits%*.*"') do echo %%i)
set /p answer=Љ®ЇЁа㥬 ** FTP(y/n)?

if /i '%answer%'=='y' xcopy /-y "%%i" "%ftp_vl%"
else
quit

gora
05-11-2012, 18:40
Iska, у меня не сработало при следующих условиях:
- папка e:\Temp 1\1\
- содержимое папки:
2\ (папка)
config
2.reg.bat
num _num.bat
acty555.pdf
1.reg
2.reg
link.txt
new.txt
PuntoSw3_config.txt
Текстовый документ.txt
fname31.xls
fname3.zip
fname555aa1.zip
rt555.zip
- маска = 1

Iska
05-11-2012, 19:36
gora, подтверждаю. Случается, я забываю про такую тонкость, что WinAPI ведёт поиск по маске не только по длинным, но и по коротким именам файлов.

Честно говоря, я не вижу простого выхода в данной ситуации. Возможно, лучшим выходом будет переход к использованию PowerShell:
$sMask = Read-Host -Prompt "Enter mask:"
Get-ChildItem -Path "E:\Temp 1\1" -Recurse -Include "*$sMask*.*"

Foreigner
05-11-2012, 20:02
не вижу простого выхода в данной ситуации »
Можно через findstr

dir /b /a | findstr "1"

gora
05-11-2012, 20:14
но и по коротким именам файлов »
А я то голову ломал с этой единицей...

Можно попробовать так:@Echo off
Setlocal EnableDelayedExpansion
Set FDir=e:\Temp 1\1
Set /P Maska="В ведите номер: "

For /F "tokens=* delims=" %%i In ('Dir /B /A:-D "%FDir%\*.*"') Do (
Set ti=%%~ni
If Not !ti!==!ti:%Maska%=! Echo %%i
)
Pause>Nul
Можно через findstr »
Боюсь, что могут пролезть и файлы с маской в расширении (test.123)

Foreigner
05-11-2012, 20:36
Боюсь, что могут пролезть и файлы с маской в расширении (test.123) »
Тогда, чем городить dir на dir'e, проще через where.exe

@echo off
setlocal

set "rootdir=C:\ABC"
set "mask=*"
set /p mask="Enter search mask: "

for /f "tokens=*" %%i in (' where /r "%rootdir%" *%mask%*.* ') do echo %%i

Iska
05-11-2012, 22:34
Боюсь, что могут пролезть и файлы с маской в расширении (test.123) »
Угу (в принципе, расширение можно попытаться отсечь по точке. Но что делать, если точка есть и в имени?). И в самом пути, если с «dir /s …».

Foreigner, работает.

Ceval
06-11-2012, 11:19
А как теперь эти файлы скопировать:
@Echo off
set Ftp_vl="D:\FTP"
set /p sDigits=Enter digits for mask:

if defined sDigits (
for /f "delims=" %%i in ('dir /s /d /a "e:\ast\*%sDigits%*.*"') do echo %%i)
...
xcopy /-y "%%i" "%ftp_vl%"
...

выдает ошибку

E:\tets\123>10.bat
ast559.pdf ast559.xls
2 файлов 84*386 байт
Всего файлов:
2 файлов 84*386 байт
Не найден файл: %i
Скопировано файлов: 0.

gora
06-11-2012, 11:37
А как теперь эти файлы скопировать »
@Echo off
Setlocal EnableDelayedExpansion
Set FDir=e:\Temp\1
Set Ftp_vl=e:\Temp\FTP
If Not Exist "%Ftp_vl%" MD "%Ftp_vl%"

Set /P Maska="В ведите номер: "
If Defined Maska (
For /F "tokens=* delims=" %%i In ('Dir /B /A:-D "%FDir%\*.*"') Do (
Set ti=%%~ni
If Not !ti!==!ti:%Maska%=! (
Echo %%i
Copy "%FDir%\%%~i" "%Ftp_vl%">Nul
)
)
)
Pause>Nul

Ceval
06-11-2012, 12:02
gora, спасибо, мне б что-то в таком плане
@Echo off
set Ftp_vl="D:\FTP"
set /p mask=Enter digits for mask:

if defined sDigits (
for /f "delims=" %%i in ('dir /s /d /a "e:\ast\rt*%mask*.*"') do echo %%i)
set /p answer= Скопировать (y/n)?
if /i '%answer%'=='y' xcopy /-y "%%i" "%ftp_vl%"
else
exit

Ceval
08-11-2012, 17:48
разобрался

Ceval
09-11-2012, 13:53
.... ...
for /f "delims=" %%i in ('dir /b /s "D:\%mask_vl%\result_%mask%.zip"') do xcopy /y "%%i" "X:!Результаты"
... . ..

заменяешь на другую, все прекрасно копируется

И подскажите как еще можно реализовать запись всех действий (там будет и ввод команд в консоль, и несколько копирований и перемещений ) в лог файл, что-то вроде этого:

set $log=D:\copyfile.log
начало записи лог файла
.... ввод команд в консоль
..... копирование ......
ввод команд ......
...... перемещения .....
конец записи в лог-файл




© OSzone.net 2001-2012