PowerShell 技能连载 - AI 智能脚本生成引擎优化
1 | function Invoke-AIScriptGeneration { |
核心功能:
- 自然语言到代码的智能转换
- 生成代码的安全验证
- 多轮重试机制
- 代码优化评分系统
应用场景:
- 运维需求快速原型开发
- 新手脚本编写辅助
- 跨团队需求标准化
- 自动化脚本知识库构建
PowerShell 技能连载 - AI 智能脚本生成引擎优化
1 | function Invoke-AIScriptGeneration { |
核心功能:
应用场景:
请在 PowerShell 控制台中执行本脚本
今天在群里看到一个数码雨的课题,试着实现了一下:
【话痨】powershell传教士(1328486072) 12:58:11
话说有人用bat写出了数码雨,谁也用powershell写一个,我用powershell写了几个,总感觉不对。
【话痨】powershell传教士(1328486072) 12:58:52
有人对命令行数码雨,感兴趣么?
根据传教士的提示,改了一下,避免了闪烁。

1 | ## Prepare the screen |
您也可以在这里下载 Matrix.ps1
从 0day 服务器下载下来的 appz 文件夹是这样的形态:

每个文件夹代表一个 appz 软件,打开是这个样子的:

里面是一系列 .zip 文件以及说明文件。这些 .zip 文件却不是使用 zip 的分卷压缩出来的,它们的内容如下:


要把这些 .zip 文件全部解压到同一个目录下,才可以得到一系列 rar 的分卷压缩文件。我们打开一个 .rar 文件,这才看到真正的内容:

软件数量大的时候,人工重复进行上述操作就不合适了。机械的劳动应该交给程序。我们可以设计一个 PowerShell 脚本,完成一系列功能:
按照这个需求,我们可以编写如下 PowerShell 脚本:
$DebugPreference = 'Continue'
$incoming = 'd:\0day\incoming'
$temp1 = 'd:\0day\temp1'
$temp2 = 'd:\0day\temp2'
$output = 'd:\0day\output'
if (Test-Path $temp1) { del $temp1 -r }
if (Test-Path $temp2) { del $temp2 -r }
$apps = dir $incoming -Directory
$count = 0
$hasFailed = $false
$apps | foreach {
$name = $_.Name
Write-Progress -Activity 'Repacking apps' -PercentComplete ($count / $apps.Length * 100) -CurrentOperation $name
echo "Repacking $name"
md $temp1 | Out-Null
md $temp2 | Out-Null
# d:\0day\util\7z x -o"d:\0day\temp1" "d:\0day\incoming\VanDyke.SecureCRT.v7.2.2.491.Incl.Patch.And.Keymaker-ZWT\*.zip"
$arguments = 'x', "-o""$temp1""", '-y', (Join-Path $_.FullName *.zip)
.\7z $arguments | Out-Null
if (!$?) {
Write-Warning "Repacking $name failed."
echo "$name" >> "$output\fail.log"
del $temp1 -r
del $temp2 -r
$count++
$hasFailed = $true
return
}
# d:\0day\util\7z x -o"d:\0day\temp2" "d:\0day\temp1\*.rar" -y
$arguments = 'x', "-o""$temp2""", '-y', "$temp1\*.rar"
.\7z $arguments | Out-Null
if (!$?) {
Write-Warning "Repacking $name failed."
echo "$name" >> "$output\fail.log"
del $temp1 -r
del $temp2 -r
$count++
$hasFailed = $true
return
}
# copy d:\0day\temp1\*.diz d:\0day\temp2
# copy d:\0day\temp1\*.nfo d:\0day\temp2
dir $temp1 | where {
$_.Extension -notmatch 'rar|r\d*'
} | copy -Destination $temp2
#d:\0day\util\7z a "d:\0day\output\VanDyke.SecureCRT.v7.2.2.491.Incl.Patch.And.Keymaker-ZWT.zip" "d:\0day\temp2\*.*" -r
$arguments = 'a', "$output\$name.zip", "$temp2\*.*", '-r'
.\7z $arguments | Out-Null
if (!$?) {
Write-Warning "Repacking $name failed."
echo "$name" >> "$output\fail.log"
del $temp1 -r
del $temp2 -r
$count++
$hasFailed = $true
return
}
del $temp1 -r
del $temp2 -r
Remove-Item -LiteralPath $_.FullName -r
$count++
}
if ($hasFailed) {
echo '' >> "$output\fail.log"
}
echo 'Press any key to continue...'
[Console]::ReadKey() | Out-Null
# del 'd:\0day\output\*.*' -r
您也可以在这里下载写好的脚本,包括完整的目录结构和 7z 软件包。请解压到 d:\ 中使用,或者自行调整脚本头部的路径。
Microsoft Visual Studio 2013 Update 1 离线安装包下载
Visual Studio 2013 Update1 官网(微软下载中心)
本次更新是适用于 Visual Studio 2013 的一系列新增功能和 Bug 修复中的最新更新。
摘要:在 UNIX 和 Linux 世界中,vi 和 EMACS 长期占据了处理大量代码或其他文本的最佳编辑器的位置。后来,一个称为 VIM(Vi, IMproved 的简称)的 vi 改进克隆版出现了。VIM 具有语法高亮、一个类似 vi 的命令行界面,以及更多强大的编辑大型文本工程的功能。它很快成为 Windows 世界之外最好用的文本编辑器之一。本文关注 VIM 和 Windows PowerShell 的配合使用,并讨论如何进行代码签名。
下载 PDF 文档:《technical-analysis-vim-powershell-and-signed-code.pdf》。
Visual Studio Ultimate 2013 (x86) - DVD (English)
语言:英语(美国)
文件名:en_visual_studio_ultimate_2013_x86_dvd_3009107.iso
发布日期(UTC):2013-10-17 18:43:01文件大小:2.82 GB
SHA1:79DBBA7B6EF12B1A4E715A7F20951EE66FBCDAB4
Visual Studio Ultimate 2013 (x86) - DVD (Chinese-Simplified)
语言:中文(简体)
文件名:cn_visual_studio_ultimate_2013_x86_dvd_3009109.iso
发布日期(UTC):2013-10-17 18:43:01文件大小:2.87 GB
SHA1:07313542D36ED8BEEF18520AA4F15E33E32C7F77
Visual Studio的PowerShell扩展工具为Visual Studio 2012和2013 RC增加了PowerShell语言支持。
本工具目前为BETA版。
下载地址:Visual Studio工具库
开源项目:GitHub
必须条件:







用脚本批量下载www.cheat-sheets.org中的所有pdf文件
流水不腐,户枢不蠹。虽然批量下载有很多工具能做到,但是为了提高,我们尽量动手编写脚本吧。
http://www.cheat-sheets.org 里有很多好东西,我们把它批量下载下来。

PowerShell代码:
Add-Type -AssemblyName System.Web
$baseUrl = 'http://www.cheat-sheets.org'
$result = Invoke-WebRequest $baseUrl
$result.Links |
? {$_.href -Like '*.pdf'} |
select -ExpandProperty href |
sort |
% {
if ($_ -like '/*')
{
$baseUrl + $_
} else {
$_
}
} |
% {
echo "Downloading $_"
$fileName = $_.Substring($_.LastIndexOf("/") + 1)
$localFileName = [System.Web.HttpUtility]::UrlDecode($fileName)
if (Test-Path $localFileName) {
return
}
Invoke-WebRequest -Uri $_ -OutFile $localFileName
if (Test-Path $localFileName) {
Unblock-File $localFileName
}
}
在做嵌入式设备开发和调试工作中,可能常常遇到以下场景,需要把:
0000:60 00 00 00 00 00 00 00 00 00 00 42 00 00 18 00 `....... ...B....:0015
0016:01 80 80 00 03 14 20 24 20 11 08 17 08 12 34 56 ...... $ .....4V:0031
0032:78 08 87 65 43 21 36 35 30 34 31 37 31 38 00 59 x..eC!65 041718.Y:0047
0048:30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 00000000 00010000:0063
0064:30 30 30 30 49 43 41 52 44 30 30 30 30 30 30 30 0000ICAR D0000000:0079
0080:34 30 30 30 30 30 30 31 32 31 36 30 30 30 30 30 40000001 21600000:0095
0096:30 34 30 30 30 30 32 30 34 30 35 31 31 31 31 31 04000020 40511111:0111
0112:31 31 31 111 :0127
这样的文本,转换为单行,头尾部分不要,中间重复的空格也不要。如下:
60 00 00 00 00 00 00 00 00 00 00 42 00 00 18 00 01 80 80 00 03 14 20 24 20 11 08 17 08 12 34 56 78 08 87 65 43 21 36 35 30 34 31 37 31 38 00 59 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 49 43 41 52 44 30 30 30 30 30 30 30 34 30 30 30 30 30 30 31 32 31 36 30 30 30 30 30 30 34 30 30 30 30 32 30 34 30 35 31 31 31 31 31 31 31 31
这个可以用vim的替换来实现,命令是::%s/\d*:\(\(\x\|\s\)\{24}\) \(\(\x\|\s\)\{24}\).*\n/\1\3/g
我们还可以为它在.vimrc中定义一个快捷键映射:map <C-H> :%s/\d*:\(\(\x\\|\s\)\{24}\) \(\(\x\\|\s\)\{24}\).*\n/\1\3/g<CR>
这样以后按一下CTRL+H键就搞定了。