☰
常见Powershell指令和DOS指令
2026/10/7 2:43:46 网站建设 项目流程

常见Powershell指令和DOS指令

信安大二上,正入门学习操作系统,老师让我们熟悉常规PowerShell指令和DOS指令,遂记录所学内容,做好知识管理第一步。
我让DeepSeek为我设计了几道题目, 便于我巩固知识点。

PowerShell常见指令

. Alias vs 真实命令
PowerShell 为了照顾 Linux 和 CMD 用户的习惯,内置了许多别名。但在写脚本时,强烈建议使用官方全称,以避免歧义并提高可读性。

常用别名官方全称(推荐在脚本中使用)作用
pwdGet-Location获取当前工作目录
cdSet-Location切换目录
ls/dirGet-ChildItem列出目录内容
echoWrite-Output输出文本或对象到管线
catGet-Content读取文件内容
cpCopy-Item复制文件或目录
mvMove-Item移动或重命名文件
rmRemove-Item删除文件或目录

👉 学习技巧:在终端输入 Get-Alias ls,即可查看 ls 背后的真实命令。

输出与重定向符号:> 和 >>

>(覆盖写入):像推土机。执行时先清空目标文件原有的所有内容,再写入新内容。 >>(追加写入):像流水账。保留目标文件原有的内容,把新内容写到文件的最末尾。 .\ 是 PowerShell 中非常基础且极其重要的一个符号。它翻译过来就是:“当前目录下的”。

. \ 的含义

.(点):代表当前目录(Current Directory)。 \(反斜杠):是 Windows 系统里的路径分隔符。

所以,.\task1.ps1 的意思就是:“运行当前目录下的 task1.ps1 这个文件”。

注意区分:

Write-Host 只能把文本打印到终端屏幕,不能被重定向到文件;而 Write-Output(即 echo)会被送入管道,可以被 > 和 >> 写入文件。
3. 面向对象输出带来的“困扰”

PowerShell 经常会有大量输出。比如输入 Get-Date 或 Get-Location,终端会输出几百行类似 DisplayHint : DateTime、PSPath : Microsoft.PowerShell.Core\FileSystem::… 的属性列表。

原因:PowerShell 是基于 .NET 的面向对象语言,返回的是一个“对象”。 如何只提取关键信息? 使用点属性或格式化输出: powershell (Get-Location).Path # 只输出路径字符串 (Get-Date).ToString("yyyy-MM-dd") # 只输出日期字符串

代码练习:

#1.pwdGet-Date#2.mkdir os_lab cd os_lab#3.dir#4.echo"Welcome to OS lecture"#5.echo'Hello World'>.\fqb.txt#6.echo'Hello'>.\fqb.txt#7.cat.\fqb.txt#8.cpfqb.txt fqb2.txt#9.mvfqb2.txt fqb3.txt#10.rmfqb3.txt#11.dir>.\filelist.txtdir>>.\filelist.txt

踩坑记录

坑 1:VS Code 里的黄波浪警告

写 pwd 时,VS Code 提示:‘pwd’ is an alias of ‘Get-Location’. Alias can introduce possible problems and make scripts hard to maintain.

原因:VS Code 的 PowerShell 插件自带代码质检员(PSScriptAnalyzer),建议在脚本中避免使用别名。 解决:新建一个 PSScriptAnalyzerSettings.psd1 配置文件并在 VS Code 中配置路径,或者直接改成全称(推荐初学者直接用全称)。

坑 2:套娃文件夹 (os_lab\os_lab\os_lab…)

运行脚本几次后,我发现路径变成了practice\os_lab\os_lab\os_lab...。

原因:脚本缺乏“幂等性”。每次运行都会无条件执行 mkdir os_lab 和 cd os_lab。如果不退出当前目录就再次运行,就会在现有文件夹里再建一个同名文件夹。 解决:在创建文件夹前加判断,并使用绝对路径: powershell $labPath = "C:\Users\你的用户名\Desktop\practice\os_lab" if (!(Test-Path $labPath)) { New-Item -ItemType Directory -Path $labPath } Set-Location $labPath

#1.echo8 5 3 7|measure-object-Sum-Max-Min-Average#2.echo'Hello World'|Measure-Object-Property Length-Sum#3.$filePath="C:\Users\15808\Desktop\practice\filelist.txt"if(Test-Path$filePath){Get-Content$filePath|Measure-Object-Property Length-Average}else{Write-Warning"the filelist.txt can not be found."}#4.echo'Hello World'|Out-FileFilePath.\hello.txt#5.echo'Welcome to OS'|Out-FileFilePath.\hello.txt-Append#6.ls|sortWrite-Host"task2 is finished."

