Powershell 生成全年的月文件夹和日子文件夹

Powershell 生成全年的月文件夹和日子文件夹,powershell,Powershell,我创建了一个脚本,它在给定路径(第一个参数)中为每个月生成文件夹(格式yyyy\u-mm),并在每个文件夹中为每天生成子文件夹(格式yyy\u-mm\u-dd) 代码可以工作,但是有更简单的解决方案吗 param( [string]$inppath = '', [string]$inpyear = '0' ) function dayfolder { 1..[DateTime]::DaysInMonth($inpyear,$month) | ForEach-Object { $da

我创建了一个脚本,它在给定路径(第一个参数)中为每个月生成文件夹(格式
yyyy\u-mm
),并在每个文件夹中为每天生成子文件夹(格式
yyy\u-mm\u-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
            }
    }       
}

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

否则,我的主要观察结果是,New Item会创建它所需的任何父项,因此不需要单独创建月份文件夹

有多种方法可以建立路径字符串,但我认为在本例中,最简单的方法是格式化月份和日期,然后只使用单个字符串(注意,
\uu
是变量名称中的有效字符,因此在某些情况下,必须使用变量扩展的
${…}
形式):

唯一的另一件事是,如果您想经常使用它,最好将其转换为函数或cmdlet,然后将其与其他cmdlet一起保存在模块中。此外,如果在每个参数成为帮助屏幕的一部分之前添加注释,则可以在函数声明顶部的注释中包含帮助屏幕的说明和示例


注:对于该死的powershell初学者,我推荐我的方法。只是缺少参数验证(我会像@Duncan那样做):

以下脚本:

$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"
}

谢谢!这样容易多了!您可能应该提到这需要4.0
$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
}
$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"
}