您的位置:首页 > 运维架构 > Shell

2008脚本大赛PowerShell高级组Event 4解题及分析

2008-03-01 17:24 525 查看
中文题目位置: http://www.microsoft.com/technet/scriptcenter/funzone/games/games08/chs/aevent4.mspx

英文解题位置: http://www.microsoft.com/technet/scriptcenter/funzone/games/solutions08/apssol04.mspx

这道题, 比较考验大家对格式处理的能力. 通过分析, 我们可以知道2008. 3月需要6行才能完整显示结果. 而 2009年2月, 只需要4行就能显示完整结果. 因此, 我使用42个元素字符串数组, 也就是7 * 6行. 7代表一周7天, 最多需要6行. 将这些数组元素初始化为3个空格. 这样就可以满足Sun等星期的对齐要求. 计算出需要显示月份的起点, 在数组中的偏移就是星期对应的int值. 数值也要按照3个字符的宽度进行打印. 最后把6行结果全部输出就好了, 利用双引号连接数组, 我使用五个空格作为分隔符. 显示的结果可以说和官方的要求很像了. 看起来也还算舒服. 代码如下

$inMonth = Read-Host "Please enter a month"
[void] ($inMonth -match "^(?<m>/d+)/(?<y>/d+)$")
$titles = "Sun","Mon","Tue","Wed","Thu","Fri","Sat"
$m = $matches.m
$y = $matches.y
$d = 1
$width = 3
$ofs = ' ' * 5
$targetMonth = Get-Date -Year $y -Month $m -Day $d
$a = New-Object -TypeName 'String[]' -ArgumentList 42
for($i = 0; $i -lt $a.Length; $i++) { $a[$i] = " " * $width }
$daysInMonth = [datetime]::DaysInMonth($y, $m)
$startDay = [int]($targetMonth.DayOfWeek)
while ($daysInMonth--) {$a[$startDay++] = "{0,${width}:D}" -f $d++ }
"{0:Y}" -f $targetMonth;
""
"$titles"
"$($a[0..6])"
"$($a[7..13])"
"$($a[14..20])"
"$($a[21..27])"
"$($a[28..34])"
"$($a[35..41])"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: