Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Поиск файла по введенному имени (http://forum.oszone.net/showthread.php?t=246239)

Ceval 05-11-2012 14:25 2019245

Поиск файла по введенному имени
 
Помогите написать 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 2019289

Код:

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 2019324

Iska, спасибо, работает, а можно вывод (echo %%i) сократить до даты и имя файла

Iska 05-11-2012 17:06 2019345

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

Ceval 05-11-2012 17:26 2019358

и теперь все это дело скопировать, найденные файлы

Цитата:

@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 2019407

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 2019460

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 2019471

Цитата:

Цитата Iska
не вижу простого выхода в данной ситуации »

Можно через findstr
Код:

dir /b /a | findstr "1"

gora 05-11-2012 20:14 2019480

Цитата:

Цитата Iska
но и по коротким именам файлов »

А я то голову ломал с этой единицей...

Можно попробовать так:
Код:

@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

Цитата:

Цитата Foreigner
Можно через findstr »

Боюсь, что могут пролезть и файлы с маской в расширении (test.123)

Foreigner 05-11-2012 20:36 2019491

Цитата:

Цитата gora
Боюсь, что могут пролезть и файлы с маской в расширении (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 2019574

Цитата:

Цитата gora
Боюсь, что могут пролезть и файлы с маской в расширении (test.123) »

Угу (в принципе, расширение можно попытаться отсечь по точке. Но что делать, если точка есть и в имени?). И в самом пути, если с «dir /s …».

Foreigner, работает.

Ceval 06-11-2012 11:19 2019868

А как теперь эти файлы скопировать:
Цитата:

@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 2019876

Цитата:

Цитата Ceval
А как теперь эти файлы скопировать »

Код:

@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 2019895

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 2021628

разобрался

Ceval 09-11-2012 13:53 2022241

HTML код:

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

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

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

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


Время: 08:32.

Время: 08:32.
© OSzone.net 2001-