PowerShell 技能连载 - 本地大模型 Ollama 集成

适用于 PowerShell 7.0 及以上版本,需要安装 Ollama

前一篇我们探讨了 PowerShell 调用云端 AI API 的方式。然而在很多场景下——企业内网环境、数据合规要求、或者仅仅是不想为每一次调试付费——本地运行大语言模型是更务实的选择。Ollama 把模型下载、推理服务、REST API 打包成一条命令就能跑起来的体验,而 PowerShell 作为胶水语言,可以快速将这些能力集成到日常工作流中。

阅读更多

PowerShell 技能连载 - 调用大语言模型 API

适用于 PowerShell 7.0 及以上版本

大语言模型(LLM)已经渗透到开发工作的方方面面。当我们需要在自动化脚本中集成 AI 能力时,直接调用 OpenAI 兼容的 REST API 是最灵活的方式。PowerShell 内置的 Invoke-RestMethod cmdlet 天然适合完成这项工作——无需安装额外 SDK,几行代码即可实现与 LLM 的交互。

本文将从零开始,逐步带你完成 API Key 配置、单次问答封装、多轮对话、代码审查场景以及 Token 用量估算。

准备工作:配置 API Key

调用任何 OpenAI 兼容接口都需要一个 API Key。出于安全考虑,我们通过环境变量来管理它,避免在代码中硬编码。

1
2
# 在 PowerShell 配置文件中添加(只需执行一次)
Add-Content -Path $PROFILE -Value '`$env:OPENAI_API_KEY = "sk-your-key-here"'

如果你使用的是国内中转代理或其他 OpenAI 兼容服务(如 Azure OpenAI、DeepSeek),还需要额外设置基础 URL:

1
2
# 设置自定义 API 端点(可选)
$env:OPENAI_API_BASE = "https://your-proxy.example.com/v1"

配置完成后,重新打开 PowerShell 会话即可生效。你可以通过以下方式验证:

1
2
PS> $env:OPENAI_API_KEY
sk-proj-xxxxxxxxxxxxxx

单次问答:封装通用函数

下面我们封装一个 Invoke-LLMChat 函数,它接受用户提问,返回模型的回复。这个函数是后续所有场景的基础。

