Войти

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


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

<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
Не тестировал:

$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
вот такое получилось

$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
А имена файлов какие?
00001start_ARM-385_google.com.avi
или
ARM-385_google.com.avi

Alexander_88
30-03-2015, 11:16
00001start_ARM-385_google.com.avi

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

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

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

Foreigner
30-03-2015, 12:00
Попробуйте пока такой вариант, для одной папки:

$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
протестировал.. вывелось все... и равное по размеру и разное, только пропущены файлы, которые по размеру 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
Alexander_88, Измените эту строку:

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

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

<934,5 MB><934.5 MB>

Foreigner
30-03-2015, 13:31
Alexander_88, Я отредактировал последний пост, добавил еще одни скобки, попробуйте еще раз.

Alexander_88
30-03-2015, 14:04
я взял пост, заменил в нем

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
теперь, выводятся все файлы (и разные по размеру и одинаковые).. »
Надо только разные?

...
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
спасибо, работает, а как сделать, чтобы тхт файл не дополнялся, а перезаписывался?

Foreigner
30-03-2015, 15:28
В начале скрипта

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

Alexander_88
30-03-2015, 15:34
спасибо, вопросов больше не имею :)




© OSzone.net 2001-2012