Показать полную графическую версию : [решено] проверка полного пути файла на кол-во символов, и обрезка имени в случае превышения
Добрый!
Итак:
$file = "$dir$name.mp4"
$dir= "длинный путь"
$name = "Длинное имя"
нужно
если длинна полного пути к файлу .mp4 <240 символов, тогда $file = "$dir$name.mp4"
ели длинна полного пути >240 - $file = "$dir+обрезанный $name.mp4"
Надеюсь хоть на этом форуме помогут) Заранее спасибо.
для примера:
имеем: D:\.\.\.длинное длинное имя.mp4
на выходе: D:\.\.\.длинное дл.mp4
Как именно и по какой логике это будет - неважно. главное результат.
и по какой логике »
9119, есть ещё и не рассмотренный Вами вариант — когда длина самого пути уже больше 240 символов. То есть — никакого «обрезанного» имени файла оттуда по описанной Вами логике получить нельзя будет. Что делать?
Iska,
Нужно так:
если длинна полного пути <240 - $file = "$dir$name.mp4"
ели длинна полного пути >240 - $file = "$dir+обрезанный $name.mp4"
главное результат. »
если вот, прямо по условиям, то:
$length = 18
$dir = 'x:\abcdefghjklm\'
$name = 'name'
$ext = '.mp4'
[string]$file = $dir + $name + $ext
if ($file.length -gt $length) {$file = $file.remove($length) + $ext}
$file
- но учитывайте момент из вопроса, заданного Iska...
когда длина самого пути уже больше 240 символов »
прошу прощения, не совсем понял что имеется ввиду.... что подразумевается под "самого пути"?
ели длинна полного пути >240 - $file = "$dir+обрезанный $name.mp4" »
это уже другие условия... откорректируйте первое сообщение и приведите условия в соответствие с необходимыми...
прошу прощения, не совсем понял что имеется ввиду.... что подразумевается под "самого пути"? »
на примере:
$length = 18
$dir = 'x:\abcdefghijklmnopqrstuvwxyz\'
$name = 'name'
$ext = '.mp4'
[string]$file = $dir + $name + $ext
if ($file.length -gt $length) {$file = $file.remove($length) + $ext}
$file
- запустите код и увидите, что получилось...
давайте чуть подробнее.
изначально, имя для файла получается из заранее подготовленного txt файла
конечный видео-файл будет имеет вид:
D:\путь\имя файла\имя файла.mp4.
Бывает что полный путь к файлу mp.4 выходит больше 240 символов. И из-за этого у софта который должен дальше обрабатывать конечный mp4 файл - возникают проблемы.
Поэтому мне нужно организовать проверку общей длинны пути перед тем как создавать дерево папок и ложить туда файл.mp4.
И если длинна больше 240 символов (например 270), отрезать лишние 30 символов, но именно у D:\путь\имя файла\имя файла.mp4 (т.е в имени самого файла.mp4)
Если же длинна не превышает - оставляем как есть
Т.е вот эта формулировка
если длинна полного пути <240 - $file = "$dir$name.mp4"
ели длинна полного пути >240 - $file = "$dir+обрезанный $name.mp4"
вроде бы максимально подходит под задачу)
И если длинна больше 240 символов (например 270), отрезать лишние 30 символов, но именно у D:\путь\имя файла\имя файла.mp4 (т.е в имени самого файла.mp4)
Если же длинна не превышает - оставляем как есть »
Еще раз:
Измерять, Вы, предполагаете общую длину:
D:\путь\имя файла\имя файла.mp4
Обрезать, желаете имя файла
НО
Вам описывают ситуацию, когда путь превышает те самые 240, т.е.:
D:\путь\имя файла\имя файла.mp4
- здесь длина пути, допустим 270 символов.
Действия?
:\путь\имя файла\имя файла.mp4
- здесь длина пути, допустим 270 символов. »
это должно игнорироваться.
Длинна должна считаться только полностью.
т.е. D:\путь\имя файла\имя файла.mp4
$date = Get-Date -Format "ddMMyy"
$tmp1 = "E:\!!Youtube\АРХИВ\!временное\Ролики\!в работе\tmp\1"
$video_name1 = (Get-Content -encoding utf8 -Path "$tmp1\выкладка.txt")[0]
$name1 = $video_name1 -replace '"', "" -replace ':', " -" -replace '/', "" -replace '\\', "" -replace '&', " and " -replace "‘", "" -replace "<", "" -replace ">", "" -replace "\|", "" -replace '\?', "" -replace '\*', "" -replace '¶', "" -replace '§', "" -replace "!", "" -replace ",", "" -replace "\.", " -"
$dir1 = "E:\!!Youtube\АРХИВ\!временное\Ролики\$date-$name1\кс\"
...
...
New-Item -Path $dir1 -ItemType Directory
#до этой части мне нужно проверить длинну $dir1$name1.mp4, и если она больше 240, обрезать $name1 и перезаписать его с новым обрезанным значением.
copy-item $tmp1\final_video.mp4 $dir1$name1.mp4 #здесь иногда получаем длинну > 240 символов
извините если как-то непонятно объясняю. Может по коду нагляднее будет
D:\путь\имя файла\имя файла.mp4 в моем случае не будет превышать 240 символов.
Foreigner
26-06-2021, 10:32
Т.е вот эта формулировка »
А если в имени нечего обрезать? Например:
C:\240\знаков\1.mp4
Почему для сокращения длины пути не воспользоваться subst, как это делали еще наши пробабушки?
К сожалению, сейчас нарушена связь поколений :(. Для укорачивания пути также можно пользовать дедовские способы с созданием связи каталогов (junction) или отцовские — с созданием символической ссылки на каталог (symlink) ;).
А если в имени нечего обрезать? »
в моем случае там всегда будет что обрезать)
т.к папку и имя у меня формирует $name, т.е $путь_константа\$name\$name.mp4
для себя решил обрезать именно его, по формуле (240 минус символы $путь)/2.
Т.е будет резать и папку и файл одинаково, в случае превышения общего пути в 240 символов.
1.
$name1 = $video_name1 -replace '"', "" -replace ':', " -" -replace '/', "" -replace '\\', "" -replace '&', " and " -replace "‘", "" -replace "<", "" -replace ">", "" -replace "\|", "" -replace '\?', "" -replace '\*', "" -replace '¶', "" -replace '§', "" -replace "!", "" -replace ",", "" -replace "\.", " -" »
- эту строку, лучше сократить до:
$name1 = $video_name1 -replace ':|\.', ' -' -replace '&', ' and ' -replace '"|/|\\|‘|<|>|\||\?|\*|¶|§|!|,'
смысл тот же, но так гораздо приятнее для глаза :)
2.
D:\путь\имя файла\имя файла.mp4 в моем случае не будет превышать 240 символов. »
Ну, если есть в том полная уверенность, а также факт того, что имя файла будет достаточной длины для обрезки, в наличии, то:
$date = Get-Date -Format "ddMMyy"
$tmp1 = "E:\!!Youtube\АРХИВ\!временное\Ролики\!в работе\tmp\1"
$video_name1 = (Get-Content -encoding utf8 -Path "$tmp1\выкладка.txt")[0]
$name1 = $video_name1 -replace ':|\.', ' -' -replace '&', " and " -replace '"|/|\\|‘|<|>|\||\?|\*|¶|§|!|,'
$dir1 = "E:\!!Youtube\АРХИВ\!временное\Ролики\$date-$name1\кс\"
$length = 240
$name = [string]$name1
$ext = '.mp4'
[string]$file = $dir1 + $name + $ext
if ($file.length -gt $length) {
$diff = $file.length - $length
if (($var = $name.length - $diff) -gt 0){
$file = $dir1 + $name.remove($var) + $ext
} elseif (($length - ($dir1+$ext).length) -le 0) {
write-error "Длина пути $dir1 слишком большая"
} else {
write-error 'Имя файла слишком короткое'
}
}
$file
Foreigner
26-06-2021, 12:41
$files = (Get-Content list.txt)
foreach ($file in $files)
{
if ($file.Length -gt 240)
{
$path, $name = $file -split '(?<=^.+\\)(?=[^\\]+$)'
$name = -join ($name[(240 - $path.length)..($name.Length - 1)])
$new = $path + $name
$new # новый полный путь включая файл
$new.Length # общая длина
}
$new = $null
}
Остановился для себя на таком варианте:
$date = Get-Date -Format "ddMMyy"
$name1 = "Длинное название файла"
$length = 96
[string]$name = $name1
if ($name.length -gt $length) {$name1 = $name.remove($length) + $ext}
$dir1 = "$путь\$date-$name1\кс\"
New-Item -Path $dir1 -ItemType Directory
copy-item $tmp1\final_video.mp4 $dir1$name1.mp4
оставшиеся символы уходят на $путь(он всегда неизменен). По итогу полный путь не вылазит за 245 символов, что и требовалось.
Плюс такой вариант более универсален, на случай если D:\$путь\$name1\$name1.mp4 будет уже больше 245 символов.
Спасибо за помощь.
9119, вот этого:
D:\путь\имя файла\имя файла.mp4 в моем случае не будет превышать 240 символов. »
в моем случае там всегда будет что обрезать) »
— быть не должно. В том смысле, что не надо говорить, что «этого не может быть, потому что этого не может быть» — это может быть, и, рано или поздно, обязательно будет, посему сие надо предусматривать заранее. В обязательном порядке.
рано или поздно, обязательно будет, посему сие надо предусматривать заранее. »
Ну, в общем-то, у 9119, предусмотрен контроль превышения длины, т.к. все переменные, кроме одной, заранее известного размера. А та переменная, которая неизвестна, проверяется на превышение определенного количества символов... в итоге, общая длина не будет превышать необходимый порог.
Правда, при превышении длины, там не совсем корректно происходит корректировка имени, с добавлением к контролируемому имени расширения и впоследствии уже именно это новое имя с расширением попадает в наименование каталога, а также в новое имя файла плюс второе расширение... но это уже другой вопрос :)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.