生成一年的月份文件夹和日子文件夹

时间:2014-12-16 08:00:12

标签: powershell

我创建了一个脚本,该脚本在每个月(格式yyyy_mm)的每个文件夹子文件夹中生成给定路径(第一个参数)文件夹(格式为yyyy_mm_dd)。

代码有效,但有没有更简单的解决方案?

param(
[string]$inppath = '',
[string]$inpyear = '0'
)
function dayfolder
{
  1..[DateTime]::DaysInMonth($inpyear,$month) | ForEach-Object { 
    $day = $_
    New-Item -ItemType directory -Force -Path ($inppath + '\' + $inpyear + '_' + ("{0:D2}" -f $month) + '\' + $inpyear + '_' + ("{0:D2}" -f $month) + '_' + ("{0:D2}" -f $day) ) }
}

if ($inppath -eq '')
{
    echo 'No path in input! First parameter!'
}
else
{
    if ($inpyear -eq '0')
    {
      echo 'No year in input! Second parameter! Format: YYYY'
    }
    else
    {
    1..12 | ForEach-Object { 
            $month = $_
            New-Item -ItemType directory -Force -Path ($inppath + '\' + $inpyear + '_' + ("{0:D2}" -f $month))
            dayfolder
            }
    }       
}

3 个答案:

答案 0 :(得分:5)

我认为你通过为参数提供默认值然后在使用默认值时给出错误消息来使事情变得过于复杂。如果您希望参数是必需的,您应该声明它们。实际上,您可以更进一步,将它们声明为有效路径和特定范围内的数字。

否则我的主要观察是New-Item会创建所需的任何父项,因此您无需单独创建月份文件夹。

有多种方法可以构建路径字符串,但我认为在这种情况下,最简单的格式化月和日,然后只使用一个字符串(请注意,_是一个有效的字符在某些情况下,您必须使用${...}形式的变量扩展的变量名称:

param(
    # Path to an existing folder.
    [Parameter(Mandatory=$True)]
    [ValidateScript({Test-Path $_ -PathType 'Container'})] 
    [string]$inppath,

    # Year must be fairly recent or in the future. Warranty expires 2100
    [Parameter(Mandatory=$True)]
    [ValidateRange(1999,2100)]
    [int]$inpyear
)

1..12 | ForEach-Object {
    $month = "{0:D2}" -f $_
    1..[DateTime]::DaysInMonth($inpyear,$month) | ForEach-Object { 
       $day = "{0:D2}" -f $_
        New-Item -ItemType directory -Force -Path "$inppath\${inpyear}_$month\${inpyear}_${month}_${day}"
    }
}

唯一的另一件事是,如果你想经常使用它,最好把它变成一个函数或cmdlet,然后你可以将它保存在一个带有其他cmdlet的模块中。此外,如果您这样做,每个参数之前的注释将成为帮助屏幕的一部分,您可以在功能声明顶部的注释中包含帮助屏幕的说明和示例。

P.S。对于血腥的PowerShell初学者,我建议http://www.microsoftvirtualacademy.com/training-courses/getting-started-with-powershell-3-0-jump-start

答案 1 :(得分:4)

这是我的方法。它只缺少参数验证(我会像@Duncan那样做):

$inpyear = 2012
$inppath = 'D:\temp\ps'
$startday = [datetime]"$inpyear-01-01"

0..(New-TimeSpan -Start  $startday -End "$inpyear-12-31").TotalDays | select @{name='subpath'; expression={$startday.AddDays($_).ToString('yyyy_MM\\yyyy_MM_dd')}} | foreach {
    New-Item -ItemType Directory -Path (Join-Path $inppath -ChildPath $_.subpath) -Force
}

答案 2 :(得分:-1)

脚本下方:

$path ="[Path]\"
$months = "April 2018","May 2018","June 2018","July 2018","August 2018","September 2018","October 2018","November 2018","December 2018","January 2019","February 2019","March 2019"
foreach($month in $months)
{
    New-Item -ItemType Directory -Path "$path$month"
}