PowerShell 从基础到实战 3(控制结构与脚本交互)

PowerShell 从基础到实战 3(控制结构与脚本交互)

一、与其他脚本程序的相互调用

PowerShell 可以直接调用外部脚本(如 Python、批处理文件)或执行命令行工具,实现跨语言协作。

1.1 调用外部命令

bash 复制代码
# 直接调用 Windows 命令(如 ping)
ping google.com

# 调用外部可执行文件(如 Notepad)
notepad

# 调用批处理文件
.\example.bat

1.2 使用 Start-Process 调用脚本

arduino 复制代码
# 调用 Python 脚本(需安装 Python)
Start-Process -FilePath "python.exe" -ArgumentList ".\script.py"

# 调用批处理文件并传参
Start-Process -FilePath ".\example.bat" -ArgumentList "arg1", "arg2"

1.3 从 PowerShell 调用 Python 脚本

bash 复制代码
# 示例:调用 Python 脚本并捕获输出
$output = python .\add.py 5 3
Write-Host "Python 返回结果: $output"

Python 脚本 add.py 示例:

css 复制代码
import sys
a, b = int(sys.argv[1]), int(sys.argv[2])
print(a + b)

二、条件操作符

PowerShell 支持丰富的比较和逻辑操作符,用于构建条件判断。

2.1 数值比较操作符

操作符 含义
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于

示例:

perl 复制代码
$a = 10
$b = 5
if ($a -gt $b) {
    Write-Host "$a 大于 $b"
}

2.2 字符串比较操作符

操作符 含义
-like 通配符匹配
-match 正则匹配
-eq 精确匹配
-notlike 通配符不匹配

示例:

bash 复制代码
$name = "Alice"
if ($name -like "A*") {
    Write-Host "名称以 A 开头"
}

2.3 逻辑操作符

操作符 含义
-and
-or
-not

示例:

perl 复制代码
if ($a -gt 0 -and $b -lt 10) {
    Write-Host "条件成立"
}

三、条件判断 if 语句

if 语句用于基于条件执行代码块。

3.1 基本语法

php 复制代码
if (条件) {
    # 条件为真时执行
} elseif (条件) {
    # 其他条件为真时执行
} else {
    # 所有条件为假时执行
}

3.2 示例:判断磁盘空间

perl 复制代码
$disk = Get-PSDrive C
if ($disk.Free -lt 5GB) {
    Write-Host "磁盘空间不足!"
} elseif ($disk.Free -lt 10GB) {
    Write-Host "磁盘空间偏低。"
} else {
    Write-Host "磁盘空间充足。"
}

3.3 嵌套 if 语句

bash 复制代码
$user = "admin"
$password = "123456"

if ($user -eq "admin") {
    if ($password -eq "123456") {
        Write-Host "登录成功"
    } else {
        Write-Host "密码错误"
    }
} else {
    Write-Host "用户不存在"
}

四、条件判断 switch 语句

switch 用于多条件分支判断,比 if-elseif 更简洁。

4.1 基本语法

arduino 复制代码
switch (表达式) {
    值1 { 代码块1 }
    值2 { 代码块2 }
    default { 默认代码块 }
}

4.2 示例:匹配用户输入

php 复制代码
$action = "start"
switch ($action) {
    "start" { Write-Host "开始任务" }
    "stop"  { Write-Host "停止任务" }
    "exit"  { Write-Host "退出程序" }
    default { Write-Host "未知命令" }
}

4.3 通配符匹配

php 复制代码
$file = "report.txt"
switch -Wildcard ($file) {
    "*.txt" { Write-Host "文本文件" }
    "*.jpg" { Write-Host "图片文件" }
    default { Write-Host "其他类型" }
}

五、循环结构 foreach 语句

foreach 用于遍历集合中的每个元素。

5.1 基本语法

perl 复制代码
foreach ($item in 集合) {
    # 对每个元素执行操作
}

5.2 示例:遍历数组

