2016-03-01 4 views
-2

Сценарий: Папка с несколькими файлами (файлов не более 5). Каждый файл начинается с символа (не повторяется), за которым следуют цифры. например: A123, B234, C123 ...Условное переименование нескольких файлов - Powershell

Цель: переименовать файлы в соответствии с заданным отображением. например: если A = 1, B = 2 и т. д. Затем файл, начинающийся с «A», становится «1.», файл, начинающийся с «B», становится «2.», и так далее. например: A123 => 1.A123

Мое решение: Я не владею PowerShell, но вот моя попытка достичь вышеуказанной цели.

powershell "cd C:\Temp ; dir | ForEach-Object{if ($_.Name -Like "A*") {Rename-Item $_ "1.$_"} else {if ($_.Name -like "B*") {Rename-Item $_ "2.$_"} else{if($_.Name -like "C*"){Rename-Item $_ "3.$_"}}}}" 

мне нужен скрипт, который будет выполнен из ЦМД, а также в определенной папке (отсюда и компакт-диск, а затем в составе команды переименования).

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

+0

Итак, число файлов начинается с 1 и продолжается последовательно? Или числовые файлы на основе первого символа файла? Таким образом, у вас есть папка с A123, B456 и F789. Стали ли они 1.A123, 2.B456 и 3.F789? Или они становятся 1.A123, 2.B456 и 5.F789? – TheMadTechnician

+0

Имя файла на основе первого символа. Также как 1.A123, 2.B456 и 5.F789 из вашего примера. – MaveriK

ответ

2

Таким образом, вы можете преобразовать письмо в ряд, используя что-то вроде:

[int][char]"F" 

Это будет выход 70. Таким образом, для вашей потребности вам просто нужно, чтобы получить первый символ имени файла, который является простой SubString(0,1) вызов, а затем запустить его через ToUpper(), чтобы убедиться, что вы не получаете никаких строчные буквы, а затем сделать [int][char] немного к нему, и вычесть 64.

powershell "cd C:\Temp ; dir | ForEach-Object{$NewNameNum = [int][char]$_.Name.Substring(0,1).ToUpper() - 64;Rename-Item $_ "$NewNameNum.$_"} 

Edit: O k, поэтому ваш первоначальный вопрос вводит в заблуждение и должен быть отредактирован для более точного представления вашего запроса. Если вы не назначаете A = 1, B = 2, C = 3 в качестве прямого перевода, я вижу 2 хорошие варианты. Сначала это поиск в хэш-таблице.

PowerShell "$NmbrConv = @{'A'=3;'B'=1;'C'=9;'D'=2};dir c:\temp\*|%{$NewNameNum = $NmbrConv[$_.Name.Substring(0,1)];Rename-Item $_ "$NewNameNum.$_"} 

Это определяет, какие буквы преобразуются в какие числа, а затем для каждого файла просто ссылается на хеш-таблицу, чтобы получить номер.

Другой вариант - команда Switch. Запуск его в режиме онлайн становится чем-то уродливым, но вот что бы оно выглядело так красиво.

Switch(GCI C:\Temp){ 
    "^a" {$NewNameNum=3} 
    "^b" {$NewNameNum=1} 
    "^c" {$NewNameNum=9} 
    "^d" {$NewNameNum=2} 
    default {Rename-Item $_ "$NewNameNum.$_"} 
} 

Тогда, если вам нужно все это в одной строке, вы удалите новые строки и замените их точкой с запятой.

powershell 'Switch(GCI C:\Temp){"^a" {$NewNameNum=3};"^b" {$NewNameNum=1};"^c" {$NewNameNum=9};"^d" {$NewNameNum=2};default {Rename-Item $_ "$NewNameNum.$_"}}' 
+0

Большое спасибо @ TheMadTechnician. Но можете ли вы, пожалуйста, помочь мне написать лучшую конструкцию if else. Причина в том, что у меня есть случайное отношение вместо данного простого отношения. то есть мне нужно заменить A => 3, B => 1, C => 9, D = 2 и т. д., а не 1,2,3,4 соответственно. – MaveriK

+0

Тогда вам лучше создать хеш-таблицу для ссылки или использовать команду 'Switch'. – TheMadTechnician