函数内部会自动读取环境变量中的 API Key,将用户消息和系统提示组装成 OpenAI Chat Completion 格式的 JSON,然后通过 Invoke-RestMethod 发送 POST 请求。

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
function Invoke-LLMChat {
param(
[Parameter(Mandatory)]
[string]$Prompt,

[string]$Model = "gpt-4o-mini",

[string]$SystemMessage = "你是一个有帮助的 PowerShell 助手。",

[double]$Temperature = 0.7,

[int]$MaxTokens = 2048
)

# 检查 API Key 是否已配置
$apiKey = $env:OPENAI_API_KEY
if (-not $apiKey) {
throw "请先设置环境变量 OPENAI_API_KEY"
}

# 确定请求地址:优先使用自定义端点
$baseUrl = if ($env:OPENAI_API_BASE) { $env:OPENAI_API_BASE } else { "https://api.openai.com/v1" }
$uri = "$baseUrl/chat/completions"

# 构造请求体
$body = @{
model = $Model
messages = @(
@{ role = "system"; content = $SystemMessage }
@{ role = "user"; content = $Prompt }
)
temperature = $Temperature
max_tokens = $MaxTokens
} | ConvertTo-Json -Depth 5 -Compress

# 发送请求(使用 UTF8 编码避免中文乱码)
$response = Invoke-RestMethod `
-Uri $uri `
-Method Post `
-Headers @{ Authorization = "Bearer $apiKey" } `
-ContentType "application/json; charset=utf-8" `
-Body ([System.Text.Encoding]::UTF8.GetBytes($body))

return $response.choices[0].message.content
}

这里有两个值得注意的细节:一是用 -Compress 参数减少 JSON 体积(去掉多余空白),二是用 UTF8.GetBytes 确保中文字符不会在传输中变成乱码。如果你不需要自定义端点,也可以省略 $env:OPENAI_API_BASE 相关逻辑。

调用示例:

1
2
3
4
PS> Invoke-LLMChat -Prompt "用一行 PowerShell 代码获取本机所有 IP 地址"

你可以使用以下命令获取本机所有 IP 地址:
(Get-NetIPAddress -AddressFamily IPv4).IPAddress

多轮对话:维护上下文历史

单次问答没有”记忆”。要让模型理解上下文,我们需要把完整的对话历史(包括之前的用户消息和助手回复)都发给 API。下面这个函数实现了一个交互式的多轮对话循环。

关键点在于 $messages 数组——每次用户发言后追加一条 user 消息,收到模型回复后追加一条 assistant 消息,这样上下文就在数组中不断累积。

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
function Start-LLMConversation {
param(
[string]$Model = "gpt-4o-mini"
)

$apiKey = $env:OPENAI_API_KEY
$baseUrl = if ($env:OPENAI_API_BASE) { $env:OPENAI_API_BASE } else { "https://api.openai.com/v1" }
$uri = "$baseUrl/chat/completions"

# 初始化对话历史,包含系统提示
$messages = @(
@{ role = "system"; content = "你是一个有帮助的助手,请用中文回答。" }
)

Write-Host "多轮对话已启动,输入 'exit' 退出" -ForegroundColor Cyan

while ($true) {
$userInput = Read-Host "你"
if ($userInput -eq "exit") { break }
if ([string]::IsNullOrWhiteSpace($userInput)) { continue }

# 追加用户消息到历史
$messages += @{ role = "user"; content = $userInput }

$body = @{
model = $Model
messages = $messages
} | ConvertTo-Json -Depth 10 -Compress

$response = Invoke-RestMethod `
-Uri $uri `
-Method Post `
-Headers @{ Authorization = "Bearer $apiKey" } `
-ContentType "application/json; charset=utf-8" `
-Body ([System.Text.Encoding]::UTF8.GetBytes($body))

$assistantMessage = $response.choices[0].message.content

# 追加助手回复到历史,保持上下文连续
$messages += @{ role = "assistant"; content = $assistantMessage }

Write-Host "`n助手: $assistantMessage`n" -ForegroundColor Green

# 显示 Token 消耗,帮助控制成本
$usage = $response.usage
Write-Host "[Token] 输入: $($usage.prompt_tokens) | 输出: $($usage.completion_tokens)" -ForegroundColor DarkGray
}
}

运行效果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
PS> Start-LLMConversation
多轮对话已启动,输入 'exit' 退出
你: 写一个函数检查磁盘空间

助手: 这是一个检查磁盘空间的函数:

function Get-DiskSpace {
param([string]$ComputerName = $env:COMPUTERNAME)
Get-CimInstance -ClassName Win32_LogicalDisk ...
}

[Token] 输入: 28 | 输出: 156
你: 再加上邮件告警功能

助手: 好的,在原有函数基础上增加邮件告警:

