Powershell Scripting Game - March 2016

又到了每月一次的PowerShell脚本比赛。这次的题目很有趣,测试了好几个知识点,豆子花了半天的功夫才全部实现。

http://powershell.org/wp/2016/03/05/2016-march-scripting-games-puzzle/

题目如下:

某欧洲文件服务器里面有大量的文件名是使用拉丁字母命名的,把他们都找出来。

具体的要求有以下几点:

  1. 所有的这些拉丁字母(法语,德语等等)都是属于Latin-1 字母范畴,只需要找到包含这些字母的文件,其他的拉丁符号不用考虑。

  2. 写一个函数来获取这些文件的名称,位置,尺寸;尺寸需要好的可读性,比如小文件显示多少K,大文件显示多少M或者多少G

  3. 如果找到了对应的文件信息,按下列格式yyyyMMdd_FileNamesWithDiacritics.csv 保存为csv文件。yyyyMMdd表示年份,月份和日期。

  4. 写一个计划任务,每2周六晚上11点执行上面的函数

  5. 把上面生成的附件发邮件给管理员

  6. http://powershell.org/wp/wp-content/uploads/2016/03/FileShare.zip 这个是用来测试的文件 


下面是豆子完成的步骤:

1.首先需要解决的问题是怎么找到这些拉丁字母?根据提示,我发现Latin-1的Unicode代码如下所示。如果只是显示字母而不包括其他的符号,那么他的代码范围是00C0到00FF

wKioL1bgpe-gmvgyAACTVqjAcz4601.png

那这样的话 我可以通过正则表达式来进行判断是否文件名包括了这些符号。比如

1
Get-ChildItem  -Recurse c:\test |  Where-Object  { $_ .name  -match  "[\u00C0-\u00FF]" }


2. 输出文件大小,还必须有很好的可读性。他默认的输出结果是按字节排列的,我需要根据大小进行重新定义,如果精度太长也很难看,我需要保留小数点后一位就行了。

我可以在自定义的字段里面进行判断,如果小于1000字节的 用Byte显示,小于1M 的用KB显示,大于1G的用MB显示。


例如

