Рефолдер Powershell по имени файла перед разделителем

Я новичок в Powershell, но все чаще использую его для автоматизации задач на работе. Теперь я обращаюсь за помощью. Обычно я использую написанные мной сценарии таким образом, чтобы копировать и вставлять ps1 в каталог, в котором я хочу выполнить задачу. Затем дважды щелкните. Вот почему вы увидите, что имя файла ps1 используется для создания переменной. Это позволяет мне создать своего рода пресет ps1 в зависимости от того, для чего я их использую. Пример: 00-Refolder.tif.ps1

В этом примере файлы сгруппированы в одну папку на основе имени файла перед знаком подчеркивания. Затем они перемещаются с использованием многопоточности. Я использую Powershell 7.1.3. Если кто-нибудь знает способ динамически устанавливать потоки на основе ПК для -Throttlelimit параметр, который было бы здорово узнать.

Версия на Github этого скрипта.

Есть ли более оптимизированный способ выполнения этой задачи по перемещению папки? Будь то другой способ или просто более оптимизированная версия кода ниже. Если у меня отключено форматирование, дайте мне знать, в том числе, если вы считаете, что комментарий сформулирован неправильно или может быть более четким. Я ценю любую помощь.

# Set the delim - all characters in the filenames before the delim will become the new folders.
$refolderDelim = '_'

# Set Threads for multithreading
$threads = 6

# Get the filename of the script to then use substrings of the filename to set variables. 
$scriptPath = $MyInvocation.MyCommand.Path
$scriptName = Split-Path $scriptPath -leaf

# The file type before .ps1 is used as the filter, The two .'s are used to replace, Text before the two .'s in the filename can be changed.
$fileType = $scriptName -replace ('^.+?.','.') -replace ('.ps1')

Measure-Command {

# Filters files in the script's directory by filetype in script filename.
Get-ChildItem -File -Filter *$fileType |
    Group-Object { $_.Name -replace ($refolderDelim + '.*') } |
        ForEach-Object -Parallel {
        
# Checks if folder exists and creates it if not
            if ( -Not ( Test-Path -Path $_.Name ) ) {
                $dir = New-Item -Type Directory -Name $_.Name
            }
            
# If folder does exist it only sets the $dir variable
            else {
                $dir = $_.Name
            }
# Filenames are moved to the repective folder
            $_.Group | Move-Item -Destination $dir
        } -ThrottleLimit $threads
}

Write-Output 'REFOLDER FINISHED: Ready for Next Step'

# Remove lines below if you want Powershell to close automatically after running.
Read-Host -Prompt "Press Enter to exit"
exit

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *