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

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

Silfida 21-06-2013 16:55 2171786

Batник по переносу файлов при наличии русского слова
 
Добрый день, подскажите пожалуйста.
Мне нужно создать батник, который из папки 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 2171802

Цитата:

Цитата Silfida
все файлы(txt), которые содержат слово на русском языке, »

Кодировка этих файлов какая?

Silfida 21-06-2013 17:44 2171808

1251(ANSI-Кирилица)

Foreigner 21-06-2013 18:28 2171825

У 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, батник точно такой же, но кодировка 1251

Iska 21-06-2013 19:29 2171852

Цитата:

Цитата Foreigner
У 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 2171862

Iska, Я бы тоже.
Код:

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

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

}


Iska 21-06-2013 20:29 2171884

Foreigner:
Код:

(gc $_) -contains "привет"
Цитата:

Код:

False
False
False


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

Foreigner 21-06-2013 20:54 2171901

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

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

Silfida 21-06-2013 20:59 2171905

Спасибо большое всем!)

Iska 21-06-2013 20:59 2171906

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


Время: 01:39.

Время: 01:39.
© OSzone.net 2001-