Я пытался написать скрипт PowerShell (мой первый)

  1. разбирать только папки в каталоге
  2. выберите только те папки, которые соответствуют определенному соглашению об именах («СЕЗОН ГОД»)
  3. изменить порядок элементов имени ('ГОД СЕЗОН')

В конце концов я использовал программу BulkRenameUtility, чтобы сделать это, используя регулярное выражение ^(\w+) (\d+) и переключив порядок токенов на $ 2 $ 1 - однако я все еще изучаю Powershell и хотел бы иметь возможность сделать это без использования внешняя программа.

Итак, чтобы повторить, в C:\Users\Test

есть папки и файлы .. некоторые из папок называются Spring 2015 , Fall 2014 , например. Однако другие папки имеют такие имена, как geogex . Файлы имеют такие имена, как ENG1A SPRING 2015.odt и untitled_0.odt .

Как изменить только имена папок с именем "Весна 2015" на "Весна 2015", "Осень 2014" и т.д.?

Я был в состоянии использовать

 gci | ? {$_.PSIsContainer} | select-string -pattern '\d+' 

чтобы выполнить 1 и 2, но я застрял на использовании этого, чтобы сделать часть 3: на самом деле переименовать, поменяв местами элементы имени. Я попытался поместить вышеупомянутое в переменную и вот так:

gci | ? {$_.PSIsContainer} | select-string -pattern '\d+' | %{$data = $_.line; Write-Output "$data"};

однако, хотя вышеприведенный выводит именно те папки, которые я хочу, массив $ data, похоже, содержит только последнюю строку вывода. Такой что:

gci | ? {$_.PSIsContainer} | select-string -pattern '\d+' | %{$data = $_.line; Write-Output "$data"};
$data 

будет выводить:

test 123
test 321
test 321

Я не уверен, что это правильное направление для начала.

Любая помощь будет принята с благодарностью.

1 ответ1

0

Вместо Select-String используйте свойства объекта:

# Path to folder
$Path =  '.\'

# Regex to match 'SEASON YEAR' and extract capture groups
$Regex = '^(\w+)\s(\d+)'

# Get all objects in path
Get-ChildItem -Path $Path |
    # Select only objects that are directory and name matches regex
    Where-Object {$_.PSIsContainer -and $_.Name -match $Regex} |
        # For each such object
        ForEach-Object {
            # Generate new name
            $NewName = $_.Name -replace ($Regex, '$2 $1')

            # Rename object
            Rename-Item -Path $_.FullName -NewName $NewName
        }

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .