====== Windows Powershell 基本使用 ======
====== 实现操作系统功能 ======
===== 进程管理 =====
==== 启动进程 ====
PowerShell 指定工作目录并隐藏窗口
Powershell -WindowStyle Hidden -command start -WindowStyle Hidden -WorkingDirectory C:\Portable\aria2-1.36.0-win-64bit-build1\ .\aria2c.exe -arg '--conf-path=aria2.conf'
* -WindowStyle 窗口风格, Hidden为隐藏窗口
* -WorkingDirectory 工作目录
* -Arg arg1,arg2,arg3 传递给进程的参数表
* -RedirectStandardOutput 将标准输出重定向到文件,适合于需要保存控制台输出为日志的文件
修改窗口风格是为了使得程序隐藏运行,因为一个命令行程序不隐藏运行会有一个黑乎乎的窗口,看着不好。
修改工作目录是有些应用会在工作目录下读取配置文件,指定工作目录是为了让 当前目录、上级目录 等标识符起作用,这样就不用在命令行参数传递长长的配置文件名
单独传参数表是因为有些命令行程序可能不止接收一个参数,直接放在Start-Process 可执行文件后面可能会无法工作
===== 文件管理 =====
==== 搜索文件 ====
Get-ChildItem *.txt | select-string "Keywords" | Select Path,Line
===== Windows 防火墙管理 =====
==== 新建规则 ====
New-NetFirewallRule -Name sshd -DisplayName "OpenSSH Server" -Description "SSH 服务" -Profile "Domain,Public,Private" -Enabled True -Direction Inbound -Protocol TCP -LocalPort 22 -Action Allow
* -Name 名称
* -DisplayName 显示名称(控制面板-防火墙显示名称)
* -Description 描述
* -Profile 指规则生效的范围,Public-公共,Private-专用, Domain-域环境中的其他服务器
* -Enabled 是否启用
* -Direction Inbound/Outbound
* -Protocol Tcp/udp
* -LocalPort 22 22号端口
* -Action Allow/Deny 允许或拒绝
==== 允许应用程序经过防火墙 ====
# 提供3个必选参数即可
New-NetFirewallRule -DisplayName Notebook -Program '%windir%\notepad.exe' -Action allow
Get-NetFirewallApplicationFilter | where-object -property Program -match Notepad
Remove-NetFirewallRule -DisplayName Notebook
==== 查询规则 ====
注:查询规则时不会显示具体的规则内容,要用下面的 Get-XXXFilter 系列命令才可以)
Get-NetFirewallRule
Get-NetFirewallAddressFilter
Get-NetFirewallPortFilter
Get-NetFirewallApplicationFilter
===== 磁盘:虚拟磁盘管理 =====
DISKPART
diskpart
create vdisk file="D:\virtual-disk0.vhdx" maximum=10240 type=expandable #创建VHD/X虚拟磁盘
select vdisk file="D:\virtual-disk0.vhdx" #选择虚拟磁盘
attach vdisk #挂载虚拟磁盘
list vdisk #确定正在操作的硬盘为虚拟硬盘,选中的硬盘标注了*号
create partition primary #创建主分区
format fs=ntfs label="new-disk" quick #快速格式化
assign letter=m #分配驱动器号
# Powershell 命令
mount-diskimage -imagePath d:\virtual-disk0.vhdx #挂载磁盘,PowerShell 命令,需要管理员权限
====== 内置库和三方库(.NET) ======
===== .NET事件:文件变化监控 =====
# 以下代码监控D:\test-file.txt 文件的变化
$path = "d:\" # 监控目录,必须是文件夹
$w=new-object io.filesystemwatcher
$w.path=$path
$w.filter="*.txt" #监控的目标文件
register-objectevent $w Changed -action {
write-host $event.sourceeventargs.fullpath
write-host $event.sourceeventargs | get-member
} #注册监控事件,该命令返回一个Job对象,用get-job命令可以查看
===== 文件变化轮询:有变化就输出变化 =====
$folder = 'D:\'
# 定义每次监控的间隔时间,这时定义为1000毫秒,即1秒
$timeout = 1000
# 创建文件系统监视对象
$FileSystemWatcher = New-Object System.IO.FileSystemWatcher $folder
Write-Host ”按 CTRL+C 来退出对文件夹 $folder 的监控”
while ($true) {
# 监控文件夹内的所有变化
$result = $FileSystemWatcher.WaitForChanged('all', $timeout)
if ($result.TimedOut -eq $false)
{
# 当文件夹的内容变化时,发出警告提示
Write-Warning ('File {0} : {1}' -f $result.ChangeType, $result.name) #字符串格式化
}
}
Write-Host '监控被取消.'
===== 文件监控样例: FILEWATCHER.PS1 =====
### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "D:\source"
$watcher.Filter = "*.*"
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true
### DEFINE ACTIONS AFTER AN EVENT IS DETECTED
$action = { $path = $Event.SourceEventArgs.FullPath
$changeType = $Event.SourceEventArgs.ChangeType
$logline = "$(Get-Date), $changeType, $path"
Add-content "D:\log.txt" -value $logline
}
### DECIDE WHICH EVENTS SHOULD BE WATCHED
Register-ObjectEvent $watcher "Created" -Action $action
Register-ObjectEvent $watcher "Changed" -Action $action
Register-ObjectEvent $watcher "Deleted" -Action $action
Register-ObjectEvent $watcher "Renamed" -Action $action
while ($true) {sleep 5}
===== 正则表达式 =====
$rawtext = "test@pstips.net sent an e-mail that was forwarded to admin@pstips.net."
$rawtext -match "\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b" #用于匹配
$regex = [regex]"(?i)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b"
$regex.Matches($rawtext) #用于捕获
$domaintest = "www.baidu.com; famicom.org; https://ovwx.org; NIPO.top"
$domainreg = [regex]"((http://)|(https://))?([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}/?"
$domainreg.matches($domaintest).value
==== 常见正则 ====
* 匹配邮箱:`$email = [regex]"(?i)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b"`
* 匹配域名:`$domain = [regex]"((http://)|(https://))?([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}/?"`
====== 语法 ======
===== 参数和字典 =====
$array1 = 'a','b','c',1
$array[4] = 'HHH'
$dict = @{
key1 = 'value1'
key2 = 'value2'
key3 = 'value3'
}
$dict.key4 = 'value4'
Write-Output $dict['key1']
Write-Output $dict.key1
Write-Output $array1[0]
====== 杂项 ======
Powershell 内容显示不全(有省略号)的处理方法
# 修改变量
$FormatEnumerationLimit = -1
# 使用WRAP选项输出结果
Get-Process -Name dllhost | Select -Property Modules | Format-Table -Wrap
===== 绕过权限限制执行PS1脚本 =====
主要是注册表写启动项
Powershell -file xxx.ps1 -ExecutionPolicy ByPass #此方法失效
Powershell -C "set-executionpolicy bypass -scope process; . C:\Portable\run-server.ps1" #此方法有效
===== 系统自带屏幕记录器 =====
可用作录制操作手册 #cmd
psr.exe
/start /output d:\step.zip 开始录制,并保存到d:\step.zip文件内
/stop 停止录制
/gui 0 显示软件界面,如果需要显示软件界面,就使用 /gui 1 或者省略该参数
/maxsc 10 最大截图数量