Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] нужно переименовать большую коллекцию MP3 файлов (http://forum.oszone.net/showthread.php?t=295735)

IVa_ 18-02-2015 16:52 2472987

нужно переименовать большую коллекцию MP3 файлов
 
Столкнулся с проблемой понимания скрипта, Ситуация выглядит следующим образом, нужно переименовать большую коллекцию MP3 файлов.Вместо названия пронумеровать каждый файл в папке.Нашел скрип, и не могу понять что нужно делать.Помогите разобраться.
Хотя в нем все подробно разжевано все равно возникают трудности.

Iska 18-02-2015 17:17 2472999

Цитата:

Цитата IVa_
Вместо названия пронумеровать каждый файл в папке.Нашел скрип, и не могу понять что нужно делать. »

IVa_, возьмите ReNamer « Products « den4b.com.

Foreigner 18-02-2015 17:41 2473010

IVa_, Просто пронумеровать? Без названия? Я переименовываю исходя из тегов (с помощью taglib-sharp). Ваш вариант:
Код:

$dirs = gci "d:\music" -dir -recurse

foreach ($dir in $dirs) {

  if ( test-path "$($dir.fullname)\*.mp3" ) {
 
    $files = gci $dir.fullname '*.mp3'
   
    1..$files.count | % { rename-item -lit $files[($_-1)].fullname "$( '{0:d3}' -f $_ ).mp3" -whatif }
   
   
}}

После проверки уберите ключ -whatif (он выводит предполагаемый результат)

IVa_ 18-02-2015 19:33 2473086

Да названия не к чему, перебрал, лучшие треки.Хотя и с название не помешает заморочек больше.


Код:

Get-ChildItem : Не удается найти параметр, соответствующий имени параметра "dir
".
строка:1 знак:28


Iska 18-02-2015 20:11 2473113

IVa_, опять предложу воспользоваться ReNamer ;), он умеет работать и с тэгами.

Foreigner 18-02-2015 20:28 2473125

IVa_, А какая версия Powershell?
Код:

$host.version.tostring()
Если 2.0 и ниже:
Код:

$dirs = gci "d:\music" -recurse | ? { $_.psiscontainer }

foreach ($dir in $dirs) {

  if ( test-path "$($dir.fullname)\*.mp3" ) {
 
    $files = gci $dir.fullname '*.mp3'
   
    1..$files.count | % { move-item -lit $files[($_-1)].fullname "$($dir.fullname)\$( '{0:d3}' -f $_ ).mp3" -whatif }
   
   
}}

На сколько помню до 3-ей (или 4-ой?) у gci (get-childitem) нет контекста для файловой системы и у rename-item нет ключа -literalpath

Iska 18-02-2015 20:41 2473133

Цитата:

Цитата Foreigner
у gci (get-childitem) нет контекста для файловой системы »

Растолкуйте подробнее, пожалуйста. Для вышеприведённого примера.

Foreigner 18-02-2015 20:42 2473136

Iska, https://technet.microsoft.com/en-us/.../hh847897.aspx

Iska 18-02-2015 21:01 2473148

Foreigner, перефразирую вопрос: каким именно образом, по Get-Help или иначе (но локально), можно выяснить параметры командлета, специфичные для конкретного провайдера? Ибо контекст-то есть, как я понимаю, но как выяснить указанные детали?!

Foreigner 18-02-2015 21:22 2473162

Iska, Наверное никак... Сам случайно натолкнулся в чьем-то скрипте на параметр -directory, ну и пошел в яндекс.
Я пытался так (но не знаю правильно ли вообще):
Код:

help get-childitem -functionality 'filesystem'
Лезет в сеть и ничего не находит

IVa_ 18-02-2015 21:29 2473165

Убрал ключ -lit и все пошло нормально, только это с ключом -whatif.В реальности применю скрипт когда все соберу, подкинули еще файликов, нужно все это перебрать.Я так понимаю в каждой папке файлы будут переименованы с индексом 001-009.Если да то это почти то что нужно.С найденного мною скрипта добавлю еще создание плейлиста.
Версия PS была обновлена только я не могу понять как эти обновления вступают в силу.А так наверное V.1. а нет проверил 2.0
Iska, Программу тоже загружу посмотрю, и оценю её в работе.Русский в настройках имеется?
Foreigner, -lit что это за командлет ?
Без него все идет, без потерь.Ничего я не произойдет.С моими mp3шками.

