又到了每月一次的PowerShell脚本比赛。这次的题目很有趣,测试了好几个知识点,豆子花了半天的功夫才全部实现。http://powershell.org/wp/2016/03/05/2016-march-scripting-games-puzzle/
题目如下:
某欧洲文件服务器里面有大量的文件名是使用拉丁字母命名的,把他们都找出来。
具体的要求有以下几点:
- <李>
所有的这些拉丁字母(法语,德语等等)都是属于latin - 1字母范畴,只需要找到包含这些字母的文件,其他的拉丁符号不用考虑。
李> <李>写一个函数来获取这些文件的名称,位置,尺寸、尺寸需要好的可读性,比如小文件显示多少K,大文件显示多或少米者多少G
李> <李>如果找到了对应的文件信息,按下列格式保存为csv文件.yyyyMMdd表示年份,月份和日期。
李> <李>写一个计划任务,每2周六晚11点上执行上面的函数
李> <李>把上面生成的附件发邮件给管理员
李> <李> http://powershell.org/wp/wp-content/uploads/2016/03/FileShare.zip 这个是用来测试的文件,
下面是豆子完成的步骤:
1。首先需要解决的问题是怎么找到这些拉丁字母?根据提示,我发现latin - 1的Unicode代码如下所示。如果只是显示字母而不包括其他的符号,那么他的代码范围是00 c0到00 ff
那这样的话我可以通过正则表达式来进行判断是否文件名包括了这些符号。比如
Get-ChildItem -Recurse c: \ test |, Where-Object {_.name 美元;-match “[\ u00C0 - \ u00FF]”}
2。输出文件大小,还必须有很好的可读性。他默认的输出结果是按字节排列的,我需要根据大小进行重新定义,如果精度太长也很难看,我需要保留小数点后一位就行了。
我可以在自定义的字段里面进行判断,如果小于1000字节的用字节显示,小于1米的用KB显示,大于1 g的用MB显示。
例如
,,Get-ChildItem -Recurse -Path 路径美元|, ,,,,,,,Where-Object {_.name 美元;-match “[\ u00C0 - \ u00FF]”}, |, ,,,,,,,select 名字,,目录,creationtime,, lastwritetime, ,,,,,,,@ { ,,,,,,,n=按笮 ? ,,,,,,,e={ ,,,,,,,如果(_.length 美元;-lt 1000) {{0: n1}”, -f 美元_.length.tostring() +“,字节”} ,,,,,,,elseif (_.length 美元;-lt 1000000) {(“{0: n1}”, -f (_.length美元/1 KB)) .ToString () +“, KB,} ,,,,,,,其他{(“{0:n1}”, -f (_.length/1 MB)美元).ToString (), +,“, MB”}, ,,,,,,,} ,,,,,,,},|,tee -Variable 文件
3。,按照时间格式保存,可以使用get-date格式YYYY.M。d来实现。注意我export-csv的时候指定了编码格式是Unicode,不然默认的是ASII格式只会显示问号。
,,,,,,,,如果(file 美元;-eq 零美元){Write-Warning “No file  name dectected with Latin 性格”} ,,,,,,,其他的{ ,,,,,,,$ name=(get-date -Format yyyy.M.d) +“FileNamesWithDiacritics.csv” ,,,,,,, ,,,,,,,file 美元;|,export-csv c: \ temp \ name 美元;-Encoding Unicode}
4。计划任务。这里应该有个错误。我用的是Windows10和Powershell 5,但是当我创建触发器的时候会报错找不到对应的命令。经过研究,需要手动注册对应的财政部文件的内容到WMI库里面。
mofcomp那条命令就是手动注册的命令。
mofcomp C: \ Windows \ System32系统\ wbem \ SchedProv.mof $ action =, New-ScheduledTaskAction -Execute “Powershell.exe”, -Argument “Get-Diacritic.ps1 ” $ trigger =, New-ScheduledTaskTrigger -Weekly  -WeeksInterval 2, -DaysOfWeek Saturday -At 3 Register-ScheduledTask -Action $ action -Trigger  trigger 美元;-TaskName “LatinName”, -Description “Weekly FileName 扫描”
5。发送文件给管理员
注意这里我用的是Office365测试的,所以端口是587。我为了省事,密码用的是明文,比较好的做法应该是把加密之后的指纹(一堆乱码),拷贝到脚本里面使用。
得到美元=,“abc@test.com” 用美元=,“abc@test.com”, $ smtp =,“smtp.office365.com”,=$ sub “file 清单”, body 美元;=," Attached is 从而file 清单” 美元附加=" C: \ \ file.csv脚本” $ secpasswd =, ConvertTo-SecureString “密码”,-AsPlainText -Force $ mycreds =, New-Object System.Management.Automation.PSCredential (从美元,,secpasswd美元) Send-MailMessage 用美元用得到,得到美元-Subject sub 美元;-Body body 美元;-Credential mycreds 美元;-SmtpServer smtp 美元;-DeliveryNotificationOption Never -BodyAsHtml -UseSsl -port 587年,-Attachments $附上Powershell脚本游戏——2016年3月