本次任务最终跑通的命令涵盖了 PowerShell 最常用的几个核心模块。

1. 数据输出与管道

指令/符号作用示例
echo(Write-Output)将内容输出到屏幕或管道echo 8 5 3 7
|(管道)把前一个命令的输出,作为后一个命令的输入echo 8 5 3 7 | Measure-Object
裸引号直接输出字符串(PowerShell 特性,等价于 echo)'Hello World' | Out-File hello.txt

2. 统计与测量

指令作用示例
Measure-Object测量对象的数值属性(体检员)-Sum(和),-Maximum(最大),-Minimum(最小),-Average(平均),-Property Length(测量长度)

3. 文件读写与目录管理

指令作用示例
Test-Path判断文件/文件夹是否存在(常用于容错)if (Test-Path $FilePath) {...}
Get-Content读取文件内容(按行拆成字符串对象)Get-Content "filelist.txt"
Out-File将输出写入文件-FilePath(指定路径),-Append(追加模式), 默认覆盖
ls(Get-ChildItem)列出当前目录内容ls -Exclude "*.txt"
sort(Sort-Object)对输入对象进行排序ls | sort

4. 辅助工具

指令作用
cd ../cd 文件夹切换当前工作目录
pwd查看当前终端的完整路径
Select-Object挑选对象的特定属性,常用-ExpandProperty提取纯字符串
Remove-Item删除文件或文件夹

#任务 3:变量与算术(对应文件第 5、6 节)#目标:掌握变量 $、单双引号、算术运算和数组。#要求:新建 task4.ps1,完成:#1.定义变量 $name="你的名字",$port=8081。$name="你的名字"$port=8081#2. 定义 $today="Thursday"。$today="Sunday"#3.分别用单引号和双引号输出 'Today is $today' 和 "Today is $today",观察区别。'Today is $today'"Today is$today"#4. 定义变量 $v1="the covid in guangzhou",赋值给 $v2,并输出 $v2。$v1="the covid in guangzhou"$v2=$v1$v2#5. 计算 6/2 和 6/25,观察整数和浮点数的区别。6/2 6/25#6. 定义 $x=2,$y=4。计算 $x+$y、$x*$y、$x/$y。$x= 2$y= 4$x+$y$x*$y$x/$y#7.定义一个数组 $v=1,2,3,输出它。$v=1,2,3,4$v

一、 核心语法点总结表(查字典必备)

为了方便查阅,我将本次脚本涉及的语法点整理成了下表:

类别语法点 / 符号作用代码示例
核心CmdletGet-Process获取系统当前运行的所有进程对象。Get-Process
核心CmdletStop-Process结束一个或多个进程。Stop-Process -Name notepad
核心CmdletWrite-Host向控制台打印输出文本,常配合颜色参数美化终端。Write-Host "Hello" -ForegroundColor Green
核心CmdletWhere-Object过滤命令,从管道传过来的集合中筛选符合条件的对象。... | Where-Object { $_.Id -eq 123 }
核心CmdletFormat-Table格式化输出,将对象以表格的形式展示指定属性。Get-Process | Format-Table Name, Id
管道与对象|(管道符)将左边命令的输出结果(对象),作为右边命令的输入。Get-Process | Stop-Process
管道与对象$_当前对象,在Where-Object的脚本块{ }中代表当前处理的对象。Where-Object { $_.ProcessName ... }
管道与对象.(点号)属性访问符,用于获取对象的某个属性值。$_.ProcessName(获取进程名)
变量与运算符$变量赋值符,用于将数据存入变量。$procs = Get-Process
变量与运算符-like模糊匹配运算符,配合通配符*使用。$_.ProcessName -like "*notepad*"
流程控制if...else条件分支语句,根据条件真假执行不同代码块。if ($procs) { ... } else { ... }
参数与细节-Force强制参数,忽略系统确认提示直接执行。Stop-Process -Force
参数与细节`n反引号+n,字符串中的换行转义字符。Write-Host "第一行`n第二行"
参数与细节.\执行当前目录脚本的路径前缀。.\task5.ps1

疑惑 :为什么在 VS Code 里执行会突然报错connect ETIMEDOUT?

问题重现:在 VS Code 运行脚本时,弹出错误窗口:connect ETIMEDOUT \\\\.\pipe\PSES_xxx,脚本无法继续运行。
原因排查:这不是脚本代码写错了!这是 VS Code 的 PowerShell 扩展进程与后台的 PowerShell 编辑器服务(PSES)之间的命名管道(Named Pipe)通信超时了。

