Компьютерный форум 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=297653)

Alexander_88 30-03-2015 09:14 2489472

Проверка точности размеров файлов
 
Здравствуйте, подскажите, пожалуйста, как можно проверить размеры файлов указанные в тхт документе с размером файлов в папке, и если какие - то из размеров будут не сходиться, то открыть по окончании работы скрипта, блокнот, в котором будут написаны имена не сходившихся файлов вместе с размерами. Притом необходимо сравнивать несколько пар (тхт - папка с файлами)
формат одного тхт документа таков (присутствуют кв. скобки):

Код:

<a href="http://yandex.ru/file/71a4bcc5a6676/00001start_ARM-385_google.com.avi" target="_blank">[$id] - 1.1 GB</a>
<a href="http://yandex.ru/file/27cd09dd1cb5c/00002start_AVOP-022_google.com.mp4" target="_blank">[$id] - 1.0 GB</a>
<a href="http://yandex.ru/file/8bf07957793df/00003start_BNMC-008_google.com.wmv" target="_blank">[$id] - 1.3 GB</a>
<a href="http://yandex.ru/file/fc5850134442d/00004start_DDT-483_google.com.mkv" target="_blank">[$id] - 4.7 GB</a>
<a href="http://yandex.ru/file/51e6863f8fbca/00005start_DIV-183_google.com.mkv" target="_blank">[$id] - 2.6 GB</a>
<a href="http://yandex.ru/file/ab6d540284892/00006start_DMOW-053_google.com.mp4" target="_blank">[$id] - 1.4 GB</a>
<a href="http://yandex.ru/file/677d9f6c585ef/00007start_DMOW-057_google.com.avi" target="_blank">[$id] - 1.1 GB</a>
<a href="http://yandex.ru/file/05f8020c48834/00008start_DMOW-067_google.com.mp4" target="_blank">[$id] - 1.2 GB</a>
<a href="http://yandex.ru/file/0480b3773d999/00009start_DMOW-068_google.com.avi" target="_blank">[$id] - 1.5 GB</a>


В папке, к которой будет относиться этот тхт файл, много файлов, но среди них обязательно присутствуют те, которые есть в блокноте, имена их в точности такие же, что выделено жирным шрифтом.

Я должен буду указать пары тхт - папка с файлами, которые необходимо сравнивать, а также слово ориентир, через который скрипт будет находить имена файлов внутри ссылок тхт документа. Известно то, что слово ориентир в ссылках (подчеркнуто на примере), всегда одно и тоже только для одной пары тхт с папкой. Вычислять имя файла в ссылке нужно так.. если от слова ориентира идти влево, то начало имени будет начинаться сразу после первого встречного знака
Код:

/
А конец имени файла вычисляется так.. от слова ориентира движемся вправо, и кончаться имя будет перед первым встречным знаком кавычек
Код:

"
Размер файла в тхт будет всегда описан между текстом
Код:

[$id] -
и
Код:

</a>
Размер файла в тхт всегда округляется до десятых.. если размер меньше гигабайта, то будет такой формат.. приме: 869.4 MB, 456.9 MB и т.д.
Размер файла в тхт всегда округляется в большую сторону если второй знак после запятов 5 и более (пример 5.46 - 5.5 5.53 - 5.5 5.45 - 5.5)

Я указываю данные к примеру

Код:

С:\\Work\boeviki - папка с файлами
C:\\info\boeviki.txt - txt файл
start - слово ориентир


С:\\Work\fantastika - папка с файлами
C:\\info\fantastika.txt - txt файл
tort - слово ориентир


............................................................

При окончании работы должен открыться тхт файл, в формате:

имя файла <размер файла в папке>/<размер файла, указанный в тхт документе>
:)

Foreigner 30-03-2015 10:26 2489500

Не тестировал:
Код:

$folder = "С:\Work\boeviki"

foreach ($line in (get-content file.txt)) {

    [array] $files += [pscustomobject] @{
   
        f = $([uri]($line -split '<a\shref="|"')[1]).segments[-1]
        s = [double] ($line -split '-\s|\s[GM]B')[1]
        v = ($line -split '\.\d\s|</a')[1]
   
}}


foreach ($file in $files) | where { [io.file]::exists("$($folder)\$($file.f)") } | {

    switch ($file.v) {
   
        'GB' { $s = [math]::round((gi "$($folder)\$($file.f)").length / 1GB,1) }
        'MB' { $s = [math]::round((gi "$($folder)\$($file.f)").length / 1MB,1) }   

    }
   
    "$($file)<$(file.s) $($file.v)><$(s) $($file.v)>" | add-content "C:\info\$($folder.name).txt"
}

invoke-item "C:\info\$($folder.name).txt"

где file.txt -- исходный файл

Alexander_88 30-03-2015 11:08 2489514

вот такое получилось

Код:

$folder = "D:\00 ext\start"

foreach ($line in (get-content 000links.txt)) {

    [array] $files += [pscustomobject] @{
   
        f = $([uri]($line -split '<a\shref="|"')[1]).segments[-1]
        s = [double] ($line -split '-\s|\s[GM]B')[1]
        v = ($line -split '\.\d\s|</a')[1]
   
}}


foreach ($file in $files) | where { [io.file]::exists("$($folder)\$($file.f)") } | {

    switch ($file.v) {
   
        'GB' { $s = [math]::round((gi "$($folder)\$($file.f)").length / 1GB,1) }
        'MB' { $s = [math]::round((gi "$($folder)\$($file.f)").length / 1MB,1) }   

    }
   
    "$($file)<$(file.s) $($file.v)><$(s) $($file.v)>" | add-content "C:\info\$($folder.name).txt"
}

