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的提示符,可以使用以下代码,包括两个函数:prompt
和get-diralias
。get-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
}