2008脚本大赛PowerShell Sudden Death Event 10解题及分析

题目位置: http://www.microsoft.com/technet/scriptcenter/funzone/games/games08/sdevent10.mspx

官方题解: http://www.microsoft.com/technet/scriptcenter/funzone/games/solutions08/sdsol10.mspx

这个题目应该是比较有意思的, 因为你可以不写任何脚本就能做出此题. 由于我不会VBScript, 也不是很熟悉Perl, 所以这题让我觉得很有难度. 我们需要从 .CSRIIEHRRTOENSWWPOCTIHPT-T 中找出3个命令, 它们要完成同样的功能. 三个命令分别来自三种语言. 一上来我完全没有头绪, 于是我想先看看究竟都有哪些字符:

PS C :/ Users / Eden >   ' .CSRIIEHRRTOENSWWPOCTIHPT-T ' . GetEnumerator()  |   % { $h   =  @{}} {  $h [ $_ ] ++  } { $h }

Name                           Value
----                             -----
N                              
1
W                              
2
P                              
2
I                              
3
R                              
3
.                                1
-                                1
T                              
4
O                              
2
H                              
2
C                              
2
S                              
2
E                              
2

利用哈希表, 我发现, 出现的字符个数不是很多, 但是由于对VBscript和Perl不熟悉, 我还是没有任何思路. 既然字符种类很少, 那么PowerShell中cmdlet能匹配的数量应该不会很多, 1.0中有129个命令, 我可以试试...根据这个思路, 我执行了下面的命令:

PS C :/ Users / Eden >  Get - Command  |   ?  {  $_   - match  " ^[$($h.Keys | sort)]+`$ "  }  |  fl name

Name 
:  Set - Content
Name 
:  Stop - Process
Name 
:   Write - Error
Name 
:   Write - Host

对于哈希表中Keys进行排序, 然后放在正则表达式中, 只选取那些使用Keys的命令. 现在只有4条命令入围...看起来问题很简单了, 我的第一反应就是Write-Host, 因为看起来它是最普通的cmdlet. 现在我需要从$hash表中删除这些用过的字符:

PS C : Users Eden >   ' WRITE-HOST ' . GetEnumerator()  |   % $h [ $_ ] --  }
PS C
: Users Eden >   $h . GetEnumerator()  |   ?  {  $_ . Value  - gt  0  }

Name                           Value
----                             -----
N                              
1
W                              
1
P                              
2
I                              
2
R                              
2
.                                1
T                              
2
O                              
1
H                              
1
C                              
2
S                              
1
E                              
1

锁定Write-Host之后, 我想到Perl中最普通的输出就是print命令, 再继续试试:

PS C:Users/Eden >   ' PRINT ' .GetEnumerator()  |   % { $h[$_]-- }
PS C:/Users/Eden
>  $h.GetEnumerator()  |   ?   { $_.Value -gt 0 }

Name                           Value
----                             -----
W                              
1
P                              
1
I                              
1
R                              
1
.                              
1
T                              
1
O                              
1
H                              
1
C                              
2
S                              
1
E                              
1

ok, 现在看起来快到最后了, 可是我完全不会VBscript, 这些东西我还是不知道是什么. 我回忆起有个WScript的东西, 再一次排除后, 我发现原来是单词Echo. 已经解完了, 当我准备发送E-Mail的时候, 发现E-mail示例正是使用Wscript.Echo的例子...我觉得自己好笨...呵呵

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值