PowerShell 技能连载 - AI 智能脚本生成引擎优化

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
52
53
54
55
56
57
58
function Invoke-AIScriptGeneration {
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)]
[string]$NaturalLanguageQuery,

[ValidateRange(1,5)]
[int]$MaxAttempts = 3
)

$codeReport = [PSCustomObject]@{
Timestamp = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
GeneratedScript = $null
ValidationErrors = @()
OptimizationLevel = 0
}

try {
$prompt = @"
作为PowerShell专家,请将以下运维需求转换为安全可靠的代码:
需求:$NaturalLanguageQuery
要求:
1. 包含try/catch错误处理
2. 支持WhatIf预执行模式
3. 输出结构化对象
4. 符合PowerShell最佳实践
"@

# 调用OpenAI API
$response = Invoke-RestMethod -Uri 'https://api.openai.com/v1/chat/completions' \
-Headers @{ Authorization = "Bearer $env:OPENAI_API_KEY" } \
-Body (@{
model = "gpt-4-turbo"
messages = @(@{ role = "user"; content = $prompt })
temperature = 0.2
max_tokens = 1500
} | ConvertTo-Json)

# 代码安全验证
$validationResults = $response.choices[0].message.content |
Where-Object { $_ -notmatch 'Remove-Item|Format-Table' } |
Test-ScriptAnalyzer -Severity Error

$codeReport.GeneratedScript = $response.choices[0].message.content
$codeReport.ValidationErrors = $validationResults
$codeReport.OptimizationLevel = (100 - ($validationResults.Count * 20))
}
catch {
Write-Error "AI脚本生成失败: $_"
if ($MaxAttempts -gt 1) {
return Invoke-AIScriptGeneration -NaturalLanguageQuery $NaturalLanguageQuery -MaxAttempts ($MaxAttempts - 1)
}
}

# 生成智能编码报告
$codeReport | Export-Csv -Path "$env:TEMP/AIScriptReport_$(Get-Date -Format yyyyMMdd).csv" -NoTypeInformation
return $codeReport
}

核心功能

  1. 自然语言到代码的智能转换
  2. 生成代码的安全验证
  3. 多轮重试机制
  4. 代码优化评分系统

应用场景

  • 运维需求快速原型开发
  • 新手脚本编写辅助
  • 跨团队需求标准化
  • 自动化脚本知识库构建

用 PowerShell 显示 黑客帝国数码雨动画

请在 PowerShell 控制台中执行本脚本

今天在群里看到一个数码雨的课题,试着实现了一下:

【话痨】powershell传教士(1328486072) 12:58:11
话说有人用bat写出了数码雨,谁也用powershell写一个,我用powershell写了几个,总感觉不对。
【话痨】powershell传教士(1328486072) 12:58:52
有人对命令行数码雨,感兴趣么?

根据传教士的提示,改了一下,避免了闪烁。

实现效果

Matrix

源代码

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
## Prepare the screen
$host.UI.RawUI.BackgroundColor = "Black"
$host.UI.RawUI.ForegroundColor = "Green"

$charSet = '0123456789'.ToCharArray()

$width = 75
$height = [Console]::WindowHeight
$maxStringLength = 7
$minStringLength = 2
$maxSpaceLength = 20
$minSpaceLength = 6

$lines = New-Object System.Collections.ArrayList
$symbols = @()

for ($i = 0; $i -lt $width; $i++) {
$symbols += ''
}

function AddLine([string]$line) {
$lines.insert(0, $line)
if ($lines.Count -eq $height) {
$lines.RemoveAt($lines.Count - 1)
}
}

function ShowFrame() {
Write-Host ($lines.ToArray() -join "`n")
}

