Войти

Показать полную графическую версию : [решено] Batник по переносу файлов при наличии русского слова


Silfida
21-06-2013, 16:55
Добрый день, подскажите пожалуйста.
Мне нужно создать батник, который из папки D:\IN
перемещал в папку D:\OUT все файлы(txt), которые содержат слово на русском языке, например "привет".

код
@Echo on

Set TEXT=привет
Set DIR1=D:\in
Set DIR2=D:\out

:start
For /F "Delims=" %%i In ('FindStr /SMC:"%TEXT%" "%DIR1%\*" /b/s 2^>nul') Do Move "%%i" "%DIR2%" >>output.txt
pause;

goto :start

Пробовала добавлять строки
chcp 1251>nul
chcp 866>nul

все равно не переносит файлы.

При этом если искать латинские буквы или цифры, все работает.
такой поиск с русским словом вообще возможно реализовать?если да, то как?

Iska
21-06-2013, 17:29
все файлы(txt), которые содержат слово на русском языке, »
Кодировка этих файлов какая?

Silfida
21-06-2013, 17:44
1251(ANSI-Кирилица)

Foreigner
21-06-2013, 18:28
У findstr из года в год не лады с кириллицей, так что нет ничего удивительного. Предлагаю указывать в батнике кракозябры:

@echo off
setlocal

set "search=яЁштхЄ"
for /f "tokens=1 delims=:" %%i in (' findstr "%search%" "d:\in\*.txt" ') do move "%%i" "d:\out"
Батник в 866

Как вариант grep (http://gnuwin32.sourceforge.net/packages/grep.htm), батник точно такой же, но кодировка 1251

Iska
21-06-2013, 19:29
У findstr из года в год не лады с кириллицей, так что нет ничего удивительного. Предлагаю указывать в батнике кракозябры: »
А я бы и вовсе на PowerShell перешёл:
$sSourceFolder = "E:\Песочница\0280\In"
$sDestFolder = "E:\Песочница\0280\Out"
$sWord = "привет"

Get-ChildItem -Path $sSourceFolder |`
ForEach-Object -Process {
if(!$_.PSIsContainer) {
if ([string]($_ | Get-Content) -match $sWord) {
$_ | Move-Item -Destination $sDestFolder
}
}
}

Foreigner
21-06-2013, 19:50
Iska, Я бы тоже.

gci "d:\in\*.txt" | % {

if ((gc $_) -contains "привет") { move-item $_ "d:\out" }

}

Iska
21-06-2013, 20:29
Foreigner:
(gc $_) -contains "привет"
False
False
False

на многострочных файлах (впрочем, на однострочных тоже; это я «-contains» с «-match» спутал).

Foreigner
21-06-2013, 20:54
Iska, похоже, что -contains работает только при полном совпадении элемента массива (т.е в данном случае строки в файле)
Тогда в зависимости от задачи -- "привет" отдельное слово:

if (gc $_ | select-string "\bпривет\b") { $_ }

Silfida
21-06-2013, 20:59
Спасибо большое всем!)

Iska
21-06-2013, 20:59
Foreigner, я решил по простому — преобразовывал массив в строку: «[string]…». Хотя, конечно, на гигабайтных логах делать такое абсолютно противопоказано.




© OSzone.net 2001-2012