function Get-DiskSpace {
param(
[string]$ComputerName = $env:COMPUTERNAME,
[double]$ThresholdGB = 10,
...

[Token] 输入: 210 | 输出: 203
你: exit

可以看到第二轮对话中,输入 Token 从 28 涨到 210,因为整个对话历史都被带上了。这也提醒我们:多轮对话的 Token 消耗是递增的,长对话时需要考虑截断历史。

实战场景:代码审查助手

将 LLM 集成到日常工作流中,最实用的场景之一就是代码审查。我们读取一个脚本文件的内容,让模型从安全性、性能、可维护性等维度进行分析。

注意这里用数组拼接代替了 here-string,避免在内容中嵌入三反引号导致语法冲突。

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
function Request-CodeReview {
param(
[Parameter(Mandatory)]
[string]$ScriptPath
)

# 读取脚本内容
$code = Get-Content $ScriptPath -Raw

# 用数组拼接构造提示词,避免 here-string 中出现三反引号
$promptParts = @(
"请审查以下 PowerShell 脚本,指出潜在问题并提供改进建议:"
""
"--- 脚本内容开始 ---"
$code
"--- 脚本内容结束 ---"
""
"请从以下角度分析:"
"1. 安全性(注入风险、凭据处理)"
"2. 性能(循环优化、管道使用)"
"3. 可维护性(命名规范、错误处理)"
"4. 兼容性(PowerShell 版本差异)"
)
$prompt = $promptParts -join "`n"

$review = Invoke-LLMChat -Prompt $prompt -Model "gpt-4o" -MaxTokens 4096

Write-Host "`n========== 代码审查报告 ==========`n" -ForegroundColor Yellow
Write-Host $review
Write-Host "`n==================================`n" -ForegroundColor Yellow
}

假设我们有一个脚本 cleanup.ps1,内容是简单的临时文件清理,执行审查后输出如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
PS> Request-CodeReview -ScriptPath .\cleanup.ps1

========== 代码审查报告 ==========

## 代码审查结果

### 1. 安全性
- 第 3 行使用了硬编码路径 `C:\Temp`,建议改为参数化配置
- 缺少 `-WhatIf` 支持,建议添加 `[SupportsShouldProcess()]`

### 2. 性能
- `Get-ChildItem` 未使用 `-File` 参数,可能误删目录
- 建议添加 `-ErrorAction SilentlyContinue` 避免权限异常中断

### 3. 可维护性
- 缺少注释和帮助文档(Comment-Based Help)
- 变量 `$d` 命名不清晰,建议改为 `$daysOld`

### 4. 兼容性
- 使用了 PowerShell 7 的 `Ternernary` 运算符,Windows PowerShell 5.1 不兼容

==================================

Token 用量估算

在频繁调用 API 的场景下,了解 Token 消耗非常重要。下面这个函数基于响应中的 usage 字段进行累计统计,帮你掌握每次调用的开销。

不同模型的单价不同,函数中提供了常见模型的参考价格(美元/千 Token),你可以根据实际情况调整。

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
function Get-LLMTokenCost {
param(
[int]$PromptTokens,
[int]$CompletionTokens,
[string]$Model = "gpt-4o-mini"
)

# 常见模型价格表(美元/千 Token,仅供参考)
$pricing = @{
"gpt-4o" = @{ Input = 0.005; Output = 0.015 }
"gpt-4o-mini" = @{ Input = 0.00015; Output = 0.0006 }
"gpt-3.5-turbo" = @{ Input = 0.0005; Output = 0.0015 }
}

$rate = $pricing[$Model]
if (-not $rate) {
Write-Warning "未找到模型 $Model 的定价信息"
return
}

$inputCost = [math]::Round($PromptTokens * $rate.Input / 1000, 6)
$outputCost = [math]::Round($CompletionTokens * $rate.Output / 1000, 6)
$totalCost = [math]::Round($inputCost + $outputCost, 6)

[PSCustomObject]@{
模型 = $Model
输入Token = $PromptTokens
输出Token = $CompletionTokens
总Token = $PromptTokens + $CompletionTokens
输入费用 = "`$$inputCost"
输出费用 = "`$$outputCost"
总费用 = "`$$totalCost"
}
}

使用示例:

1
2
3
4
5
PS> Get-LLMTokenCost -PromptTokens 210 -CompletionTokens 203 -Model gpt-4o-mini

模型 输入Token 输出Token 总Token 输入费用 输出费用 总费用
---- -------- -------- ------- -------- -------- ------
gpt-4o-mini 210 203 413 $0.000032 $0.000122 $0.000154

可以看到,一次典型的多轮对话调用成本极低。但如果每天执行数百次自动化任务,费用仍然会累积,因此建议在脚本中加入 Token 上限控制。

注意事项

  • API Key 安全:切勿将 Key 硬编码在脚本中或提交到代码仓库。使用环境变量或 Azure Key Vault 等密钥管理服务。可以在 .gitignore 中排除包含敏感信息的配置文件。
  • Token 限制:每个模型有最大上下文窗口(如 gpt-4o-mini 为 128K)。多轮对话时注意累积的消息长度,必要时截断早期历史。建议在发送前估算 Token 数量(粗略规则:1 个汉字约 1-2 个 Token)。
  • 国内代理:如果无法直接访问 OpenAI API,可以设置 $env:OPENAI_API_BASE 指向国内代理。选择代理服务时注意数据隐私条款,避免敏感代码经第三方中转。
  • 错误处理:生产环境中建议在 Invoke-RestMethod 外包裹 try/catch,处理网络超时、API 限流(429 状态码)等异常情况。
  • 流式响应:本文示例使用非流式调用(等待完整响应后再返回)。如需实现打字机效果,可以使用 SSE(Server-Sent Events)模式,但实现复杂度较高,适合单独封装。

PowerShell 技能连载 - 智能日志分析与模式识别

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
function Invoke-AILogAnalysis {
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)]
[string]$LogPath,

[ValidateSet('Classification','Anomaly')]
[string]$AnalysisType = 'Classification'
)