function TryGenerateSymbol() {
for ($i = 0; $i -lt $width; $i++) {
$column = $symbols[$i]
if ($column -eq '') {
# initial state, generate spaces
$symbols[$i] = New-Object String ' ', (Get-Random -Minimum $minSpaceLength -Maximum $maxSpaceLength)
} elseif ($column -eq ' ') {
# last space
$randomCount = Get-Random -Minimum $minStringLength -Maximum $maxStringLength
$chars = Get-Random -InputObject $charSet -Count $randomCount
$symbols[$i] = $column + ($chars -join '')
} elseif ($column.Length -eq 1) {
# last char
$symbols[$i] = $column + (New-Object String ' ', (Get-Random -Minimum $minSpaceLength -Maximum $maxSpaceLength))
}
}
}

function UpdateFrame() {
TryGenerateSymbol

$line = @()
for ($i = 0; $i -lt $width; $i++) {
$column = $symbols[$i]
$line += $column[0]
$symbols[$i] = $column.Substring(1, $column.Length - 1)
}
$line = $line -join ''
AddLine $line
}

try
{
$host.UI.RawUI.WindowSize = New-Object System.Management.Automation.Host.Size $width + 1, $height + 1
}
catch {}

try
{
$host.UI.RawUI.BufferSize = New-Object System.Management.Automation.Host.Size $width + 1, $height + 1
} catch {}

try
{
while($true)
{
if([Console]::KeyAvailable)
{
$key = [Console]::ReadKey()
if(($key.Key -eq 'Escape') -or
($key.Key -eq 'Q') -or
($key.Key -eq 'C'))
{
break
}
}

# Clear-Host

$host.UI.RawUI.CursorPosition = New-Object System.Management.Automation.Host.Coordinates 0,0

UpdateFrame
ShowFrame

$host.UI.RawUI.CursorPosition = New-Object System.Management.Automation.Host.Coordinates `
0,([Console]::WindowHeight - 1)
Write-Host -NoNewLine 'Q or ESC to Quit'

Start-Sleep -m 100
}
}
finally
{
## Clean up, display exit screen
Clear-Host
"`n"
" Happy Scripting from PowerShell..."
" by Victor.Woo!"
"`n`n`n"
}

您也可以在这里下载 Matrix.ps1

用 PowerShell 重新打包 0day appz

从 0day 服务器下载下来的 appz 文件夹是这样的形态:

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

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

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

软件数量大的时候,人工重复进行上述操作就不合适了。机械的劳动应该交给程序。我们可以设计一个 PowerShell 脚本,完成一系列功能:

  • 遍历 0day appz 的下载目录。
  • 解压所有 .zip 文件。
  • 解压 .rar 文件。
  • 将说明文件复制到一起。
  • 将最终的文件重打包为 .zip 文件。
  • 如果上述的解压有问题,则不打包,并输出错误日志。
  • 清理临时文件。
  • 清理成功的原始文件夹,保留失败的原始文件夹。

按照这个需求,我们可以编写如下 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 修复中的最新更新。

  • 出版日期:2014/1/17
  • 版本:30110.00

在线安装包(1.1 MB)

  • CRC :AD470B9E
  • SHA-1:D3543BFE1F0DA6D7D63760C5C3A5A7166E2B6B42

离线安装包(光盘镜像)(245 MB)

  • CRC :B9C46697
  • SHA-1:51403CAF8E5E9799ACF1F3A0DA0E46390CD2FB16

技术分析:VIM,PowerShell 和签名代码

摘要:在 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 2013

下载信息

英文版

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的PowerShell扩展工具为Visual Studio 2012和2013 RC增加了PowerShell语言支持。

本工具目前为BETA版。

下载地址:Visual Studio工具库
开源项目:GitHub

必须条件:

编辑器扩展

语法高亮、智能感知和代码折叠

Syntax highlighting, IntelliSense and code folding

方法导航

Function navigation

调试器扩展

脚本输出

Script Output

断点支持

Breakpoint Support

本地变量支持

Locals Support

调用堆栈支持

Stack Frame Support

工程系统支持

Project System Support

用脚本批量下载www.cheat-sheets.org中的所有pdf文件

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

下载的PDF截图

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
        }
     }

在vim里转换HEX数据的显示

在做嵌入式设备开发和调试工作中,可能常常遇到以下场景,需要把:

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键就搞定了。

PowerShell 技术 QQ 群