Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] проверка полного пути файла на кол-во символов, и обрезка имени в случае превышения

Ответить
Настройки темы
PowerShell - [решено] проверка полного пути файла на кол-во символов, и обрезка имени в случае превышения

Старожил


Сообщения: 286
Благодарности: 10

Профиль | Отправить PM | Цитировать


Изменения
Автор: 9119
Дата: 26-06-2021
Добрый!
Итак:

Код: Выделить весь код
$file = "$dir$name.mp4"
$dir= "длинный путь"
$name = "Длинное имя"

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


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


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

Отправлено: 02:04, 26-06-2021

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


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

Отправлено: 10:39, 26-06-2021 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


Сообщения: 286
Благодарности: 10

Профиль | Отправить PM | Цитировать


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

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

Последний раз редактировалось 9119, 26-06-2021 в 11:55.


Отправлено: 11:35, 26-06-2021 | #12


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


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

-------
scio me nihil scire. Ѫ


Последний раз редактировалось YuS_2, 26-06-2021 в 12:18.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:04, 26-06-2021 | #13


Ветеран


Сообщения: 1754
Благодарности: 965

Профиль | Цитировать


Код: Выделить весь код
$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
}
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:41, 26-06-2021 | #14


Старожил


Сообщения: 286
Благодарности: 10

Профиль | Отправить PM | Цитировать


Остановился для себя на таком варианте:
Код: Выделить весь код
$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, 26-06-2021 в 15:04.


Отправлено: 14:53, 26-06-2021 | #15


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


9119, вот этого:
Цитата 9119:
D:\путь\имя файла\имя файла.mp4 в моем случае не будет превышать 240 символов. »
Цитата 9119:
в моем случае там всегда будет что обрезать) »
— быть не должно. В том смысле, что не надо говорить, что «этого не может быть, потому что этого не может быть» — это может быть, и, рано или поздно, обязательно будет, посему сие надо предусматривать заранее. В обязательном порядке.

Отправлено: 18:39, 28-06-2021 | #16


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


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

-------
scio me nihil scire. Ѫ


Отправлено: 08:49, 29-06-2021 | #17



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] проверка полного пути файла на кол-во символов, и обрезка имени в случае превышения

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
PowerShell - обрезка спец символов и создание папки при копировании файла с очень длинным путем 9119 Скриптовые языки администрирования Windows 6 10-06-2021 13:04
.NET - Ошибка открытия файла из-за длинного полного имени файла tumanovalex Программирование и базы данных 8 13-05-2018 23:21
CMD/BAT - удалить первые 7 символов в имени файла ВиталийВ Скриптовые языки администрирования Windows 9 03-04-2015 11:50
VBS/WSH/JS - Проверка наличия файла в папке в случае отсутствия перезагружать компьютер NickCom Программирование и базы данных 4 19-08-2013 05:13
CMD/BAT - [решено] Разработать программу которая будет считать кол-во символов,строк,слов в .txt klenb Скриптовые языки администрирования Windows 10 18-05-2010 15:19




 
Переход