perl 复制代码
$numbers = 1, 2, 3, 4, 5
foreach ($num in $numbers) {
    Write-Host "当前数字: $num"
}

5.3 结合 Get-ChildItem 遍历文件

vbnet 复制代码
Get-ChildItem C:\Temp | ForEach-Object {
    Write-Host "文件名: $($_.Name)"
}

六、循环结构 while 语句

while 在条件为真时持续执行循环体。

6.1 基本语法

bash 复制代码
while (条件) {
    # 条件为真时执行
}

6.2 示例:等待进程结束

arduino 复制代码
$process = Start-Process notepad -PassThru
while (!$process.HasExited) {
    Write-Host "记事本正在运行..."
    Start-Sleep -Seconds 1
}
Write-Host "记事本已关闭"

6.3 do-while 循环(至少执行一次)

perl 复制代码
$count = 0
do {
    Write-Host "计数: $count"
    $count++
} while ($count -lt 3)

七、breakcontinue 关键字

7.1 break:退出循环

perl 复制代码
for ($i = 0; $i -lt 10; $i++) {
    if ($i -eq 5) {
        break
    }
    Write-Host "当前数字: $i"
}
# 输出 0-4

7.2 continue:跳过当前迭代

perl 复制代码
for ($i = 0; $i -lt 10; $i++) {
    if ($i % 2 -eq 0) {
        continue
    }
    Write-Host "奇数: $i"
}
# 输出 1,3,5,7,9

八、循环结构 for 语句

for 是经典的计数循环,适合已知迭代次数的场景。

8.1 基本语法

ini 复制代码
for (初始化; 条件; 迭代) {
    # 循环体
}

8.2 示例:计算自然数和

bash 复制代码
$sum = 0
for ($i = 1; $i -le 5; $i++) {
    $sum += $i
}
Write-Host "1到5的和为: $sum"

九、循环结构 switch 循环

switch 通常用于条件分支,但也可以结合 forforeach 实现循环效果。

9.1 示例:结合 foreachswitch

php 复制代码
$files = @("report.txt", "image.jpg", "data.csv")
foreach ($file in $files) {
    switch -Wildcard ($file) {
        "*.txt" { Write-Host "文本文件: $file" }
        "*.jpg" { Write-Host "图片文件: $file" }
        default { Write-Host "其他文件: $file" }
    }
}

总结

PowerShell 的控制结构(条件判断、循环、脚本调用)是自动化任务的核心工具。通过 ifswitch 实现条件分支,foreachwhilefor 处理循环逻辑,结合 break/continue 精准控制流程,可以高效完成系统管理、数据处理等任务。与其他脚本语言的交互能力进一步扩展了其应用场景,使其成为跨平台自动化的重要工具。

相关推荐
小高0072 小时前
🚀前端异步编程:Promise vs Async/Await,实战对比与应用
前端·javascript·面试
amazinging3 小时前
北京-4年功能测试2年空窗-报培训班学测开-第七十一天-面试第二天
python·学习·面试
丘山子3 小时前
如何规避 A/B Testing 中的致命错误?何时进行 A/B 测试?
前端·后端·面试
Dream it possible!4 小时前
LeetCode 面试经典 150_数组/字符串_加油站(14_134_C++_中等)(贪心算法)
c++·leetcode·面试
国家不保护废物4 小时前
跨域问题:从同源策略到JSONP、CORS实战,前端必知必会
前端·javascript·面试
言兴4 小时前
#Web Workers 深度解析:让 JavaScript 拥抱多线程
前端·javascript·面试
前端小巷子5 小时前
Vue脚手架模式与环境变量
前端·vue.js·面试
小厂永远得不到的男人15 小时前
java 面试八股这一篇就够之java集合篇
面试·程序员
牛客企业服务15 小时前
AI面试系统助手深度评测:6大主流工具对比分析
数据库·人工智能·python·面试·职场和发展·数据挖掘·求职招聘