$analysisReport = [PSCustomObject]@{
Timestamp = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
TotalEntries = 0
DetectedPatterns = @()
ModelAccuracy = 0
}

try {
# 加载预训练机器学习模型
$model = Import-MLModel -Path "$PSScriptRoot/log_analysis_model.zip"

# 预处理日志数据
$logData = Get-Content $LogPath |
ConvertFrom-LogEntry -ErrorAction Stop |
Select-Object TimeGenerated, Message, Level

$analysisReport.TotalEntries = $logData.Count

# 执行AI分析
$predictions = switch($AnalysisType) {
'Classification' {
$logData | Invoke-MLClassification -Model $model
}
'Anomaly' {
$logData | Invoke-MLAnomalyDetection -Model $model
}
}

# 生成检测报告
$analysisReport.DetectedPatterns = $predictions |
Where-Object { $_.Probability -gt 0.7 } |
Select-Object LogMessage, PatternType, Probability

# 计算模型准确率
$analysisReport.ModelAccuracy = ($predictions.ValidationScore | Measure-Object -Average).Average
}
catch {
Write-Error "日志分析失败: $_"
}

# 生成智能分析报告
$analysisReport | Export-Csv -Path "$env:TEMP/AILogReport_$(Get-Date -Format yyyyMMdd).csv"
return $analysisReport
}

核心功能

  1. 机器学习模型集成调用
  2. 日志数据智能分类与异常检测
  3. 预测结果概率分析
  4. 模型准确率动态计算

应用场景

  • IT运维日志模式识别
  • 安全事件自动化检测
  • 系统故障预测分析
  • 日志数据质量评估

PowerShell 技能连载 - 智能运维中的自然语言脚本生成

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
function Invoke-AIOpsAssistant {
param(
[Parameter(Mandatory=$true)]
[string]$Prompt,
[int]$MaxTokens = 200
)

$apiKey = 'sk-xxxxxxxxxxxx'
$headers = @{
'Authorization' = "Bearer $apiKey"
'Content-Type' = 'application/json'
}

$body = @{
model = 'gpt-3.5-turbo'
messages = @(
@{
role = 'system'
content = '你是一个PowerShell专家,根据用户需求生成可直接运行的脚本。要求:1) 使用原生命令 2) 添加详细注释 3) 包含错误处理'
},
@{
role = 'user'
content = $Prompt
}
)
max_tokens = $MaxTokens
} | ConvertTo-Json -Depth 5

try {
$response = Invoke-RestMethod -Uri 'https://api.openai.com/v1/chat/completions' \
-Method Post \
-Headers $headers \
-Body $body

$generatedCode = $response.choices[0].message.content
$tempScript = [System.IO.Path]::GetTempFileName() + '.ps1'
$generatedCode | Out-File -FilePath $tempScript
& $tempScript
}
catch {
Write-Error "AI脚本生成失败:$_"
}
}

核心功能:

  1. 集成OpenAI ChatGPT API实现自然语言转PowerShell脚本
  2. 自动生成带错误处理和注释的生产级代码
  3. 安全执行临时脚本文件
  4. 支持自定义提示工程参数

应用场景:

  • 快速生成AD用户批量管理脚本
  • 自动创建资源监控报表
  • 生成复杂日志分析管道命令