#1.Get-Process#2,#3.$process=Get-Process|Where-Object{$_.ProcessName-like'*notepad*'}if($process){Write-Host"the notepad has been found."-ForegroundColor Green$process|Format-TableProcessName,Id,CPU-AutoSize$process|Stop-Process-Force}else{Write-Host"the notepad can not be found."}

#目标:一次性掌握 if、switch、while、do until、for、foreach。#要求:新建 task5.ps1,把下面所有控制语句写在一个脚本里(用 Write-Host 打印提示词分隔不同结构):#1.if:定义一个变量 $score = 85。如果大于 90 输出 "A",如果大于 80 输出 "B",否则输出 "C"。(使用 -gt)。$sorce=85if($sorce-gt90){Write-Host"A"}elseif($socre-gt80){Write-Host"B"}else{Write-Host"C"}#2. switch:定义 $day = "Monday",用 switch 输出对应中文“星期一”。$day="Monday"switch($day){"Monday"{Write-Host"output xingqiyi"}default{Write-Host"output unknow"}}#3. while:用 while 循环输出 1 到 5。$i=1while($i-le5){Write-Host$i$i++}#4. do until:用 do until 循环输出 1 到 3(条件是大于 3 时停止)。$j=1do{Write-Host$j$j++}until($j-gt3)#5. for:用 for 循环倒计时输出 5 到 1。for($k=5;$k-ge1;$k--){Write-Host$k}#6. foreach:定义一个数组 $fruits = "Apple", "Banana", "Orange",用foreach遍历输出。$fruits="Apple","Banana","Orange"foreach($fruitin$fruits){Write-Host$fruit}

📌 六大控制结构核心语法表

结构名称语法格式核心特点适用场景精简示例
if / elseif / elseif (条件) { ... }
elseif (条件) { ... }
else { ... }
互斥执行,一旦满足即跳出条件分支判断if ($score -gt 90) { "A" }
switchswitch ($变量) {
"匹配值" { ... }
default { ... } }
多值精确匹配(支持通配符/正则)多固定值判断switch ($day) { "Monday" { "星期一" } }
whilewhile (条件) { ... }先判断,后执行,可能一次都不执行未知次数的循环while ($i -le 5) { $i++ }
do untildo { ... } until (条件)先执行,后判断,至少执行一次必须执行一次的场景do { $j++ } until ($j -gt 3)
forfor (初始化; 条件; 迭代) { ... }计数循环,控制最灵活已知循环次数/倒计时for ($k=5; $k -ge 1; $k--) { ... }
foreachforeach ($元素 in $集合) { ... }自动遍历集合,无需索引遍历数组/集合foreach ($f in $fruits) { ... }

PowerShell 特有运算符对照表

PowerShell不使用>、<、==等符号,而是使用字母组合,这是写脚本时最容易踩坑的地方。

逻辑含义PowerShell 运算符其他语言常见写法示例
大于-gt(Greater Than)>$score -gt 90
大于等于-ge(Greater or Equal)>=$i -ge 1
小于-lt(Less Than)<$i -lt 5
小于等于-le(Less or Equal)<=$i -le 5
等于-eq(Equal)==$day -eq "Monday"
不等于-ne(Not Equal)!=$day -ne "Monday"


functionGreet-User{param([string]$Name,[int]$Age)Write-Output"Hello$Name, you are$Ageyears old."}
  • 在函数内部,使用 param() 块来声明该函数可以接收哪些参数。注意:param() 块必须是函数体内的第一个语句。
  • PowerShell 是弱类型语言,但为了代码的健壮性,强烈建议在 param() 块中为参数指定数据类型(如 [string]、[int]、[bool] 等)
  • 在输出字符串时,使用双引号 " " 可以实现变量替换。