invoke-item "C:\info\$($folder.name).txt"

в результате синее окно открывается, потом закрывается через секунду, и все..

Foreigner 30-03-2015 11:11 2489516

А имена файлов какие?
00001start_ARM-385_google.com.avi
или
ARM-385_google.com.avi

Alexander_88 30-03-2015 11:16 2489519

00001start_ARM-385_google.com.avi

в точности, как выделено у меня жирным шрифтом.
может мне нужно слово ориентир задать?, чтобы скрипту легче было, потому что, где я тестирую, там не start

и можно ли добавить несколько пар тхт-папка, или нужно одним скриптом обрабатывать одну пару - тхт?

Foreigner 30-03-2015 11:32 2489527

Alexander_88, Понятно. Просто делать это в воображении не слишком хорошее занятие, сейчас попробую, что-нибудь смоделировать на реальных файлах.

Foreigner 30-03-2015 12:00 2489536

Попробуйте пока такой вариант, для одной папки:
Код:

$folder = get-item "D:\00 ext\start"

foreach ($line in (get-content 000links.txt)) {

    [array] $files += [pscustomobject] @{
   
        f = $([uri]($line -split '<a\shref="|"')[1]).segments[-1] -replace '%20',' '
        s = [double] ($line -split '-\s|\s[GM]B')[1]
        v = ($line -split '\.\d\s|</a')[1]
   
}}

$files | where {[io.file]::exists("$($folder)\$($_.f)")} |

    foreach {
   
        $file = $_

        switch ($file.v) {
   
            'GB' { $s = [math]::round((gi "$($folder)\$($file.f)").length / 1GB,1) }
            'MB' { $s = [math]::round((gi "$($folder)\$($file.f)").length / 1MB,1) }   

        }
   
        "$($file.f)<$($file.s) $($file.v)><$($s) $($file.v)>" | add-content "C:\Info\$($folder.name).txt"
}

invoke-item "C:\Info\$($folder.name).txt"


Alexander_88 30-03-2015 12:52 2489565

протестировал.. вывелось все... и равное по размеру и разное, только пропущены файлы, которые по размеру 1000 - 1024 MB

пример их:

Код:

<a href="http://yandex.ru/file/59c637e386ddd/00001start_PTJ-005_A_google.com.wmv" target="_blank">[$id] - 1 001.1 MB</a>
<a href="http://yandex.ru/file/91cf94be61523/00027start_CC-122_google.com.avi" target="_blank">[$id] - 1 023.3 MB</a>


Foreigner 30-03-2015 13:12 2489574

Alexander_88, Измените эту строку:
Код:

s = [double] (($line -split '-\s|\s[GM]B')[1] -replace '\s')

Alexander_88 30-03-2015 13:21 2489580

исправил, все также как было в первый раз.., я заметил в размерах, которые выводятся в созданном тхт, размер, который находится внутри ссылки тхт, пишется через запятую (хотя в списке ссылок через точку стоит), а размер, который берется с файлы через точку, может в этом дело?

Код:

<934,5 MB><934.5 MB>

Foreigner 30-03-2015 13:31 2489587

Alexander_88, Я отредактировал последний пост, добавил еще одни скобки, попробуйте еще раз.

Alexander_88 30-03-2015 14:04 2489601

я взял пост, заменил в нем

Код:

s = [double] (($line -split '-\s|\s[GM]B')[1] -replace '\s')

получилось

Код:

$folder = get-item "D:\00 ext\start"

foreach ($line in (get-content 000links.txt)) {

    [array] $files += [pscustomobject] @{
   
        f = $([uri]($line -split '<a\shref="|"')[1]).segments[-1] -replace '%20',' '
        s = [double] (($line -split '-\s|\s[GM]B')[1] -replace '\s')
        v = ($line -split '\.\d\s|</a')[1]
   
}}

$files | where {[io.file]::exists("$($folder)\$($_.f)")} |

    foreach {
   
        $file = $_

        switch ($file.v) {
   
            'GB' { $s = [math]::round((gi "$($folder)\$($file.f)").length / 1GB,1) }
            'MB' { $s = [math]::round((gi "$($folder)\$($file.f)").length / 1MB,1) }   

        }
   
        "$($file.f)<$($file.s) $($file.v)><$($s) $($file.v)>" | add-content "C:\Info\$($folder.name).txt"
}

invoke-item "C:\Info\$($folder.name).txt"


теперь, выводятся все файлы (и разные по размеру и одинаковые).. везде стоят точки, 1000-1024мб тоже выводятся

Foreigner 30-03-2015 15:02 2489647

Цитата:

Цитата Alexander_88
теперь, выводятся все файлы (и разные по размеру и одинаковые).. »

Надо только разные?
Код:

...
if ($file.s -ne $s) {

    "$($file.f)<$($file.s) $($file.v)><$($s) $($file.v)>" | add-content "C:\Info\$($folder.name).txt"
}
...


Alexander_88 30-03-2015 15:22 2489658

спасибо, работает, а как сделать, чтобы тхт файл не дополнялся, а перезаписывался?

Foreigner 30-03-2015 15:28 2489661

В начале скрипта
Код:

$folder = get-item "D:\00 ext\start"
remove-item "C:\Info\$($folder.name).txt" -ea 0
...


Alexander_88 30-03-2015 15:34 2489667

спасибо, вопросов больше не имею :)


Время: 10:26.

Время: 10:26.
© OSzone.net 2001-