PowerShell 技能连载 - OpenAI 智能运维自动化

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
function Invoke-AIOpsAutomation {
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)]
[string]$OperationContext,

[ValidateRange(1,100)]
[int]$MaxTokens = 60
)

$apiKey = $env:OPENAI_API_KEY
$prompt = @"
作为资深PowerShell运维专家,请根据以下运维场景生成可执行的解决方案:
场景:$OperationContext
要求:
1. 使用标准PowerShell命令
2. 包含错误处理机制
3. 输出结构化数据
4. 确保跨平台兼容性
"@

$body = @{
model = "gpt-3.5-turbo"
messages = @(@{role="user"; content=$prompt})
max_tokens = $MaxTokens
} | ConvertTo-Json

$response = Invoke-RestMethod -Uri 'https://api.openai.com/v1/chat/completions' \
-Method Post \
-Headers @{ Authorization = "Bearer $apiKey" } \
-ContentType 'application/json' \
-Body $body

$codeBlock = $response.choices[0].message.content -replace '```powershell','' -replace '```',''
[scriptblock]::Create($codeBlock).Invoke()
}

核心功能

  1. 自然语言转PowerShell代码生成
  2. 动态脚本编译与执行
  3. OpenAI API安全集成
  4. 跨平台兼容性保障

典型应用场景

  • 根据自然语言描述自动生成日志分析脚本
  • 将故障现象描述转换为诊断代码
  • 创建复杂运维任务的快速原型
  • 生成符合企业规范的脚本模板

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调用云端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
function Invoke-ImageClassification {
param(
[string]$ImagePath,
[string]$ApiKey,
[ValidateRange(1,100)]
[int]$MaxResults = 5
)

try {
$base64Image = [Convert]::ToBase64String((Get-Content $ImagePath -Encoding Byte))
$headers = @{ "Ocp-Apim-Subscription-Key" = $ApiKey }
$body = @{ url = "data:image/jpeg;base64,$base64Image" } | ConvertTo-Json

$response = Invoke-RestMethod -Uri "https://eastus.api.cognitive.microsoft.com/vision/v3.1/analyze?visualFeatures=Categories"
-Method Post
-Headers $headers
-Body $body

$results = $response.categories | Select-Object name, score -First $MaxResults
return $results | Format-Table -AutoSize
}
catch {
Write-Error "分类失败:$($_.Exception.Message)"
}
}

实现原理分析:

  1. 将本地图像转换为Base64编码格式进行传输
  2. 通过Microsoft Cognitive Services视觉API实现智能分类
  3. 参数验证机制确保返回结果数量在合理范围
  4. 结构化返回结果便于后续处理分析
  5. 异常处理机制捕获网络请求和API调用错误

该脚本将传统图像管理升级为智能分类系统,特别适合需要处理大量用户生成内容的内容管理平台。

PowerShell 技能连载 - 自然语言生成运维脚本

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
function Invoke-AIScriptGeneration {
param(
[Parameter(Mandatory=$true)]
[string]$Prompt,
[ValidateSet('AWS','Azure','Windows','Linux')]
[string]$Environment = 'Windows'
)

$apiKey = $env:OPENAI_API_KEY
$headers = @{
'Authorization' = "Bearer $apiKey"
'Content-Type' = 'application/json'
}

$body = @{
model = 'gpt-4-turbo'
messages = @(
@{
role = 'system'
content = "你是一名资深PowerShell专家,根据用户需求生成可直接执行的运维脚本。当前环境:$Environment"
},
@{
role = 'user'
content = $Prompt
}
)
temperature = 0.3
max_tokens = 1024
} | ConvertTo-Json -Depth 5

try {
$response = Invoke-RestMethod -Uri 'https://api.openai.com/v1/chat/completions' \
-Method Post \
-Headers $headers \
-Body $body

$scriptBlock = [scriptblock]::Create($response.choices[0].message.content)
Write-Host "生成脚本验证通过:" -ForegroundColor Green
$scriptBlock.Invoke()
}
catch {
Write-Error "AI脚本生成失败: $($_.Exception.Message)"
}
}

