
考虑了我应该在空闲时间开始学习哪些内容后,我终于决定学习PowerShell,因为它是一个功能强大的工具。 由于一个人根本不学习就不会学习任何语言,因此我需要做一些既有趣又对初学者没有挑战性的事情。 在动脑筋提出这样的想法时,我在书上遇到了以下PowerShell语句:
[控制台] :: Beep(1000,1000)
发出哔声 !
作为一个好奇的InfoSec专业人士,我无法停止使用[Console] :: Beep函数的参数的冲动。 经过几次尝试,我发现参数分别是蜂鸣声的频率和持续时间 。 然后,我的大脑立即享受了使用此功能来制作简单音乐的想法-可能是因为音乐是我的特别兴趣之一。
尽管我并不精通音乐理论,但常识是音乐只是由一系列瞬时声音组成。 如果一个人有特殊的技能,例如音乐耳,可以正确地感知旋律的音符和节奏,那么实际上很简单的是通过查找表将音符转换为相应的频率,并将节奏转换为时间单位。 很快,是的,只要您可以用耳朵提取音符和节奏,就可以将一段音乐转换成一系列频率持续时间的元组。
我选择了著名的土耳其国歌Izmir Marsi作为我的前进歌。
我使用音乐耳塞和在线钢琴来匹配音符,然后从伊兹密尔·马西(Izmir Marsi)提取了以下音符:
daaaaaaa#-aga#-a daaaaaaa#-aga#-a adca#-agagfefa dagfedfedcd
上面的表示法不包括节奏,但它或多或少非常简单(我想出的节奏的粗略表示法)>第一节:Half — Quarter(x10)— Half,第二节:Half — Half — Quarter( x9)—一半)。
使用用于音符频率转换的查找表,我得到了以下两个数组,分别是频率(下面的数组$ a)和持续时间(下面的数组$ b)(注意:对于节奏,我选择了400 ms作为我的时间单位,但可以更改):
$ a = 293,440,440,440,440,440,440,466,440,392,466,440,293,440,440,440,440,440,440,440,466,440,392,466,440,440,440,587,523,466,440,392,440,392,349,329,349,440,293,440,293,440,392,349,329,293,349,329,349,440,293,440,392,329,329,293,349,329,329,293,261,293; $ b = 800,400,400,400,400,400,400,400,400,400,400,400,900,800,400,400,400,400,400,400,400,400,400,400,400,900,800,800,400,400,400,400,400,400,400,400,800,900,800,800,800,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400
现在,您可能已经猜到了,我们需要将Beep函数与所有这些数字结合使用,以通过PowerShell播放音乐,其含义如下:
[控制台] :: Beep(293,800); [控制台] :: Beep(440,400); 。 。 。 [控制台] :: Beep(293,800);
但是,除了单独编写它们之外,我们还可以简单地使用以下循环:
$ c = @(0..46); $ c.ForEach {[Console] :: Beep($ a [$ _],$ b [$ _])}
其中(0..46)表示0到46之间的所有数字(数组索引),我们通过ForEach函数针对频率($ a)和持续时间($ b)数组中的每个数组项调用Beep函数。
因此,整体代码如下所示:
$ a = 293,440,440,440,440,440,440,466,440,392,466,440,293,440,440,440,440,440,440,440,466,440,392,466,440,440,440,587,523,466,440,392,440,392,349,329,349,440,293,440,293,440,392,349,329,293,349,329,349,440,293,440,392,329,329,293,349,329,329,293,261,293; $ b = 800,400,400,400,400,400,400,400,400,400,400,400,900,800,400,400,400,400,400,400,400,400,400,400,400,900,800,800,400,400,400,400,400,400,400,400,800,900,800,800,800,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400 $ c = @(0..46); $ c.ForEach {[Console] :: Beep($ a [$ _],$ b [$ _])}
为了使事情看起来更奇妙和神秘,我决定在与朋友共享之前将它们编码为已编码的PowerShell命令。 这就是我做到的方式(通过此处引用):
$ cmd ='$ a = 293,440,440,440,440,440,440,466,440,392,466,440,293,440,440,440,440,440,440,466,440,392, 466,440,440,587,523,466,440,392,440,392,349,329,349,440,293,440,392,349,329,293,349,329,293,261,293; $ b = 800,400,400,400,4 00,400,400,400,400,400,400,900,800,400,400,400,400,400,400,400,400,400,400,900,800,800,400,400,400,400,400,400,400,400,400,8 00,900,800,800,400,400,400,400,400,400,400,400,800; $ c = @(0..46); $ c.ForEach {[Console] :: Beep($ a [$ _],$ b [$ _])}';; $ bytes = [System.Text.Encoding] :: Unicode.GetBytes($ cmd); $ enccmd = [转换] :: ToBase64String($ bytes)
上面的代码只是简单地将命令字符串首先转换为字节,然后转换为base64编码的字符串:
=
最后,可以在Windows PowerShell或CMD(命令提示符)上通过以下命令执行此代码:
powershell.exe -enc =
请记住,好的介绍总是伴随着好的音乐。
请享用!