Chinaunix首页 | 论坛 | 博客
  • 博客访问: 925494
  • 博文数量: 74
  • 博客积分: 10001
  • 博客等级: 上将
  • 技术积分: 2609
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-04 19:54
文章存档

2015年(1)

2009年(2)

2008年(71)

我的朋友

分类: WINDOWS

2008-03-08 16:04:32

题目位置: http://www.microsoft.com/technet/scriptcenter/funzone/games/games08/sdevent10.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:UsersEden> 'WRITE-HOST'.GetEnumerator() | %$h[$_]-- }
PS C
:UsersEden> $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的例子...我觉得自己好笨...呵呵

阅读(1238) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~