简介:这是一份面向Photoshop初学者的计算机图形与图像处理基础简答题文档,适合用于课程复习、考前突击或基础补漏,能帮助快速掌握常考理论。整个资源包仅含1个PDF文档,大小约127KB,以问答形式完整收录了八类高频考点。内容涵盖矢量图与位图的特点、路径的理解与特点、三种蒙版(快速蒙版/图层蒙版/矢量蒙版)的类型与应用、CMYK与RGB色彩模式的区别、羽化的原理及实现方式、计算机图形与图像的概念与研究对象等,同时针对图像处理中利用通道和滤镜抽出命令选择秀发给出了具体思路,并结合实例说明图层合并的三种命令含义。目前已有51人学习浏览。文档结构紧凑、条目清晰,不仅列出答案要点,还附带原理说明与操作细节,适合作为PS理论知识的速查手册与简答题复习提纲,便于反复查阅和记忆。
1. 从PS简答题看PowerShell的考点分布
上一任同事离职前留下一份《PS简答题 (2).pdf》,几十页的文档里全是PowerShell的问答,从变量作用域一直问到远程作业状态。我刚拿到手以为是面试背诵手册,翻了几天才发现:这些简答题根本不是靠记忆就能过关的,每道题背后都连着一条命令、一个参数的边界。比如“说说$Error和ErrorAction的区别”这种题,如果你只答“前者是变量后者是参数”,下一句准被追问“那非终止错误和终止错误怎么在脚本里区分”。这份文档真正有价值的地方,是把PowerShell的执行模型按“对象-管道-脚本-作业”拧成了一根线。本文就顺着这条线,把简答题里最常考的4个技术点拆开,从原理讲到命令,再给你能跑起来的验证方式。适合准备运维或开发面试的读者,也适合打算把新人按场景训练的老手。
2. 管道与对象——PS简答题中最容易被问倒的原理题
2.1 为什么PowerShell是对象管道,而不仅是文本管道
简答题里有个必考题:“PowerShell管道和CMD管道有什么区别?”最标准的答案是:CMD管道传的是字符串,PowerShell管道传的是对象。但你要是没亲手验证过,这句话背出来也是虚的。我一般会让对方做一个小实验:
# 查看进程,并尝试输出进程名和CPU时间 Get-Process | ForEach-Object { "$($_.ProcessName): $($_.CPU)" }如果这是文本管道,Get-Process输出的表格内容要被字符串解析,$_取到的就是一行文本,根本没机会访问.CPU属性。但因为PowerShell在管道里传递的是.NET对象,每个进程对象自带ProcessName、CPU、WorkingSet等属性,后续命令才能直接访问。这条命令的关键点是$_代表管道中当前对象,$()是子表达式,把对象的属性值插值到字符串里。
参数说明:ForEach-Object是处理管道对象的循环cmdlet,它的$_是当前管道对象,只能用于管道表达式内部。如果你在脚本其他地方想引用某个变量,应该用普通变量名而不是$_,这是简答题里很容易挖的坑。
2.2 “表达式”与“变量”简答题背后的解析规则
题目里还常考“$null和空字符串的差别”,有人答“都是空”,其实在布尔判断里差别极大。PowerShell的变量解析规则是:未定义的变量输出$null,但$null在管道中和空字符串的处理方式不同。看这段:
if ($null -eq $undefinedVariable) { "变量未定义,且为空" } if ("" -eq $null) { "空字符串等于null" } else { "空字符串不等于null" }第一段会输出“变量未定义,且为空”,因为未定义变量在比较时等同于$null;第二段会输出“空字符串不等于null”,因为空字符串是System.String对象,它和DBNull不是同一回事。简答题的正确答案是“用IsNullOrEmpty判断变量是否为空,不要直接用-eq $null”。
这里有个高频考点:比较时要把$null放在左边。如果写成$undefinedVariable -eq $null,某些情况下会被误认为给变量赋值,导致判断结果失真。这是PowerShell一个经常被吐槽的设计,但面试官就爱问。
下面这张表列出几个容易混淆的自动变量和常量,简答题里出现频率极高:
| 名称 | 含义 | 常见误区 |
|---|---|---|
$null | 空值对象 | 与空字符串、0混为一谈 |
$? | 上一条命令执行状态 | 误当成$LASTEXITCODE |
$_ | 当前管道对象 | 在函数内部当作$args使用 |
$args | 脚本/函数的参数数组 | 不再是数组,却当数组索引 |
2.3 管道中参数绑定的三道常见简答题
第一道:“Get-Process | Stop-Process为什么能生效?”第二道:“Get-Service | Where-Object { $_.Status -eq 'Running' }和Get-Service | Where-Object Status -eq 'Running'有什么区别?”第三道:“Export-Csv -NoTypeInformation里的-NoTypeInformation是什么作用?”
这三道题都指向参数绑定。PowerShell管道传递的是对象,但对象不会自动变成下一个命令的所有参数,它只会转换为目标命令支持“输入管道”的参数。Stop-Process有一个-Id或-InputObject参数可以接收进程对象,所以Get-Process的输出能直接绑定。而Where-Object的两种写法差异在于:第一种是脚本块写法,每一次管道对象都执行一次判断;第二种是简化语法,等价的属性名和操作符由PowerShell自动拼接。
-NoTypeInformation控制Export-Csv输出时是否包含类型头#TYPE ...,默认不写反而在旧版是关闭的,新版给了一个开关。简答题里考的是“为什么要加这个参数”,答案是为了避免CSV文件多一行非数据行,影响后续导入数据库。
这三道题合在一起的结论是:管道的价值在于“类型感知”,但你要知道每个cmdlet的输入参数长什么样,否则对象传过去对不上,就会被当成未知参数抛出错误。
3. 脚本与函数——用简答题的方式拆解PowerShell脚本边界
3.1 脚本参数写的对不对,简答题怎么考
常见的简答题是“给一个脚本的param块挑错”。比如:
param( [string]$Name = "world", [int]$Count, [switch]$Force ) Write-Host "Hello $Name"这道题有三个考点:一是$Name有默认值,调用时.\script.ps1 -Name "PS"可以覆盖;二是$Count是整数,如果传入字符串"abc"会触发参数类型转换错误;三是[switch]类型的参数是布尔开关,不需要赋值,命令行里写了-Force就是true,不写就是false。
参数说明:[string]、[int]是强类型约束,$Count未传入时默认是$null而不是0,所以脚本里要自己初始化。[switch]不是真正布尔值,它是个开关类型,支持-Force:$true这种显式写法,但多数人只写-Force。
还有一个经常被问到的点是参数集(ParameterSetName)。如果脚本既要支持文件路径,又要支持文件夹批量处理,参数集用来区分组合。比如:
param( [Parameter(ParameterSetName = "File")] [string]$FilePath, [Parameter(ParameterSetName = "Folder")] [string]$FolderPath )如果你不带-FilePath也不带-FolderPath,PowerShell会因为两个参数集都不匹配而报错:无法确定参数集。简答题的答案不是“参数没填”,而是“使用参数集时必须至少满足一个参数集的约束”。
3.2 作用域与函数返回值:简答题里的经典跑分题
函数返回值在PowerShell有一个反直觉的规则:所有都输出到输出流,而不一定是return后面的内容。看这段代码:
function Get-TimeInfo { $format = "yyyy-MM-dd HH:mm:ss" Get-Date -Format $format return "done" }调用Get-TimeInfo会输出两行:第一行是格式化后的时间,第二行是done。因为函数内部所有未捕获的输出都会传到调用方。简答题经常问“为什么一个函数返回了多个值”,答案就在这。如果只想保留return的结果,需要把中间输出赋给变量或加| Out-Null。
作用域的考点是$global、$script和$local。比如:
$message = "outer" function Show-Message { $message = "inner" "function sees: $message" } Show-Message "script sees: $message"这里输出两行,第一行是function sees: inner,第二行是script sees: outer。因为函数内部默认创建局部变量,修改不了脚本作用域的$message。如果想让函数修改脚本级变量,要用$script:message:
$message = "outer" function Set-ScriptMessage { $script:message = "inner" } Set-ScriptMessage $message简答题的底层逻辑是:PowerShell的作用域是动态的,读取时找不到会向父作用域查找,写入时默认只在当前作用域创建新变量。这个特点经常被拿来考“为什么我的函数改了变量却对外面无效”。
3.3 错误处理:Try/Catch和$Error简答题实操
PowerShell错误分两类:终止错误和非终止错误。Try/Catch只能捕获终止错误,而非终止错误要用-ErrorAction Stop转成终止错误才能捕获。简答题里最经典的写法是:
try { Remove-Item -Path "C:\nonexistent.txt" -ErrorAction Stop } catch { "捕获到错误: $($_.Exception.Message)" }Remove-Item默认对不存在的文件输出非终止错误并继续执行,如果不加-ErrorAction Stop,catch块根本不会运行。这个知识点在脚本里特别重要:批处理任务中某个文件删除失败不能中断整个脚本,但你又想在日志里记录这个失败信息。正确手法是对单条命令设置-ErrorAction Stop,再包一层Try/Catch。
$Error是一个数组,保存的是脚本会话中所有错误记录。简答题会问“$Error[0]和$Error.Clear()的用法”,你只要知道$Error是集合,索引0是最新错误,清除后不能恢复即可。还有一个陷阱:脚本执行完,其他地方产生的非终止错误也会混入$Error,所以排查时要打印$Error[0].Exception而不是单纯输出$Error。
4. 远程与作业——简答题里藏着的高频参数和踩坑点
4.1 Invoke-Command的隐藏细节
远程简答题最常出现的命令是Invoke-Command,它把本地脚本块发送到远程机器执行。常见做法是:
$cred = Get-Credential Invoke-Command -ComputerName "server01" -Credential $cred -ScriptBlock { Get-Process | Sort-Object CPU -Descending | Select-Object -First 5 }这个命令有几个必知参数。-ComputerName是远程机器名,可以是数组,实现批量查询;-Credential指定凭据对象,一般通过Get-Credential交互获取;-ScriptBlock是要远程执行的代码块。关键的参数还有-ThrottleLimit,控制并发执行数量,默认是32,如果同时操作上百台机器,这个值可能需要调到64或更低,否则网络和远程机器压力很大。
下面这张表是远程命令面试题里经常出现的参数对比:
| 参数名 | 作用 | 注意点 |
|---|---|---|
-ComputerName | 目标机器集合 | 本机也走远程协议,必须启用WinRM |
-Session | 复用持久连接会话 | 比ComputerName更高效,无重复握手 |
-ThrottleLimit | 同时执行的最大机器数 | 过大会占用过多WinRM端口,报WS-Management错误 |
-ErrorAction | 处理命令错误 | 远程机器不可达时属于终止错误 |
简答题里有个经典误用:直接把Get-Process作为-ComputerName的参数值,以为它会循环每个进程。实际上-ComputerName只接受机器名,不会自动把前面的进程输出变成机器名。要用Get-Content servers.txt读取机器名列表。
4.2 后台作业的四个状态与等待参数
后台作业解决的是长时间任务不能阻塞控制台的问题。常用的三个命令是Start-Job、Wait-Job、Receive-Job。比如:
$job = Start-Job -ScriptBlock { Start-Sleep -Seconds 3 "job finished" } Wait-Job $job $result = Receive-Job $job Remove-Job $jobStart-Job创建一个后台进程,返回一个Job对象。作业状态包括Running、Completed、Failed和Blocked,你要用Get-Job查看状态。Wait-Job默认等待所有作业完成,没有超时参数,如果脚本卡死你只能手动Ctrl+C。更稳的写法是加-Timeout:
Wait-Job $job -Timeout 10 if ($job.State -eq 'Running') { Stop-Job $job }这里-Timeout单位是秒,时间到了作业还未完成就返回。收到结果后一定要Remove-Job清理,否则作业对象会一直留在会话里占内存。简答题常问“为什么作业返回的结果不是真实类型”,这就要说到下一节的序列化问题。
4.3 远程命令中的反序列化陷阱
远程拿回来的对象不是真实对象,这一点是简答题里最高级的考点。看下面的例子:
$session = New-PSSession -ComputerName "server01" $result = Invoke-Command -Session $session -ScriptBlock { Get-Item "C:\temp.json" } $result.GetType().Name你会发现类型名不是FileInfo而是Deserialized.Microsoft.Management.Infrastructure.CimInstance。因为PowerShell远程传输时会把对象序列化,只保留属性和简化方法,真实方法全部丢失。所以在本地能调的.Open()、.ReadToEnd()等方法,在远程结果上不存在。
这个陷阱的应对方案是在远程脚本块内部完成所有处理,只把最终结果传回来。例如:
Invoke-Command -Session $session -ScriptBlock { $content = Get-Content "C:\temp.json" -Raw return $content.Length }把文件内容长度传回本地,而不是传回文件对象。简答题考查的就是你是否理解“序列化对象只有属性,没有方法”这一层。
5. 用自测脚本把PS简答题变成肌肉记忆
5.1 把简答题变成Pester测试用例
与其反复翻PDF背答案,不如把题目变成可执行的验证脚本。PowerShell的测试框架叫Pester,常见做法是给每条简答题写一个断言。比如验证“空字符串不等于$null”:
Describe "PS简答题验证 - null与空字符串" { It "空字符串和null不相等" { "" | Should -Not -Be $null } It "未定义变量等于null" { $undefined = $null $undefined | Should -Be $null } }Pester的Should -Be、Should -Not -Be直接把结论变成可自动执行的测试。这样你背一题就测一题,连参数写没写对都能知道。建议把这些测试文件放在tests/目录,每次修改脚本后跑一遍,相当于给简答题做了一个回归测试。
5.2 用“提示类型”快速复盘简答题
最后一招是给自己建一个“提示类型表”:每个简答题不是背原文,而是记它的输入、输出、边界和副作用。比如“管道绑定”的核心提示是“对象能绑定到命令的输入参数”,“作业”的核心提示是“返回序列化对象无方法”。你可以在终端里定义一个函数来触发提示:
function Show-PSTip { param([string]$Topic) $tips = @{ pipeline = "对象传递,用属性名访问" scope = "读取向上找,写入本层建" remote = "传回的是序列化对象" } $tips[$Topic] } Show-PSTip remote这样每次想不起某个点时,敲一个关键词就能唤起记忆。PDF里的简答题再多,最终都会被拆解成几个核心模式,而验证这些模式是否真的理解,只看你能否在没有参考文档的情况下写出一个能跑的命令。这是比背诵更可靠的积累方式。
本文还有配套的精品资源,点击获取