[powershell 入门教程] 第8天课后作业解析

第8天课后作业

习题1:使用后台作业并行检测多个主机连通性

习题1参考答案:Start-Job 并行 Ping 检测

$hosts = 'google.com', 'github.com', 'baidu.com', 'nonexistent.fake'

# 启动作业
$jobs = foreach ($h in $hosts) {
    Start-Job -ScriptBlock {
        param($hostName)
        $result = Test-Connection $hostName -Count 1 -Quiet -ErrorAction SilentlyContinue
        [PSCustomObject]@{
            Host     = $hostName
            Online   = $result
            Status   = if ($result) { "Online" } else { "Offline" }
        }
    } -ArgumentList $h
}

# 等待所有作业完成
$jobs | Wait-Job | Out-Null

# 收集结果
$results = $jobs | Receive-Job

# 清理作业
$jobs | Remove-Job

# 输出表格
$results | Format-Table -AutoSize
🔍 解析要点:
  • -ArgumentList:向 ScriptBlock 传递外部变量(避免作用域问题)
  • Test-Connection -Quiet:返回布尔值,适合自动化判断
  • Wait-Job:阻塞直到所有作业完成
  • Receive-Job:提取作业输出(必须在 Remove-Job 前调用)

⚠️ 缺点:Start-Job 启动慢(每个 Job 开新进程),仅适合少量任务。


✅ 习题2答案:注册计划任务(ScheduledJob)

参考答案
# 创建日志目录
$null = New-Item -Path "C:\logs" -ItemType Directory -Force

# 定义脚本块
$scriptBlock = {
    $freeGB = [math]::Round((Get-Volume -DriveLetter C).SizeRemaining / 1GB, 2)
    $logEntry = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss'), C盘剩余: ${freeGB} GB"
    Add-Content -Path "C:\logs\disk_usage.log" -Value $logEntry
}

# 注册计划任务(每天凌晨2点)
$trigger = New-JobTrigger -Daily -At "2:00AM"
$options = New-ScheduledJobOption -RunElevated -WakeToRun

Register-ScheduledJob -Name "DailyDiskReport" `
                      -ScriptBlock $scriptBlock `
                      -Trigger $trigger `
                      -ScheduledJobOption $options

# 验证注册
Get-ScheduledJob -Name "DailyDiskReport"
🔍 解析要点:
  • Register-ScheduledJob:创建的是 PowerShell 作业,不是传统 Windows 任务(但底层由 Task Scheduler 托管)
  • -RunElevated:以管理员权限运行(访问 C 盘可能需要)
  • 日志路径:确保目录存在,否则任务静默失败
  • 查看历史Get-Job -Name "DailyDiskReport" 可查执行记录

💡 查看任务位置:
任务计划程序库 → Microsoft → Windows → PowerShell → ScheduledJobs


✅ 习题3参考答案:Runspace 池并发请求(高性能)

# 安装 ThreadJob 模块(如未安装)
# Install-Module ThreadJob -Scope CurrentUser -Force

# 生成50个URL(混合200/404/example)
$urls = @()
for ($i = 0; $i -lt 50; $i++) {
    switch ($i % 3) {
        0 { $urls += "https://httpbin.org/status/200" }
        1 { $urls += "https://httpbin.org/status/404" }
        2 { $urls += "https://example.com" }
    }
}

# 创建 Runspace 池(最大10线程)
$sessionState = [System.Management.Automation.Runspaces.InitialSessionState]::CreateDefault()
$runspacePool = [runspacefactory]::CreateRunspacePool(1, 10, $sessionState, $Host)
$runspacePool.Open()

$jobs = @()
$handles = for ($i = 0; $i -lt $urls.Count; $i++) {
    $url = $urls[$i]
    $ps = [powershell]::Create()
    $ps.RunspacePool = $runspacePool
    [void]$ps.AddScript({
        param($targetUrl)
        $sw = [System.Diagnostics.Stopwatch]::StartNew()
        try {
            $response = Invoke-WebRequest -Uri $targetUrl -UseBasicParsing -TimeoutSec 10
            $statusCode = $response.StatusCode
        } catch {
            $statusCode = $_.Exception.Response?.StatusCode?.value__ -as [int] -or 0
        }
        $sw.Stop()
        [PSCustomObject]@{
            URL      = $targetUrl
            Status   = $statusCode
            Duration = $sw.ElapsedMilliseconds
        }
    }).AddArgument($url)

    $jobs += [PSCustomObject]@{ PowerShell = $ps; Handle = $ps.BeginInvoke() }
    $ps
}

# 等待所有完成
while ($jobs.Handle.IsCompleted -contains $false) {
    Start-Sleep -Milliseconds 100
}

# 收集结果
$results = $jobs | ForEach-Object {
    $_.PowerShell.EndInvoke($_.Handle)
    $_.PowerShell.Dispose()
}

# 关闭池
$runspacePool.Close()
$runspacePool.Dispose()

# 输出前10条(避免刷屏)
$results | Select-Object -First 10 | Format-Table -AutoSize
Write-Host "共处理 $($results.Count) 个请求。" -ForegroundColor Green
🔍 解析要点:
  • Runspace 池 vs Job
    • Start-Job:每个任务开新 powershell.exe 进程(内存高、启动慢)
    • Runspace 池:复用 .NET 线程,内存低、速度快(适合 >50 任务)
  • 错误处理:捕获 Invoke-WebRequest 异常,提取 HTTP 状态码(即使 404 也是有效响应)
  • 性能监控:用 Stopwatch 精确计时
  • 资源清理:必须调用 .Dispose() 防止内存泄漏
代码转载自:https://pan.quark.cn/s/8ce4326d996e 对于在 CentOS 7 系统中修改网卡配置文件后无法使设置生效的情况,经过实践验证,可以通过使用 nmcli 命令来进行调整。完成修改之后,需要重新启动虚拟机以使更改生效,这样操作流程即告完成。如果设置仍然无法生效,则表明虚拟机在启动过程中所获取的 IP 地址配置并非针对 eth0,此时可以对其它网卡的配置文件进行修改或将其移除。在 CentOS 7 系统中,网络配置的管理机制与早期版本存在差异,主要体现为采用了 Network Manager 服务来负责网络接口的管理。在某些情形下,尽管修改了 `/etc/sysconfig/network-scripts` 目录下的 `ifcfg-eth0` 文件,但网络配置却未能即时生效。此类问题的发生通常源于 CentOS 7 采用了不同于以往的配置读取方法。接下来将具体阐述如何借助 nmcli 命令来处理这一挑战。 以 root 用户身份登录系统并打开终端界面。nmcli 是 Network Manager 提供的命令行界面工具,它支持在命令行环境下执行网络连接的建立、编辑、查询及管理任务。针对修改 eth0 网卡配置的需求,可以遵循以下步骤进行操作: 1. 导航至 `/etc/sysconfig/network-scripts` 目录: ``` cd /etc/sysconfig/network-scripts ``` 2. 检查该目录内是否存在 `ifcfg-eth0.bak` 文件,该备份文件可能是先前调整配置时遗留下来的,若存在可能造成冲突。若发现该文件,可以选择将其删除: ``` [root@localhost netw...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值