Войти

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


shiroq
28-09-2013, 12:48
Диски есть файлы, с помощью батника надо искать определенной слова в файлах и все файлы содержащий этот слова скопировать на другой каталог!

Благодарю оказавших помощь!

sunnykey
28-09-2013, 15:04
#Powershell script.
#Don't forget unlock script executing by
#using command "Set-ExecutionPolicy RemoteSigned" or "Set-ExecutionPolicy Unrestricted"
$SourceDir="C:\From\"
$DestDir="C:\To"
#выбрать нужную кодировку файла между ASCII, UTF8, UTF7, UTF32, Unicode, OEM
$Encoding=[Microsoft.PowerShell.Commands.FileSystemCmdletProviderEncoding]::UTF8
gci "$SourceDir\*" -Recurse -Force | % {
if ((gc $_.FullName -Encoding $Encoding | Select-String -pattern "Какая-то строка") -ne $null) {
Copy-Item -Path $_.FullName -Destination $DestDir -Recurse -Force
}
}

muqanna
30-09-2013, 08:42
Спасибо за поддержку но мне надо bat ник!
Я организовал поиск проблема с копированием файла...

Foreigner
30-09-2013, 09:31
muqanna,

@echo off
setlocal

set "from=C:\Some Folder"
set "to=D:\Some Folder"
set "words=\<qwerty\> \<monday\> \<tomorrow\>"

2>nul md "%to%"

for /f "tokens=1 delims=:" %%i in (' findstr /s "%words%" "%from%\*" ') do call:copy "%%i"

goto:eof

:copy
set "file=%~nx1"
set "cnt=0"

:check
set /a cnt+=1
if not exist "%to%\%file%" (

copy %1 "%to%\%file%"

) else (

set "file=%~n1(%cnt%)%~x1"
goto:check

)


Ищет в папке "C:\Some Folder" и в подпапках
Слова "qwerty", "monday" и "tomorrow"
Копирует с проверкой на имя в "D:\Some Folder"

muqanna
30-09-2013, 09:44
Foreigner, Спасибо щя проверим!

muqanna
30-09-2013, 10:13
Foreigner, Не! пишет что не удалось найти указанного файла... Я смотрел кода "%from%\*" » ошибка не в этом строке?

Foreigner
30-09-2013, 12:03
muqanna:
ошибка не в этом строке?
Нет, это ошибка findstr.exe
Выдает пути в 866, в случае если названия файлов или путь к ним содержат кириллицу. Предлагаю вариант с использованием grep (http://gnuwin32.sourceforge.net/packages/grep.htm):

@echo off
setlocal
1>nul chcp 1251

set "from=C:\Some Folder"
set "to=D:\Some Folder"
set "words=(Hello|Привет|Goodbye)"

2>nul md "%to%"

for /f "tokens=1 delims=:" %%i in (' grep -RE "%words%" "%from%\*" ') do set "f_%%~si=%%i"
for /f "tokens=2 delims==" %%i in (' set f_ ') do call:copy "%%i"
goto:eof

:copy
set "fullname=%~1"
set "file=%~nx1"
set "cnt=0"

:check
set /a cnt+=1
if not exist "%to%\%file%" (

copy "%fullname:/=\%" "%to%\%file%"

) else (

set "file=%~n1(%cnt%)%~x1"
goto:check

)

muqanna
30-09-2013, 17:07
Foreigner »

Дал вот такую сообщения!
C:\Temp\1>1
grep: C:\Temp\1\1\*: No such file or directory
Переменная среды f_ не определена

Я с grepам не работал? Дальше что делать?

Foreigner
30-09-2013, 18:10
Исправил, попробуйте:

@echo off
setlocal
1>nul chcp 1251

set "from=C:\Some Folder"
set "to=D:\Some Folder"
set "words=(Hello|Привет|Goodbye)"

2>nul md "%to%"

for /f "tokens=2 delims=:" %%i in (' grep -RE "%words%" "%from%\*" ') do call:set "%%i"
for /f "tokens=2 delims==" %%i in (' set f_ ') do call:copy "%%i"
goto:eof

:copy
set "fullname=%~1"
set "file=%~nx1"
set "cnt=0"

:check
set /a cnt+=1
if not exist "%to%\%file%" (

copy "%fullname:/=\%" "%to%\%file%"

) else (

set "file=%~n1(%cnt%)%~x1"
goto:check

)
goto:eof

:set
set "s=%~1"
set "s=%s: =_%"
set "f_%s%=%~1"

muqanna
02-10-2013, 07:31
Foreigner »grep: C:\Temp\1\1\*: No such file or directory
Переменная среды f_ не определена »

тот же сообщению выдает!

muqanna
04-10-2013, 07:41
Я с grepам не работал? Дальше что делать?»

muqanna
10-10-2013, 07:47
Цитата Foreigner: »

Я изменил код, он работает, но тут два проблемы,
Это:
1) Сетевого диска не правильно видеть! На компе D:\test без проблем работает, указываю сетевой диск, он его принимает без буквы на пример x:\test, а он принимает его как \test!
2) Цикл выполняется не полностью, допустим там 5 файла, а он находит в 4-х и копирует 4 файла!(из 600 файлов он пропустил 7 файлов!)
--------------------------

@echo on
setlocal

set "from=d:\Temp\1"
set "to=d:\Temp\2"
set "words=test"

2>nul md "%to%"

for /f "tokens=2* delims=:" %%i in (' findstr /s %words% %from%\*.* ') do call:copy "%%i"

goto:eof

:copy
set "file=%~nx1"
set "cnt=0"

:check
set /a cnt+=1
if not exist "%to%\%file%" (

copy %1 "%to%\%file%"

) else (

set "file=%~n1(%cnt%)%~x1"
goto:check

)




© OSzone.net 2001-2012