Kazun 18-02-2015 21:33 2473167

Указать параметр Path и какой провайдер интересует:
Get-help Get-ChildItem -Path cert:\

Iska 18-02-2015 21:37 2473171

Foreigner, если попробовать тупо:
Код:

Get-Help FileSystem
что будет перечислено в динамических параметрах, например?

IVa_ 18-02-2015 21:38 2473172

Kazun, Что с этим делать?

Foreigner 18-02-2015 21:43 2473176

Kazun, Все равно выводит обычную справку:
Код:

Get-help Get-ChildItem -Path cert:\
Get-help Get-ChildItem -Path filesystem:\
Get-help Get-ChildItem -Path $(get-psprovider filesystem)


Iska 18-02-2015 21:44 2473177

Цитата:

Цитата Kazun
Указать параметр Path и какой провайдер интересует:
Get-help Get-ChildItem -Path cert:\ »

Kazun, интересует провайдер FileSystem. Покажите пример его указания.

Kazun 18-02-2015 21:45 2473179

Get-help Get-ChildItem -Path cert:\

SYNTAX
Get-ChildItem [[-Path] <String[]>] [[-Filter] <String>] [-Exclude <String[]>] [-Force] [-Include <String[]>] [-Name
] [-Recurse] [-UseTransaction [<SwitchParameter>]] [<CommonParameters>]

Get-ChildItem [[-Filter] <String>] [-Exclude <String[]>] [-Force] [-Include <String[]>] [-Name] [-Recurse] -Literal
Path <String[]> [-UseTransaction [<SwitchParameter>]] [<CommonParameters>]

Get-ChildItem [-CodeSigningCert] [-DnsName <string>] [-EKU <string>] [-ExpiringInDays <int>] [-SSLServerAuthenticat
ion] [<CommonParameters>]

PS > Get-help Get-ChildItem -Path cert:\ -Parameter CodeSigningCert

-CodeSigningCert [<SwitchParameter>]
Gets only those certificates with code-signing authority. This parameter gets certificates that have "Code Signing
" in their EnhancedKeyUsageList property value.


PS > Get-help Get-ChildItem -Parameter CodeSigningCert
Get-help : No parameter matches criteria CodeSigningCert.
At line:1 char:1
+ Get-help Get-ChildItem -Parameter CodeSigningCert

Так что не соглашусь с данным заявлением.

ЗЫ. Для FileSystem - Get-help Get-ChildItem -Path C:\ -Parameter ReadOnly

Foreigner 18-02-2015 21:49 2473183

Цитата:

Цитата Iska
что будет перечислено в динамических параметрах, например? »

Да, там все есть.

Цитата:

Цитата Kazun
ЗЫ. Для FileSystem - Get-help Get-ChildItem -Path C:\ -Parameter ReadOnly »

Код:

> Get-help Get-ChildItem -Path C:\ -Parameter ReadOnly
Get-help : Нет параметров, отвечающих критериям ReadOnly.
строка:1 знак:1
+ Get-help Get-ChildItem -Path C:\ -Parameter ReadOnly
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (System.Manageme...CommandHelpInfo:ProviderCommandHelpInfo
  ) [Get-Help], PSArgumentException
    + FullyQualifiedErrorId : NoParmsFound,Microsoft.PowerShell.Commands.GetHelpCommand


Kazun 18-02-2015 21:55 2473188

Для начала не плохо бы озвучить версию PowerShell: The ReadOnly parameter was introduced in Windows PowerShell 3.0.

PS > Get-help Get-ChildItem -Path C:\ -Parameter ReadOnly

-ReadOnly [<SwitchParameter>]
Gets only read-only files and directories (folders).

To get only read-only items, use the ReadOnly parameter, its "ar" alias, or the ReadOnly value of the Attributes pa
rameter. To exclude read-only items, use the Attributes parameter.

Все мои примеры v3 и выше.

Foreigner 18-02-2015 22:02 2473194

Kazun,
Код:

> $host.version

Major  Minor  Build  Revision
-----  -----  -----  --------
4      0      -1    -1

Тот же результат выдает $PSVersionTable.PSVersion
Код:

