最近基于客户需求,研究了一下Windows自带的脚本运行环境——Powershell。由于之前有项目研究过一段时间Windows Cmd的使用方法,这次就在此基础上简要论述。
一、PowerShell介绍
Powershell 是运行在windows机器上实现系统和应用程序管理自动化的命令行脚本环境。你可以把它看成是命令行提示符cmd.exe的扩充,不对,应当是颠覆。 powershell需要.NET环境的支持,同时支持.NET对象。微软之所以将Powershell 定位为Power,并不是夸大其词,因为它完全支持对象。其可读性,易用性,可以位居当前所有shell之首。( PS:个人认为比起Bash,Powershell命令真的很难记)
(Ps:Cmd和Powershell都是贴近操作系统的编程语言,如果是大量的应用开发建议使用Python)
二、PowerShell的使用
由于网上存在大量关于Powershell的介绍和使用文章,笔者就不再此处赘述,仅推荐Microsoft.PowerShell的官方文档,地址如下:PowerShell文档
出于对准确性和版本更迭等问题的考虑,建议阅读最新文档,如果存在语言障碍或者读起来实在是头疼,可以去找相关的翻译文档或者在必应上搜一下相关部分参照阅读,以此保证不会出现谬误。
三、PowerShell脚本编辑器
作为Windows下属的一种脚本语言,有多种工具支持PS语言的查看,编辑及调试运行,下面就不一一介绍,仅提出两种以供参考和选择。
1.Windows PowerShell ISE介绍
Windows PowerShell 集成脚本环境 (ISE) 是 Windows PowerShell 的主机应用程序。 在 ISE 中,可以在单个基于 Windows 的图形用户界面中运行命令并编写、测试和调试脚本。 ISE 提供多行编辑、Tab 自动补全、语法颜色设置、选择性执行、上下文相关帮助以及对从右到左语言的支持。 将菜单项和键盘快捷方式映射到许多将会在 Windows PowerShell 控制台中执行的相同任务。
ISE是Windows环境下系统提供的安装选项之一,程序简单流畅,易上手,没有冗杂功能适合初学者或是开发环境受限制的情况下进行使用。但由于专供Powershell工程开发,不具备拓展功能,对于需要进行多种语言编程或处于复杂环境下的开发者而言,ISE的功能和属性可能过于单一了。
2.Visual Studio Code介绍
Visual Studio Code(VS Code)是微软2015年推出的一个轻量但功能强大的源代码编辑器,基于 Electron 开发,支持 Windows、Linux 和 macOS 操作系统。它内置了对JavaScript,TypeScript和Node.js的支持并且具有丰富的其它语言和扩展的支持,功能超级强大。Visual Studio Code是一款免费开源的现代化轻量级代码编辑器,支持几乎所有主流的开发语言的语法高亮、智能代码补全、自定义快捷键、括号匹配和颜色区分、代码片段、代码对比 Diff、GIT命令 等特性,支持插件扩展,并针对网页开发和云端应用开发做了优化
相比较Windows自带的编辑工具PowerShell ISE,VS Code作为一款多功能的代码编辑工具,可以根据用户的需求安装各种不同的插件,以此来满足开发者日益复杂的开发需要。因此,它也几乎支持所有Powershell开发过程中的需求,用户同样可以使用此工具来进行代码的编辑,调试和运行。
四、使用PowerShell脚本获取共享文件夹下的文件属性
经过上述简单介绍,想必足以让读者对Powershell有了初步的了解。下面开始进入这篇文章的主题——如何获取Windows环境上文件系统各项属性。
相比Linux主机较为清晰和简洁的文件系统,Windows环境下的文件系统似乎要复杂和混乱的多。本次笔者想要实现的需求是以下几项:获取文件的文件名、所有者、路径、以及文件大小。
1.获取文件的文件名、路径、以及文件大小
对Powershell有所了解的读者可能很容易知道,获取文件名、路径、以及文件大小这三种属性,只需要使用Get-ChildItem 命令就可以获得,代码参照如下:
$file_path = "D:\hzl_SM"
Get-ChildItem -Path $file_path -Recurse -Attributes !Directory -ErrorAction SilentlyContinue
然鹅,我们很快发现,这种方法并不能获取文件的所有者属性,但是,这项属性肯定存在,那应该如何获取呢?显然,需要追加其它的方法来实现这项需求。
2.获取文件的文件名、所有者、路径、以及文件大小。
从上文我们已经发现,使用传统方法并不能获取文件的所有者,经笔者查询,使用以下方法可以获取文件的所有者属性:
$file_path = "D:\hzl_SM"
Get-ChildItem -Path $file_path -Recurse -Attributes !Directory -ErrorAction SilentlyContinue | Select-Object Name,Directory,Length,@{N='Owner'; E={ (Get-Acl $_.FullName).Owner}}
五、计算文件的磁盘使用率
从上文我们已经获取了文件的大小,然鹅,在实际使用当中,文件大小并不能很直观的体现文件在计算机系统中的大小,因此,我们想要计算文件的磁盘使用率,来更直观的表示文件在系统中的大小。
要计算文件的磁盘使用率,也就是文件大小和磁盘容积的比率(FileSize/DiskSize),需要文件大小和磁盘大小两项数据,文件大小已经通过上文获取,下文我们来获取磁盘的大小:
$disknm = "D:\"
$diskSize = Get-WmiObject -Class Win32_LogicalDisk | Where-Object DeviceId -EQ $disknm | Select-Object Size
六、总结
综上所述,Powershell可以很方便的获取文件属性,可以有效弥补Windows Cmd在使用上的不足之处,是一款功能强大的编程语言,尤其是在与计算机系统的交互上更加贴近底层,适用于运维等特别场景,值得了解和掌握。