6

У меня есть папка со следующими именами файлов:

00150005D201110172338427995.vpf
00150005D201110180005318058.vpf
00150013D201110180014448082.vpf
00150013D201110180022268098.vpf
00150013D201110180056118137.vpf
00150004D201110180102008142.vpf
00150004D201110180105398145.vpf
00150016D201110180115378151.vpf
00150016D201110180122168161.vpf
00150003Z201110180143308169.vpf
00150050S201110180232190009.vpf

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

Пример:

До:

f:\ION\2011291 Contains the following files
00150005D201110172338427995.vpf
00150005D201110180005318058.vpf
00150013D201110180014448082.vpf
00150013D201110180022268098.vpf
00150013D201110180056118137.vpf
00150004D201110180102008142.vpf
00150004D201110180105398145.vpf
00150016D201110180115378151.vpf
00150016D201110180122168161.vpf
00150003Z201110180143308169.vpf
00150050S201110180232190009.vpf

После:

F:\ION\2011291 contins only folders no files 
F:\ION\2011291\00150005D contains
  00150005D201110172338427995.vpf
  00150005D201110180005318058.vpf
F:\ION\2011291\00150013D\ contains
  00150013D201110180014448082.vpf
  00150013D201110180022268098.vpf
  00150013D201110180056118137.vpf
F:\ION\2011291\00150004D \contains
  00150004D201110180102008142.vpf
  00150004D201110180105398145.vpf
F:\ION\2011291\00150016D\ contains
  00150016D201110180115378151.vpf
  00150016D201110180122168161.vpf
F:\ION\2011291\00150003Z\ contains
  00150003Z201110180143308169.vpf
F:\ION\2011291\00150050S
  00150050S201110180232190009.vpf

Параметры:

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

2 ответа2

6

Этот скрипт должен сделать работу:

dir | %{ 
    $id = $_.Name.SubString(0,8); 
    if(-not (Test-Path $id)) {mkdir $id}; 
    mv $_ "$id\$_";}

Объяснение:

файл foreach в каталоге (% является псевдонимом для foreach):

  • Получить идентификатор из первых 9 символов. Обратите внимание, что переменная $ _ - это автоматическая переменная, которая заполняется powershell и представляет текущий файл. Свойство Name объекта возвращает объект .NET String, в котором есть функция-член SubString, которую можно использовать для возврата интересующей вас части имени файла.
  • Проверьте, существует ли каталог "id". Если это не так, создайте его (mkdir - это псевдоним New-Item).
  • Затем переместите файл в каталог (mv - это псевдоним Move-Item). Обратите внимание, что когда powershell видит переменную внутри строки в двойных кавычках, он автоматически расширяет свое значение в результирующей строке.

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

1

Вы могли бы сделать что-то вроде этого:

$Directory = "f:\ION\2011291";
$AllFiles = Get-ChildItem $Directory | where {$_.extension -eq ".vpf"};
$FileNames = New-Object System.Collections.ArrayList;
foreach($File in $AllFiles) 
{
    $FileNames.Add($File.Name.SubString(0,9));  
}
$UniqueNames = $FileNames | get-unique;
foreach($Name in $UniqueNames)
{
    New-Item $Directory\$Name -type directory
}
foreach($File in $AllFiles)
{
    $Dir = $File.Name.SubString(0,9);        
    Move-Item $Directory\$File $Directory\$Dir\$File;
}

Объяснение:

  1. Сначала найдите все файлы в каталоге $Directory с расширением .vdf.
  2. Добавьте первые 9 букв из всех имен файлов в $FileNames
  3. Сохраните каждое уникальное имя из $FileNames в $UniqueNames
  4. Создать новые каталоги с именами в $UniqueNames
  5. Переместить каждый файл в соответствующую директорию на основе первых 9 символов

Если скрипт всегда будет выполняться в каталоге, где хранятся файлы, и вы не хотите фильтровать по расширению, посмотрите на ответ @zdans для более компактного и элегантного решения.

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