【Shell】探究Windows命令行工具:CMD vs PowerShell

今天,田辛老师给大家聊一聊Windows操作系统中的两个命令行工具——CMD和PowerShell的区别。

田辛老师最开始学习计算机, 大概是1988年,当时还是DOS2.0的系统。从1988用到现在, 可以说对命令行窗口还是很熟悉,也很有感情的。

首先,我们可以说, CMD是Windows操作系统中传统的的命令行工具。对于程序员来说, 或者是一些专业的用户。 CMD能够解决绝大多数问题。而PowerShell——作为微软公司推出的新一代命令行工具。相比于CMD,PowerShell更加强大、灵活,支持更多的命令和功能。

1 语法不同

CMD的语法比较简单,命令和参数之间用空格隔开。而PowerShell的语法更加灵活,支持使用管道符、变量、循环等高级语法。

例如,我们想要在CMD中查找某个文件夹下的所有文件,可以使用dir命令:

dir C:\Users\田辛老师\Desktop\

这个命令很简单, 咱们就不显示输出结果了。 而在PowerShell中,我们可以使用Get-ChildItem命令,并通过管道符和Where-Object命令筛选出我们需要的文件。我们看一下这个命令:

Get-ChildItem C:\Users\田辛老师\Desktop\ | Where-Object {$_.Extension -eq ".txt"}

你会发现,这个命令就是检索C:\Users\田辛老师\Desktop\文件夹里面的所有txt文件。似乎也没比dir命令厉害多少。

那么,田辛老师再举一个例子:直接输出json。这大概会让你感觉到Powershell的功能的灵活之处。

PS D:\software\cmder
λ Get-ChildItem -Path "E:\sample\python\FX_ProjectManager\images" -Recurse -File | Select-Object Name, FullName, Length, CreationTime, LastWriteTime | ConvertTo-Json | Out-File "d:\filelist.json"

PS D:\software\cmder
λ

输出的JSON文件内容:

[
    {
    
    
        "Name":  "main_window.jpeg",
        "FullName":  "E:\\sample\\python\\FX_ProjectManager\\images\\main_window.jpeg",
        "Length":  25238,
        "CreationTime":  "\/Date(1677227829985)\/",
        "LastWriteTime":  "\/Date(1677227829985)\/"
    },
    {
    
    
        "Name":  "new_project.jpeg",
        "FullName":  "E:\\sample\\python\\FX_ProjectManager\\images\\new_project.jpeg",
        "Length":  10107,
        "CreationTime":  "\/Date(1677227829985)\/",
        "LastWriteTime":  "\/Date(1677227829985)\/"
    }
]

这里,田辛老师简单总结一下对比dir命令,Get-ChildItem 命令的优势:

  • 更加灵活的筛选功能:Get-ChildItem命令支持使用通配符、正则表达式等方式进行文件筛选,可以更加灵活地查找指定类型的文件。
  • 支持对象管道:Get-ChildItem命令的输出可以作为其他命令的输入,从而实现更加灵活的操作。
  • 支持多种输出格式:Get-ChildItem命令支持多种输出格式,包括列表、表格、XML、JSON等,可以根据需要选择不同的输出格式。
  • 支持递归查找:Get-ChildItem命令支持递归查找子目录中的文件,可以一次性查找整个目录树。
  • 支持显示文件属性:Get-ChildItem命令可以显示文件的属性,包括文件大小、创建时间、修改时间等,可以帮助用户更好地了解文件的信息。

总的来说,Get-ChildItem命令比dir命令更加强大、灵活,适合进行复杂的文件查找和操作。

二、支持代码块

PowerShell支持代码块,这意味着我们可以将多个命令组合在一起,形成一个代码块,然后一次性执行。这样可以提高效率,减少输入命令的次数。

例如,我们想要在CMD中创建一个文件夹,并在其中创建一个文本文件,可以使用以下命令:

mkdir C:\Users\田辛\Desktop\test
cd C:\Users\田辛\Desktop\test
echo "Hello World" > test.txt`

而在PowerShell中,我们可以使用代码块的方式,将这三个命令组合在一起:

{
    
     New-Item -ItemType Directory -Path D:\田辛老师\ Set-Location D:\田辛老师\ Add-Content -Path test.txt -Value "Hello World" }

当然,代码块操作也会非常灵活:

# 创建新的脚本块 # 创建新的脚本块
$block = {
    
    
  $write = Get-Process |Select-Object -First 1 
  "$($write.Name) 占用内存: $($write.WorkingSet/1mb) MB"
}

$block.GetType().Name

& $block
   
# 使用NewScriptBlock方法创建脚本块:
$blockStr = '$write=Get-Process |Select-Object -First 1 
  "$($write.Name) 占用内存: $($write.WorkingSet/1mb) MB"'
$block = $executioncontext.InvokeCommand.NewScriptBlock($blockStr)
$block.GetType().Name
& $block

执行结果为:

PS D:\software\cmder
λ d:\1.ps1
ScriptBlock
AggregatorHost 占用内存: 6.90625 MB
ScriptBlock
AggregatorHost 占用内存: 6.90625 MB

三、支持对象管道

PowerShell支持对象管道,这意味着我们可以将一个命令的输出作为另一个命令的输入,从而实现更加灵活的操作。

例如,我们想要在CMD中查找某个文件夹下的所有txt文件,并将它们复制到另一个文件夹中,可以使用以下命令:
`xcopy C:\Users\田辛\Desktop\test*.txt C:\Users\田辛\Desktop\backup\

而在PowerShell中,我们可以使用对象管道的方式,将Get-ChildItem命令的输出作为Copy-Item命令的输入:
`Get-ChildItem C:\Users\田辛\Desktop\test*.txt | Copy-Item -Destination C:\Users\田辛\Desktop\backup\

以上就是CMD和PowerShell的一些区别。总的来说,PowerShell更加强大、灵活,

猜你喜欢

转载自blog.csdn.net/u013589130/article/details/129573557