1
2
3
4
5
6
7
8
9
10
11
   Get-ChildItem  -Recurse -Path  $path
         Where-Object  { $_ .name  -match  "[\u00C0-\u00FF]" } | 
         select Name, directory, creationtime, lastwritetime,
         @{
         n= "Size" ;
         e={
         if ( $_ .length  -lt  1000){ "{0:n1}"  -f  $_ .length.tostring()+ " Byte" }
         elseif ( $_ .length  -lt  1000000){( "{0:n1}"  -f  ( $_ .length/1kb)).ToString()+ " KB"  }
         else {( "{0:n1}"  -f  ( $_ .length/1mb)).ToString() +  " MB"
         }
         } | tee -Variable file



3.  按照时间格式保存,可以使用 get-date -Format YYYY.M.d 来实现。注意我export-csv的时候指定了编码格式是Unicode,不然默认的是ASII格式只会显示问号。


1
2
3
4
5
         if ( $file  -eq  $null ){ Write-Warning  "No file name dectected with Latin Character" }
         else {
         $name =( get-date  -Format yyyy.M.d)+ "FileNamesWithDiacritics.csv"
         
         $file  export-csv  c:\temp\ $name  -Encoding Unicode}


4.计划任务。这里应该有个bug。我用的是Windows10和Powershell 5,但是当我创建触发器的时候会报错找不到对应的命令。经过研究,需要手动注册对应的mof文件的内容到WMI库里面。

mofcomp那条命令就是手动注册的命令。

1
2
3
4
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 3am
Register-ScheduledTask  -Action  $action  -Trigger  $trigger  -TaskName  "LatinName"  -Description  "Weekly FileName Scanning"


5.发送文件给管理员


注意这里我用的是Office365测试的,所以端口是587。我为了省事,密码用的是明文,比较好的做法应该是把加密之后的指纹(一堆乱码),拷贝到脚本里面使用。

1
2
3
4
5
6
7
8
9
$from  "abc@test.com"
$to  "abc@test.com" 
$smtp  "smtp.office365.com" 
$sub  "file list" 
$body  "Attached is the file list"
$attach = "C:\scripts\file.csv"
$secpasswd  ConvertTo-SecureString  "Password"  -AsPlainText -Force 
$mycreds  New-Object  System.Management.Automation.PSCredential ( $from $secpasswd )
Send-MailMessage  -To  $to  -From  $from  -Subject  $sub  -Body  $body  -Credential  $mycreds  -SmtpServer  $smtp  -DeliveryNotificationOption Never -BodyAsHtml -UseSsl -port 587 -Attachments  $attach


最后给个完整的版本


Get-Diacritic.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
function  Get-Diacritic
{
     [ CmdletBinding ()]
     
     Param
     (
         # Param1 help description
         [ Parameter (
                    ValueFromPipelineByPropertyName = $true ,
                    Position =0)]
         $Path = ".\"
     )
     Begin
     {
     }
     Process
     {
     
         Get-ChildItem  -Recurse -Path  $path
         Where-Object  { $_ .name  -match  "[\u00C0-\u00FF]" } | 
         select Name, directory, creationtime, lastwritetime,
         @{
         n= "Size" ;
         e={
         if ( $_ .length  -lt  1000){ "{0:n1}"  -f  $_ .length.tostring()+ " Byte" }
         elseif ( $_ .length  -lt  1000000){( "{0:n1}"  -f  ( $_ .length/1kb)).ToString()+ " KB"  }
         else {( "{0:n1}"  -f  ( $_ .length/1mb)).ToString() +  " MB"
         }
         } | tee -Variable file 
         if ( $file  -eq  $null ){ Write-Warning  "No file name dectected with Latin Character" }
         else {
         $name =( get-date  -Format yyyy.M.d)+ "FileNamesWithDiacritics.csv"
         
         $file  export-csv  c:\temp\ $name  -Encoding Unicode}
         $from  "abc@test.com"
         $to  "def@test.com" 
         $smtp  "smtp.office365.com" 
         $sub  "file list" 
         
         $Body  $file  ConvertTo-Html  -Head  "Scanning Result"  -As  Table |  Out-String
         $attach = "c:\temp\" + $name
         $secpasswd  ConvertTo-SecureString  "Password"  -AsPlainText -Force 
         $mycreds  New-Object  System.Management.Automation.PSCredential ( $from $secpasswd )
         Send-MailMessage  -To  $to  -From  $from  -Subject  $sub  -Body  $body  -Credential  $mycreds  -SmtpServer  $smtp  -DeliveryNotificationOption Never -BodyAsHtml -UseSsl -port 587 -Attachments  $attach
     }
     End
     {
     }
}
 
Get-Diacritic  c:\users\yli\Downloads


计划任务脚本

1
2
3
4
mofcomp C:\Windows\System32\wbem\SchedProv.mof
$action  New-ScheduledTaskAction  -Execute  'Powershell.exe'  -Argument  'Get-Diacritic -path C:\users\yli\Downloads'
$trigger  New-ScheduledTaskTrigger  -Weekly -WeeksInterval 2 -DaysOfWeek Saturday -At 3am
Register-ScheduledTask  -Action  $action  -Trigger  $trigger  -TaskName  "LatinName"  -Description  "Weekly FileName Scanning"


运行结果

下面的值保存为CSV文件

wKioL1bgrASz2xnCAABWEX1eEGM083.png


保存的文件名

wKioL1bgrTCCtVkfAAAaN8zpR-c913.png


创建的计划任务


wKiom1bgrFzzJuP7AAAdqD8ZKuo939.png


执行一下计划任务

1
Start-ScheduledTask  -TaskName  "LatinName"


收到的邮件

wKiom1bgs93zp7EEAADAew_N-NM740.png










本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1749412,如需转载请自行联系原作者

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值