Я пытаюсь написать автоматизацию таким образом, чтобы я мог дать ввод, как описано ниже, и получить указанный вывод, и я использую Powershell для этого.
INPUT : Song name in the format given below
Artist Name - Song Name.mp3
OUTPUT : Rename the song file in the format given below
Song Name - Artist Name.Mp3
Я понимаю, что для этого есть инструменты OTS, но я пытаюсь сделать это, используя PowerShell как часть более крупного решения.
У меня есть однострочный командлет PowerShell для получения элементов, а затем их переименования. Поэтому я попробовал это:
Get-ChildItem *.mp3 | Rename-Item -NewName {$_.Name.Substring($_.Name.IndexOf("-")+2, $_.Name.IndexOf(".")) +" - " + $_.Name.Substring(0, ($_.Name.IndexOf("-"))) + ".mp3"}
И вот проблема. Второй IndexOf в разделе подстроки получает нулевое значение, поскольку он используется дважды в одной и той же (подстроке) операции дважды.
$_.Name.Substring($_.Name.IndexOf("-")+2, $_.Name.IndexOf("."))
Это похоже на проблему с PowerShell. Возьмите, например, следующие строки:
Get-ChildItem *.mp3 | Select-Object {$_.Name.Substring($_.Name.IndexOf("-")+2)}
Get-ChildItem *.mp3 | Select-Object {$_.Name.Substring($_.Name.IndexOf(".mp3"))}
Когда они отдельно, Ps выдает результат для каждого прогона. Однако, если я запускаю оба командлета вместе, выводит только первая строка, вторая возвращает NULL.
Как получить вывод для приведенной ниже логики (я делаю выбор здесь только для устранения неполадок, как и яне хочу на самом деле переименовывать при устранении неполадок)
Get-ChildItem *.mp3 | Select-Object {$_.Name.Substring($_.Name.IndexOf("-")+2, $_.Name.IndexOf(".mp3"))}
Я могу использовать переменные и соединять строки, но стараюсь держать процесс в одной строке, если это возможно, без написания пользовательского кода / модуля.