Как создать заданное количество папок, принимающих пользовательский ввод в PowerShell Plus - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь создать 12 папок по одной на каждый месяц, предлагая пользователю ввести год. Как только пользователь вводит год, программа проверяет, существует ли имя папки. Если он не существует, я хочу, чтобы программа создала имя папки с _01, _02, _03, et c ... в конце имени папки, автоматически создавая имя папки, например, 2020_01. Я могу создать одну папку без оператора foreach. Как только я добавляю foreach, чтобы ограничить количество папок и автоматически называть папку, я неудачен. Любое руководство будет оценено.

$folderpath = "C:\MyScripts"
Do
    {
        $curryear = Join-Path $folderpath (Read-Host -Prompt "Enter the year
        for the folder structure: ")
        If (Test-Path -Path $curryear)
        {
            $existingFolder = $true
            Write-Host "Folder exists"
        }
        Else
        {
            $existingFolder = $false
            ForEach-Object {
            New-Item -Path $folderpath -ItemType Directory -Name ($curryear + "-01") |
            Out-Null
            Write-Host "Creating folder name " $curryear
            }
        }
    }  While ($existingFolder)

1 Ответ

1 голос
/ 27 января 2020

В вашем for-each l oop вы не определяете никаких чисел или списка до go over. Вам нужно определить числа, такие как 1 - 12 (для месяцев), чтобы выполнить итерацию и создать папки на основе этих чисел. Я использовал (1..12), что примерно так же, как и для l oop, for (int i = 0; i< 12; i++).

Кроме того, пока вы перебираете эти числа, вы можете использовать опцию форматирования, чтобы использовать 01 вместо 1 при создании папок для согласованности в именах. Для этого используйте опцию -f ("0:d2" -f 1). Найти подробности о форматировании здесь

Еще одна проблема, которую я заметил, заключалась в том, что вы использовали полный путь в качестве имени папки при создании папки. Вам нужно только указать имя в параметре -Name, поскольку вы уже вводите Path. Для этого изменено $curryear назначение.

$folderpath = "C:\Temp\Date"
Do
{
    $curryear = Read-Host -Prompt "Enter the year for the folder structure: "
    If (Test-Path -Path (Join-Path $folderpath $curryear*))
    {
        $existingFolder = $true
        Write-Host "Folder exists"
    }
    Else
    {
        $existingFolder = $false
        (1..12) | ForEach-Object {
            $month = curryear + ("_{0:d2}" -f $_)
            New-Item -Path $folderpath -ItemType Directory -Name $month |Out-Null
            Write-Host "Creating folder name " $month
        }
    }
}  While ($existingFolder)

Еще одним вариантом вышеописанного является продолжение создания папок, пока вы не напишите quit. Если подпапка года, которая уже была создана ранее, была удалена, этот процесс будет работать и создавать только отсутствующие папки.

$folderpath = "C:\Temp\Date"
While ($true)
{
    $curryear = Read-Host -Prompt "Enter the year for the folder structure (quit): "
    if ($curryear -eq "quit") {
       break
    }

    (1..12) | ForEach-Object {
        $month = $curryear + ("_{0:d2}" -f $_)
        try {
            New-Item -Path $folderpath -ItemType Directory -Name $month -ea Stop |Out-Null
            Write-Host "Creating folder name " $month
        }
        catch{
            Write-Host "Folder $month already exists"
        }
    }
}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...