> get-host


Name            : ConsoleHost
Version          : 4.0
InstanceId      : 92980ac2-ee31-4e9a-a070-7bd0a2cc2e08
UI              : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture  : ru-RU
CurrentUICulture : ru-RU
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
IsRunspacePushed : False
Runspace        : System.Management.Automation.Runspaces.LocalRunspace


Iska 18-02-2015 22:04 2473195

Kazun, спасибо, ясно. У меня, к сожалению, совершенно одинаково для:
Код:

Get-Help Get-ChildItem
Get-Help Get-ChildItem -Path cert:\
Get-Help Get-ChildItem -Path c:\

Версия 2.0.

Kazun 18-02-2015 22:08 2473197

В PowerShell v2 - командлет Get-Help работает странно, поэтому используют Get-Command:

http://www.nivot.org/blog/post/2010/...amicParameters

Iska 18-02-2015 22:22 2473208

Kazun, кошмар. Ну, хотя бы так :(.

IVa_ 18-02-2015 22:59 2473240

Ага, прояснения теперь ждут меня.Всем спасибо

IVa_ 06-03-2015 07:32 2479428

Цитата:

Цитата Foreigner
Просто пронумеровать? Без названия? Я переименовываю исходя из тегов (с помощью taglib-sharp). Ваш вариант: »

данный вариант применим к другим типам файлов ?или что мешает при смене типа файлов на PDF переименовывать файлы?

Foreigner 06-03-2015 09:02 2479447

IVa_, Ничего не мешает.

IVa_ 06-03-2015 14:02 2479574

Цитата:

Цитата Foreigner
Ничего не мешает »

Код:

PS C:\Users\TEMP> $dirs = gci "C:\Users\MOC\Desktop\pdf\" -dir -recurse

foreach ($dir in $dirs) {

  if ( test-path "$($dir.fullname)\*.pdf" ) {
 
    $files = gci $dir.fullname '*.pdf'
   
    1..$files.count | % { rename-item -lit $files[($_-1)].fullname "$( '{0:d3}' -f $_ ).pdf"  }
    }}
   
Get-ChildItem : Не удается найти параметр, соответствующий имени параметра "dir".
строка:1 знак:45
+ $dirs = gci "C:\Users\MOC\Desktop\pdf\" -dir <<<<  -recurse
    + CategoryInfo          : InvalidArgument: (:) [Get-ChildItem], ParameterBind
  ingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Command
  s.GetChildItemCommand


Foreigner 06-03-2015 14:15 2479587

IVa_, Значит ваша версия PowerShell ниже 4-й или даже 3-й:
Код:

$dirs = gci "C:\Users\MOC\Desktop\pdf\" -recurse | where { $_.psiscontainer }

foreach ($dir in $dirs) {

  if ( test-path "$($dir.fullname)\*.pdf" ) {
 
    $files = gci $dir.fullname '*.pdf'
   
    1..$files.count | % { rename-item -lit $files[($_-1)].fullname "$( '{0:d3}' -f $_ ).pdf"  }
    }}


IVa_ 06-03-2015 14:19 2479590

Вторая версия. До четвертой обновить не получается(

Iska 06-03-2015 14:48 2479616

Цитата:

Цитата IVa_
До четвертой обновить не получается( »

Старайтесь. Мне, на XP, понятно — никак. А Вам можно.

IVa_ 06-03-2015 14:57 2479621

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

IVa_ 07-03-2015 21:48 2480113

Последний скрипт работает на не совсем свежей версии.
Код:

$dirs = gci "C:\Users\MOC\Desktop\book" -recurse | where { $_.psiscontainer }

foreach ($dir in $dirs) {

  if ( test-path "$($dir.fullname)\*.pdf" ) {
 
    $files = gci $dir.fullname '*.pdf'
   
    1..$files.count | % { rename-item -lit $files[($_-1)].fullname "$( '{0:d3}' -f $_ ).pdf"  }
    }}
Rename-Item : Не удается найти параметр, соответствующий имени параметра "lit".
строка:9 знак:43
+    1..$files.count | % { rename-item -lit <<<<  $files[($_-1)].fullname "$(
'{0:d3}' -f $_ ).pdf"  }
    + CategoryInfo          : InvalidArgument: (:) [Rename-Item], ParameterBin
  dingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Comm
  ands.RenameItemCommand

переименовал файлы одной дочерней директории""C:\Users\MOC\Desktop\book\pdf"
", не затронул файлы в директории book "C:\Users\MOC\Desktop\book" что не допустило переименовать файлы.
Постойте, скрипт работает со всеми форматами, вот с изображением не хочет работать /*.jpg ?.
Не подумайте что пудрю мозг, навожу порядок.

Iska 07-03-2015 21:57 2480116

Цитата:

Цитата IVa_
Rename-Item : Не удается найти параметр, соответствующий имени параметра "lit". строка:9 знак:43 »

Во второй версии у указанного командлета отсутствует параметр «-LiteralPath».

Foreigner 07-03-2015 22:40 2480132

IVa_, Можно обойтись без rename-item, заменив его на move-item (вроде во второй версии у него есть параметр -literalpath)

На самом деле можно и Rename-Item без -LiteralPath. Он, по факту, мне нужен был только для переименования файлов, содержащих квадратные скобки "[" и "]".

Iska 07-03-2015 23:09 2480147

Цитата:

Цитата Foreigner
(вроде во второй версии у него есть параметр -literalpath) »

Есть.

IVa_ 07-03-2015 23:36 2480155

Обновления не хочу ставить,вполне достаточно того что имеется. А вот с литературой и справкой дела обстоят совершенно иначе, к моему удивлению вся полезная литература не является бесплатная, что мешает узнать более подробно о всяческих приемах и процессах написания и не забуду упомянуть правила написания.
Код:

Не удается индексировать в объект типа System.IO.FileInfo.
Код:

$dirs = gci "D:\Iva\электрон.библиотек\PowerShell\Vk.com PowerShell" -recurse | where { $_.psiscontainer }

foreach ($dir in $dirs) {

  if ( test-path "$($dir.fullname)\*.jpg" ) {
 
    $files = gci $dir.fullname '*.jpg'
   
    1..$files.count | % { rename-item  $files[($_-1)].fullname "$( '{0:d3}' -f $_ ).jpg"  }
    }}


Foreigner 08-03-2015 00:46 2480173

IVa_, Запустил в режиме второй версии, действительно ошибка. Исправьте эту строку:
Код:

$files = @(gci $dir.fullname '*.jpg')
Дело в том, что если в папке только один jpg-файл, то переменная $files имеет строковой тип (string), а предполагается массив (array).

На счет книг. Вот ссылка на отличный материал: http://powershell.com/cs/blogs/ebookv2/default.aspx
Раньше была доступна в формате PDF, могу скинуть.

IVa_ 08-03-2015 01:16 2480177

Цитата:

Цитата Foreigner
На счет книг. »

не откажусь.Отличный ресурс.

Foreigner 08-03-2015 01:26 2480180

http://rghost.ru/7LBnHYp6l

IVa_ 08-03-2015 01:52 2480185

Ничего не видно, ссылка не доступна. Если есть возможность передать письмом буду рад:)

IVa_ 08-03-2015 05:13 2480198

Происходит следующее? это при переименовании mp3.В чем дело не могу понять.
Не удается индексировать в объект типа System.IO.FileInfo.

Foreigner 08-03-2015 09:06 2480209

IVa_, Попробуйте заменить rename-item на move-item с параметром -LiteralPath

yurfed 08-03-2015 09:20 2480211

IVa_, вам скрипт только ради интереса нужен? А то ведь есть готовые и удобные решения.
Например [SVS] Rename Files - универсальная программа переименования файлов, MP3 тегов и текста
Ну и до кучи - Переименование файлов

Iska 08-03-2015 13:14 2480239

yurfed, я уже пытался ажник во втором сообщении предложить автору подобное ;).

Foreigner 08-03-2015 14:13 2480247

Iska, Для разовых действий конечно так. А вот если, допустим, хочется автоматизировать процесс переименования файлов? Мне, например, лень лезть в папку и переименовывать новые, легче запустить скрипт, благо консоль всегда открыта.

Iska 08-03-2015 14:38 2480254

Цитата:

Цитата Foreigner
А вот если, допустим, хочется автоматизировать процесс переименования файлов? Мне, например, лень лезть в папку и переименовывать новые, легче запустить скрипт, благо консоль всегда открыта. »

Он умеет:
Цитата:

ReNamer can be run in command line mode, with lots of parameters. This allows you to select your files in explorer (or any other application) and do one-touch renaming.
P.S. Я ничуть не возражаю против использования скриптов.

iccup.platoon@vk 08-03-2015 17:17 2480309

Я тихонечко оставлю тут батник, и пойду дальше.
Переменную path поменять на путь к папке с mp3. Не терпит скобочек в именах файлов - "(" & ")".

Код:

@echo off
setlocal enabledelayedexpansion
set i=0
set path=D:\sandbox\BATTEST\
for /f "tokens=*" %%F in ('dir !path!*.mp3 /b') do (
set /a i=i+1 & ren "%%F" "!i!%%~xF"
)


IVa_ 08-03-2015 17:52 2480317

Цитата:

Цитата Foreigner
rename-item на move-item с параметром -LiteralPath »

параметр -lit не ругается, но ошибка
Код:

Не удается индексировать в объект типа System.IO.FileInfo.
остается, интересное,то что файлы переименовывает за исключением данной ошибки все работает.

IVa_ 08-03-2015 19:43 2480350

PowerShel v2.0
Код:

$dirs = gci "C:\Users" -recurse

foreach ($dir in $dirs) {

  if ( test-path "$($dir.fullname)\*.jpg" ) {
 
    $files = gci $dir.fullname '*.jpg'
   
    1..$files.count | % { rename-item $files[($_-1)].fullname "$( '{0:d3}' -f $_ ).jpg" -whatif }
   
   
}}

Рабочий скрипт, групповое переименования файлов.(для изменения формата файлов вписать вместо jpg нужный формат )
Скрипт также переименовывает файлы в дочерних директориях.
Параметр -whatif тестирует скрипт, без переименования.Для работы уберите данный параметр.
Благодарю Foreigner за предоставление данного скрипта.

IVa_ 13-03-2015 13:27 2482184

Возможно такое при переименовании файлов создать текстовый файл который сохранит все имена переименованных файлов.
То-есть сначала сохранить в текстовый файл имена файлов до переименования, а после переименовать?

Foreigner 13-03-2015 16:08 2482251

Как-то так, не проверял
Код:

....

1..$files.count | % {

    rename-item $files[($_-1)].fullname "$( '{0:d3}' -f $_ ).jpg" -whatif
    "$($files[($_-1)].fullname)  => $( '{0:d3}' -f $_ ).jpg" | add-content log.txt

}}}


IVa_ 21-03-2015 21:57 2485794

Цитата:

Цитата Foreigner
Как-то так, не проверял »

Код:

$dirs = gci "C:\Users\MOC\Desktop\Прожиг\Music" -recurse

foreach ($dir in $dirs){

1..$files.count | % {

    rename-item $files[($_-1)].fullname "$dirs.mp3" -whatif
    "$($files[($_-1)].fullname)  => $dirs.mp3" | add-content log.txt

}}

Скрипт отлично отрабатывает,но есть мелкий недочет, не могу сообразить каким путем выстроить в тексте файлы в столбец.То есть вот так :
file1.mp3
file2.mp3
file3.mp3
Если не ошибаюсь за это отвечает параметр -f
Цитата:

Цитата Foreigner
$( '{0:d3}' -f $_ »


IVa_ 21-03-2015 22:47 2485820

Код:

$dirs = gci "C:\Users\MOC\Desktop\Прожиг" -recurse

foreach ($dir in $dirs){

1..$files.count | % {

    rename-item $files[($_-1)].fullname "$dirs( '{0:d3}' -f $_ ).mp3" -whatif
    "$($files[($_-1)].fullname)  => $( $dir -f $_ ).mp3" | add-content log.txt

}}

Тему закрываю всем спасибо

Код:

$MOC = gci "C:\Users\MOC\Desktop\Прожиг\Music\" -recurse
#Назначаем путь для переменной
foreach ($dir in $dirs){

1..$file.count | % {

    rename-item $files[($_-1)].fullname  -whatif
    "$($file[($_)].fullname)  => $dir " | add-content log.txt

}}



Время: 21:16.

Время: 21:16.
© OSzone.net 2001-