Contents
Introduction
在初学一门语言之时,先照猫画虎把架子搭起来,把程序跑通,再思考别人的示例是否有不妥的地方,一点一点的改进,在改进过程中不断地学习新知识, 这才是好的学习方法.
References
常用脚本
除非你是运维,在工作中不会遇到过于复杂的脚本,更多的是使用脚本将一些重复性的操作提炼为一个脚本,轻轻点击一下就可以完成,爽!
启动编程工作环境
比如你在VS下写程序,需要启动一堆软件,开始一天的工作。有了下面的脚本,你只需把它弄个快捷方式在桌面上,然后右键-》run with powershell, 就可以干活了!
<#右键单击ps1文件-> run with powershell
第一行可以修改当前powershell 会话的执行策略使你能在当前ISE执行脚本,
但是你不能再次修改,因为你没有获得管理员权限!
这正是我们需要的: 能执行脚本,又不会因为获得权限而一时脑残乱改。 完美!
#>
Set-ExecutionPolicy Unrestricted -Scope Process # 修改执行策略
# 在powershell_ise中调试程序,比如一些带参数的程序调试,类似Linux环境
# 执行VS中的工程,只需在ISE中按下F5键。
$psfile="C:\project\shell\vs.ps1"
Start-Process -FilePath powershell_ise.exe $psfile
# 打开相关软件
$http="file:///C:/project/opencv/opencv4.0.1/4.0.1/d9/df8/tutorial_root.html"
Start-Process -FilePath "C:\Users\jia\AppData\Local\youdao\dict\Application\YoudaoDict.exe"
Start-Process -FilePath devenv.exe -ArgumentList "C:\project\opencv\first_opencv\first_opencv.sln" # VS工程
Start-Process chrome $http
$workPath="C:\project\opencv\first_opencv"
# Write-Host $workPath # 在powershell中这样输出字符串
<#如果没有前面那两点,你就得不到想要的效果:你并没有切换到$workPath
这个我没有找到Powershell中的相关资料,只是在Linus shell中就是这样做的,
没想到还真有用! 管它了,能办成事就行! 应该是子进程和当前进程的关系。
#>
.. cd $workPath
ls
- 启动一个进程
Start-Process -FilePath <可执行文件的路径> -ArgumentList <参数列表>
- 使用“.” 或者“invoke-expression"调用ps1 bat文件。
- 以默认方式打开文件
Invoke-Item “c:\1.txt” #将使用txt文件的默认打开工具(即记事本)打开c:\1.txt
可以用”&“ 调用 程序。
文本处理
这一类问题如果用暴力求解,就是O( n 2 n^2 n2); 如果你的数据结构和算法没有还给学校,“空间换时间”—哈希是个好选择.
- 上述引用文章中存在一些问题:
- 不能处理分隔符非空格的情况;
- 如果测试数据有空行,脚本就崩了
- 变量命名不太好
修改如下
$scoreFrequency=@{}
# 要能够处理空行
$allStudents=Get-Content .\myblog.txt | where {!([string]::IsNullOrWhiteSpace($_))} |
foreach {
# -split选项支持正则分隔符,split方法不支持正则分隔符,split方法只能按照单个字符分隔
# 实际会遇到多种分隔符而且可能有人手欠多打几个,需要能够处理.
# \W 匹配非单词字符,类似于[^A-Za-z0-9],但略有不同--采用Unicode字符集
$currentStudent=$_ -split "\W+" # assigned to $currentStudent
if($scoreFrequency.ContainsKey($currentStudent[1]))
{
$scoreFrequency[$currentStudent[1]]++
}
else {
$scoreFrequency[$currentStudent[1]]=1
}
@{ Score=$currentStudent[1];Name=$currentStudent[0] } # assigned to $allStudents
}
$allStudents | where {
$scoreFrequency[$_.Score] -gt 1
} | foreach {"{0} {1}" -f $_.Name,$_.Score }
文件操作类
- 文件重命名
将文件夹"test"下所有文件按照"test_0001"格式重命名.
$renamedFolder="C:\project\shell\test"
$serial=0
<# -path : Specifies a path to one or more locations. Wildcards are accepted.
The default location is the current directory (.) #>
Get-ChildItem -path $renamedFolder -Filter *.txt | ForEach-Object {
$extension=$_.Extension
<# formatting numbers by "-f", {0:d4} means 4 digits padding with 0;
{0:p1} for percentage;{0:n4}for decimal. #>
$newName='test_{0:d4}{1}' -f $serial,$extension
$serial++
Rename-Item -Path $_.FullName -NewName $newName
}
爬虫 web-crawler
部分命令解释:
- invoke-restmethod : sends HTTP and HTTPS requests to Representational State Transfer (REST) web services that returns richly structured data.
- new-object: creates an instance of a .NET Framework or COM object,by default,returns a .Net instance.
- system.collections.arrayList: 我们不建议你使用ArrayList类的新的开发。 相反,我们建议使用泛型List类
相关知识点:
- anchor: HTML的对象,超链接;创建指向另一个文档的链接(通过 href 属性),或者创建文档内的书签(通过 name 属性)。
- PscustomObject: 用简单的方法来创建结构化数据, 是快速创建新对象的方法.
- URL定位资源,用HTTP动词(GET,POST,DELETE,DETC)描述操作
- UserAgent(用户代理)一个特殊字符串头,使服务器能够识别客户使用的OS&version、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等,以发送不同页面.
windows log 系统日志数据挖掘
Windows 中提供了 2 个分析事件日志的 PowerShell cmdlet:一个是Get-WinEvent,超级强大,但使用起来比较麻烦;另一个是Get-EventLog,使得起来相当简单,可以实时筛选.
Bugs encountered
- csv中文乱码
使用import-csv *.txt 显示的是乱码, 修改windows的语言设置也没有用; 在后面指定编码方式也不对。。。。
正确的读取CSV文件,你必须加上在encoding后明确的加上”Default""
Import-Csv .\myblog.txt -Encoding Default # 加上default就没有乱码了,这太奇葩了,你不是default吗?

本文介绍了PowerShell的实战应用,包括启动编程工作环境的脚本、文本处理、文件操作、Web爬虫以及Windows日志分析。在学习过程中,作者遇到了如CSV中文乱码等问题,并给出了相应的解决方案。
518

被折叠的 条评论
为什么被折叠?



