powershell 简单实战

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

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

powershell中调用外部程序和操作

  • 启动一个进程

Start-Process -FilePath <可执行文件的路径> -ArgumentList <参数列表>

  • 使用“.” 或者“invoke-expression"调用ps1 bat文件。
  • 以默认方式打开文件

Invoke-Item “c:\1.txt” #将使用txt文件的默认打开工具(即记事本)打开c:\1.txt
可以用”&“ 调用 程序。

文本处理

  1. 数据处理类, 比如成绩单

这一类问题如果用暴力求解,就是O( n 2 n^2 n2); 如果你的数据结构和算法没有还给学校,“空间换时间”—哈希是个好选择.

  • 上述引用文章中存在一些问题:
  1. 不能处理分隔符非空格的情况;
  2. 如果测试数据有空行,脚本就崩了
  3. 变量命名不太好

修改如下

$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 }

文件操作类

  1. 文件重命名

将文件夹"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

部分命令解释:

相关知识点:

  • 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吗?

csv 中文乱码解决方法

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值