PowerShell脚本自动化示例

PowerShell是一个强大的命令行工具,它提供了对.NET Framework的访问,使得能够轻松地执行各种系统操作。在本文中,将分享一些编写的有用的代码片段,并介绍如何通过PowerShell实现自动化

当从Unix/Linux的bash提示符迁移到PowerShell时,非常怀念它。bash提示符不会显示整个目录路径,并且有一个家目录符号,这使得终端看起来更加整洁。由于安全原因,PowerShell中实施了许多限制。例如,如果有一个名为delay.ps1的脚本,不能通过输入delay来运行它,即使执行策略已经启用。决定使用一个前缀ss来运行所有这些程序。现在,有了提供的脚本,可以简单地输入ss scriptname来运行脚本(即使省略了扩展名或.\也能工作)。

使用代码

将文件Microsoft.PowerShell_profile.ps1的代码放入配置文件中,并将ss.ps1放在想要保存脚本的地方。需要在电脑上启用执行策略才能运行PowerShell脚本。要为当前用户启用此策略,可以运行:

PS > set-executionpolicy Unrestricted -scope currentuser

脚本内部

如果想在Windows PowerShell中使用类似Unix的提示符,可以使用以下代码,包括两个函数:promptget-diraliasget-diralias函数在遇到设置的家目录时返回一个grave符号,这里设置为E:\Scripts。如果不是家目录,则找到反斜杠(\)。只取该斜杠后面的最后一部分作为子字符串。否则,如果发现当前位置字符串以\结尾,知道在驱动器的根目录。在这种情况下,只返回驱动器和冒号。

$env:homedir=E:\Scripts # 获取路径的最后一部分 function get-diralias ([string]$loc) { # 检查否在家脚本目录中 # 在这种情况下返回grave符号 if ($loc.Equals($env:homedir)) { return "~" } # 如果它以\结尾,这意味着在驱动器的根目录 # 在这种情况下返回驱动器 $lastindex = [int] $loc.lastindexof("\") if ($loc.EndsWith("\")) { return $loc.Remove($lastindex, 1) } # 否则返回只有目录名 $lastindex += 1 $loc = $loc.Substring($lastindex) return $loc } # 设置提示符 function prompt { return "[sa@matrix $(get-diralias($(get-location)))]$ " }

添加另一个函数

添加了另一个函数ss,它提供了以下功能:

  • $ ss cd - 返回家目录
  • $ ss ep - 编辑PowerShell配置文件脚本
  • $ ss ise filename.ps1 - 使用PowerShell ISE打开文本/脚本文件
  • $ ss list-programs - 列出应用程序路径中可用的程序,可以简单地使用ss来运行,例如,ss notepad++ss chrome
  • $ ss chrome$ ss devenv - 从应用程序路径中的注册表运行程序

ss是一个命令,如果提供的文件路径不存在,它将创建该文件。让进入脚本。有ss这个“教父”函数,它以正确的方式管理命令行参数,如果没有提供命令行,它会发出警告,并调用ss.ps1脚本和那些参数。故意这样做是为了保持配置文件更小。

function ss() { if ($args.Count -lt 1) { return "请提供正确的命令行" } elseif ($args.Count -eq 1) { & "$env:homedir\ss.ps1" $args } else { $cmd = $args[0] # echo "cmd: `"$cmd`"" $cargs = [string]$args # echo "cargs: `"$cargs`"" $cargs = $cargs.TrimStart($cmd) $cargs = $cargs.TrimStart() # echo "cargs: `"$cargs`"" & "$env:homedir\ss.ps1" $args[0] $cargs } return "" }

运行程序

if (Test-Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\$cmd.exe") { echo "启动程序 $origcmd" $regitem = Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\$cmd.exe" # Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\notepad++.exe" $regcmd = $regitem."(default)" # 修改命令,以便参数不会被分割 $regcmd = $regcmd.TrimStart("`"") $regcmd = $regcmd.TrimEnd("`"") & "$regcmd" $cargs break } elseif (!(Test-Path "$env:homedir\$cmd.ps1")) { echo "请检查命令" break }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485