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

9119 26-06-2021 02:04 2960924

проверка полного пути файла на кол-во символов, и обрезка имени в случае превышения
 
Добрый!
Итак:

Код:

$file = "$dir$name.mp4"
$dir= "длинный путь"
$name = "Длинное имя"


нужно
если длинна полного пути к файлу .mp4 <240 символов, тогда $file = "$dir$name.mp4"
ели длинна полного пути >240 - $file = "$dir+обрезанный $name.mp4"


Надеюсь хоть на этом форуме помогут) Заранее спасибо.


для примера:
имеем: D:\.\.\.длинное длинное имя.mp4
на выходе: D:\.\.\.длинное дл.mp4
Как именно и по какой логике это будет - неважно. главное результат.

Iska 26-06-2021 09:08 2960936

Цитата:

Цитата 9119
и по какой логике »

9119, есть ещё и не рассмотренный Вами вариант — когда длина самого пути уже больше 240 символов. То есть — никакого «обрезанного» имени файла оттуда по описанной Вами логике получить нельзя будет. Что делать?

9119 26-06-2021 09:23 2960941

Iska,
Нужно так:
если длинна полного пути <240 - $file = "$dir$name.mp4"
ели длинна полного пути >240 - $file = "$dir+обрезанный $name.mp4"

YuS_2 26-06-2021 09:26 2960943

Цитата:

Цитата 9119
главное результат. »

если вот, прямо по условиям, то:
Код:

$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...

9119 26-06-2021 09:27 2960944

Цитата:

Цитата Iska
когда длина самого пути уже больше 240 символов »

прошу прощения, не совсем понял что имеется ввиду.... что подразумевается под "самого пути"?

YuS_2 26-06-2021 09:27 2960945

Цитата:

Цитата 9119
ели длинна полного пути >240 - $file = "$dir+обрезанный $name.mp4" »

это уже другие условия... откорректируйте первое сообщение и приведите условия в соответствие с необходимыми...

Цитата:

Цитата 9119
прошу прощения, не совсем понял что имеется ввиду.... что подразумевается под "самого пути"? »

на примере:
Код:

$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

- запустите код и увидите, что получилось...

9119 26-06-2021 09:46 2960949

давайте чуть подробнее.

изначально, имя для файла получается из заранее подготовленного txt файла

конечный видео-файл будет имеет вид:
D:\путь\имя файла\имя файла.mp4.

Бывает что полный путь к файлу mp.4 выходит больше 240 символов. И из-за этого у софта который должен дальше обрабатывать конечный mp4 файл - возникают проблемы.
Поэтому мне нужно организовать проверку общей длинны пути перед тем как создавать дерево папок и ложить туда файл.mp4.

И если длинна больше 240 символов (например 270), отрезать лишние 30 символов, но именно у D:\путь\имя файла\имя файла.mp4 (т.е в имени самого файла.mp4)
Если же длинна не превышает - оставляем как есть


Т.е вот эта формулировка
Код:

если длинна полного пути <240 - $file = "$dir$name.mp4"
ели длинна полного пути >240 - $file = "$dir+обрезанный $name.mp4"

вроде бы максимально подходит под задачу)

YuS_2 26-06-2021 10:09 2960951

Цитата:

Цитата 9119
И если длинна больше 240 символов (например 270), отрезать лишние 30 символов, но именно у D:\путь\имя файла\имя файла.mp4 (т.е в имени самого файла.mp4)
Если же длинна не превышает - оставляем как есть »

Еще раз:
Измерять, Вы, предполагаете общую длину:
D:\путь\имя файла\имя файла.mp4
Обрезать, желаете имя файла
НО
Вам описывают ситуацию, когда путь превышает те самые 240, т.е.:
D:\путь\имя файла\имя файла.mp4
- здесь длина пути, допустим 270 символов.
Действия?

9119 26-06-2021 10:16 2960952

Цитата:

Цитата YuS_2
:\путь\имя файла\имя файла.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 2960954

Цитата:

Цитата 9119
Т.е вот эта формулировка »

А если в имени нечего обрезать? Например:

Код:

C:\240\знаков\1.mp4
Почему для сокращения длины пути не воспользоваться subst, как это делали еще наши пробабушки?

Iska 26-06-2021 10:39 2960956

К сожалению, сейчас нарушена связь поколений :(. Для укорачивания пути также можно пользовать дедовские способы с созданием связи каталогов (junction) или отцовские — с созданием символической ссылки на каталог (symlink) ;).

9119 26-06-2021 11:35 2960959

Цитата:

Цитата Foreigner
А если в имени нечего обрезать? »

в моем случае там всегда будет что обрезать)

т.к папку и имя у меня формирует $name, т.е $путь_константа\$name\$name.mp4
для себя решил обрезать именно его, по формуле (240 минус символы $путь)/2.
Т.е будет резать и папку и файл одинаково, в случае превышения общего пути в 240 символов.

YuS_2 26-06-2021 12:04 2960960

1.
Цитата:

Цитата 9119
$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.
Цитата:

Цитата 9119
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 2960963

Код:

$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
}


9119 26-06-2021 14:53 2960969

Остановился для себя на таком варианте:
Код:

$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 символов.

Спасибо за помощь.

Iska 28-06-2021 18:39 2961067

9119, вот этого:
Цитата:

Цитата 9119
D:\путь\имя файла\имя файла.mp4 в моем случае не будет превышать 240 символов. »

Цитата:

Цитата 9119
в моем случае там всегда будет что обрезать) »

— быть не должно. В том смысле, что не надо говорить, что «этого не может быть, потому что этого не может быть» — это может быть, и, рано или поздно, обязательно будет, посему сие надо предусматривать заранее. В обязательном порядке.

YuS_2 29-06-2021 08:49 2961134

Цитата:

Цитата Iska
рано или поздно, обязательно будет, посему сие надо предусматривать заранее. »

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


Время: 07:10.

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