“Hello $Name”:PowerShell 会自动将 $Name 替换为变量实际的值。
(注意:如果使用单引号 ’ ',则不会进行变量替换,会原样输出 $Name)

  • 用函数时,可以直接按顺序传递参数(位置参数),也可以指定参数名传递(命名参数,推荐写法,可读性更高)。

位置传参:Greet-User “张三” 20
命名传参:Greet-User -Name “张三” -Age 20

  • 在函数中输出结果,推荐使用 Write-Output(可以省略不写,直接写变量或字符串,默认就是输出到管道)。这与 Write-Host 不同,Write-Output 会将对象写入管道,方便后续脚本进行二次处理(例如 | Out-File 写入文件)

DOS常见指令

Shell 实验指令与脚本汇总

一、指令知识点总表

类别指令 / 语法作用示例对应题目
文件系统dir列出目录内容dir任务 1
文件系统dir /s递归列出子目录内容dir /s任务 1
文件系统dir /p分页显示dir /p任务 1
文件系统dir /?查看命令帮助dir /?任务 1
文件系统cd切换目录cd D:\Lecture任务 1
文件系统cd ..返回上级目录cd ..任务 1
屏幕cls清屏cls任务 1
中断Ctrl + C停止当前命令dir /s后按任务 1
批处理@echo off关闭命令回显@echo off任务 2
批处理REM注释REM 这是注释任务 2
输出echo输出字符串echo Hello任务 2、3
输出echo.输出空行echo.任务 2、3
参数%1第一个参数echo %1任务 2、3、4、5、6、7
参数%2第二个参数tasklist /FI "PID le %2"任务 6
文件筛选DIR %1\*.txt列出指定目录 txt 文件DIR %1\*.txt任务 3
文件筛选DIR %1\*.pdf列出指定目录 pdf 文件DIR %1\*.pdf任务 3
条件IF条件判断IF "%1"=="1" echo ...任务 4
条件IF NOT反向判断IF NOT "%1"=="3" echo ...任务 4
条件IF ... ELSE IF ... ELSE多分支判断IF "%1"=="" (...) ELSE ...任务 6
变量SET设置变量SET end=%1任务 5
循环FOR /L %%G IN (1,1,%1) DO计数循环FOR /L %%G IN (1,1,10) DO echo %%G任务 5
进程tasklist列出进程tasklist任务 6、7
进程tasklist /FI "PID ge %1"过滤 PID >= 参数tasklist /FI "PID ge 100"任务 6
进程tasklist /FI "PID le %2"过滤 PID <= 参数tasklist /FI "PID le 500"任务 6
进程tasklist /FI "PID lt %1"过滤 PID < 参数tasklist /FI "PID lt 1000"任务 7
Linux#!/bin/bash指定 Bash 解释器#!/bin/bashLinux 实验
Linuxchmod +x添加执行权限chmod +x cpu_usage.shLinux 实验
Linux./脚本.sh运行脚本./cpu_usage.shLinux 实验
Linuxps -eo自定义进程输出列ps -eo pid,user,%cpu,%mem,commLinux 实验
Linux--sort=-%cpu按 CPU 降序排序ps ... --sort=-%cpuLinux 实验
Linuxawk文本过滤awk 'NR==1 || $3 > 0.0'Linux 实验
LinuxNR==1保留标题行awk 'NR==1 ...'Linux 实验
Linux$3 > 0.0第三列大于 0.0awk '$3 > 0.0'Linux 实验

二、DOS / CMD 题目脚本

@echo off REM scriptname: myname.bat REM scriptfunction: display basic batch processing commands, receive parameters and output REM creatingdate: 2026-9-21 echo myname.bat is now running echo. echo Hello %1!

—

@echo off REM 1.output script running prompt echo Listing files under diectory %1 ... REM 2.output a blank line echo. REM 3.list %1\*.txt dir "%1\*.txt" REM 4.output a blank line echo. REM 5.list %1\*.pdf dir "%1\*.pdf" pause

@echo off IF "%1"=="" ( echo Usage: testif 1/2/3 exit /b ) REM IF statement that must be used IF "%1"=="1" echo you enter 1 IF "%1"=="2" echo You enter 2 IF NOT "%1"=="3" echo It was not 3!!!

@echo off REM assign the first passed parameter to the variable 'end' SET end=%1 FOR /L %%G IN (1,1,%end%) DO echo repetition n. %%G

@echo off echo Processes with PID within a given range echo. if "%~1"=="" ( REM without parameters:print all processes tasklist ) else if "%~2"=="" ( REM with a parameter: print PID >= parameter1 process tasklist /FI "PID ge %1" ) else ( REM with 2 parameters: print PID >= parameter1 and PID <= parameter2 process tasklist /FI "PID ge %1" /FI "PID le %2" )

@echo off if "%~1"=="" ( echo [usage] printpid.bat [PID upper limit] echo [default]no parameter provided ,using default upper limit 1000 set "limit=1000" )else ( set "limit=%~1" ) tasklist /FI "PID lt %limit%"

2026年9月27号,我在大二上学期写下了人生的第一篇博客,我想把他作为我知识管理的工具,培养输出型习惯。格式上会比较没有章法,会慢慢找到自己的风格。作为双非信安,虽然自己起步较晚,玩了一年。但我的梦想依旧滚烫,我仍然会朝着自己的理想不断前进!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询