核心功能:

  1. 集成OpenAI API实现自然语言转PowerShell脚本
  2. 支持多环境脚本生成(AWS/Azure/Windows/Linux)
  3. 自动脚本验证与安全执行机制
  4. 温度参数控制脚本生成稳定性

应用场景:

  • 新手运维人员快速生成标准脚本
  • 跨平台环境下的自动化模板生成
  • 复杂运维任务的快速原型开发
  • 企业知识库的脚本标准化沉淀

PowerShell 技能连载 - 基于OpenAI的智能脚本生成

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
function Invoke-AIScriptGeneration {
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)]
[string]$NaturalLanguageQuery,

[ValidateRange(1,4096)]
[int]$MaxTokens = 1024
)

$apiKey = Read-Host -Prompt '输入OpenAI API密钥' -AsSecureString
$cred = New-Object System.Management.Automation.PSCredential ('api', $apiKey)

$body = @{
model = 'gpt-4-turbo-preview'
messages = @(
@{
role = 'system'
content = '你是一个PowerShell专家,将自然语言查询转换为可执行的PowerShell脚本。确保代码符合最佳安全实践,包含错误处理,并添加中文注释。'
},
@{
role = 'user'
content = $NaturalLanguageQuery
}
)
temperature = 0.2
max_tokens = $MaxTokens
} | ConvertTo-Json -Depth 5

try {
$response = Invoke-RestMethod -Uri 'https://api.openai.com/v1/chat/completions' \
-Method POST \
-Headers @{ Authorization = 'Bearer ' + $cred.GetNetworkCredential().Password } \
-ContentType 'application/json' \
-Body $body

$scriptBlock = [scriptblock]::Create($response.choices[0].message.content)
$transcript = [PSCustomObject]@{
Timestamp = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
OriginalQuery = $NaturalLanguageQuery
GeneratedScript = $response.choices[0].message.content
TokenUsage = $response.usage
}

$transcript | Export-Clixml -Path "$env:TEMP/AIScriptTranscript_$(Get-Date -Format yyyyMMdd).xml"
return $scriptBlock
}
catch {
Write-Error "AI脚本生成失败: $_"
}
}

核心功能

  1. 自然语言转PowerShell脚本
  2. 自动生成安全凭据处理
  3. 脚本转录与审计跟踪
  4. 智能温度控制与令牌限制

应用场景

  • 快速原型开发
  • 运维知识库建设
  • 跨团队协作标准化
  • 新人上岗培训

使用 PowerShell 和 OpenAI 实现智能脚本生成

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
# 配置 OpenAI API 密钥
$openAIKey = 'your-api-key'

function Get-AIScript {
param(
[string]$Prompt
)

$headers = @{
'Authorization' = "Bearer $openAIKey"
'Content-Type' = 'application/json'
}

$body = @{
model = 'gpt-4'
messages = @(
@{
role = 'system'
content = '你是一个 PowerShell 专家,请生成符合最佳实践的脚本。要求:1. 包含错误处理 2. 支持verbose输出 3. 包含帮助文档'
},
@{
role = 'user'
content = $Prompt
}
)
} | ConvertTo-Json

$response = Invoke-RestMethod -Uri 'https://api.openai.com/v1/chat/completions' -Method Post -Headers $headers -Body $body

$response.choices[0].message.content
}

# 示例:生成 AD 用户创建脚本
$prompt = @"
创建 PowerShell 函数 New-ADUserWithValidation,要求:
1. 验证输入的邮箱格式
2. 检查用户名唯一性
3. 自动生成随机初始密码
4. 支持WhatIf参数
"@

Get-AIScript -Prompt $prompt

此脚本演示如何通过 OpenAI API 自动生成符合企业规范的 PowerShell 脚本。通过系统提示词确保生成的脚本包含错误处理、verbose 输出等必要元素。实际使用时可扩展以下功能:

  1. 添加 Azure Key Vault 集成管理 API 密钥
  2. 实现脚本静态分析
  3. 与 CI/CD 流水线集成进行自动测试
PowerShell 技术 QQ 群