前些时候的一篇文章中,说了在PS中可以有非常方便的别名机制,有利于熟悉其他console shell的人来使用PS; 但是对其中某些问题只是
点到为止,今天就来详细的说说这个话题。
1、使用别名
在PS中可以为函数、cmdlet或者可执行文件创建别名,然后在任何命令中使用别名而不是原名。(这里介绍一个无关的话题, 有些童鞋可能
认为在windows中dll不是可执行文件,在PS中可以通过get-command *命令来查看windows中的可执行文件的类型)
PS中还存在很多内置的别名,这个可以通过get-alias cmdlet来查看。
需要介绍一个重要的概念:别名驱动器,在PS中有一个内置的环境支持对象,那就是别名驱动器;其盘符为alias: ; 注意这个盘符是个虚拟
的逻辑对象盘符,而不是实际的分区盘符。在PS中通过cd alias: 可以进入这个虚拟盘符。如图所示:
这里很显然就将当前工作目录切换到了alias虚拟盘符,可以通过get-childitem命令获取这个虚拟驱动器下的内容,如图所示:
通过这里可以看到,Alias虚拟盘符实际保存的是命令别名。
2、创建别名
创建别名很简单,通过set-alias cmdlet就可以实现。语法规则如下:
set-alias 别名 cmdlet
Exp:
set-alias ls get-childitem
如果为在path系统环境变量的应用程序和可执行文件创建别名,不需要指定完整路径,如果应用程序名包含空格,则必须用第一篇文章中提到的规则; 如果为非系统应用程序、
可执行文件创建别名,则必须包含完整的路径,或者将路径添加至path系统环境变量。
Exp:
set-alias np notepad # 因为notepad在path环境变量的路径中,所以可以这样执行命令
上面的语句也相当于下面语句:
set-alias np c:\windows\notepad.exe (在不同的系统上这个路径可能不同)
3、删除别名
既然可以设定别名,那么相对应的就必须能删除别名;在PS中删除别名用Remove-Item cmdlet来从别名驱动器中删除别名,就像删除驱动其中文件一样。
Exp:
remove-item alias:\np
这样就可以从别名驱动器中将np别名删除。
4、使用函数替代带有参数的命令
使用set-alias命令不可以为带有参数的命令创建别名。
Exp:
set-alias np-Profile “notepad $profile" #这样的别名是错误的
为了实现带参数的命令的别名可以采用PS提供的函数功能。
Exp:
function np-Profile {notepad $profile}
这样定义的函数与别名具有类似的功能,在PS中键入np-profile 就会打开profile来编辑。
5、使用windows的应用程序
在ps中可以启动windows的相关应用程序,如果应用程序输出文本,那么还可以对输出的文本进行捕获以进行分析和使用;同样还可以在ps
中启动GUI界面的应用程序,就像前面启动notepad一样。
PS中启动win32 exe文件有一个限制,只能启动系统环境变量$path下的exe文件;$path环境变量指示了PS可以搜索的路径。在PS中利用env环境
变量对象来获取path路径。如下图所示:
如果要将某个路径添加到默认搜索路径下,只需像下面这样就可以:
Exp:
$env:path += ";H:\"
这样就将H根目录添加到系统默认的搜索路径下了,注意: string仅重载了 += 符号,而没有重载 -= 符号。
需要注意的是,这样添加的路径仅在当前会话中有效,当前会话推出后就不再有效。如果需要一直有效,就必须修改配置文件。修改配置文件方法在前面的文章中已进行介绍。
6、管理错误
在使用PS的过程中,经常会碰到错误;在PS中又两类错误: 终止错误、 非终止错误。
终止错误: 终止错误出现时,将终止命令的执行;例如,无法删除文件,这时PS会继续运行而不管该错误,然后显示错误和输出。
非终止错误: 不终止命令的执行;例如,提交无效的操作对象,PS就会生成终止错误。
7、PS中的导航
PS提供的最具有突破性的功能就是:虚拟驱动器导航功能。在PS中,除了可以在文件系统驱动器之外进行浏览;还可以在HKEY_LOCAL_MACHINE(HKLM:)和
HKEY_CURRENT_USER(HKCU:)注册表配置单元驱动器中进行浏览,还可以在数字签名证书存储区(Cert:)以及当前会话中的函数等的驱动器中进行浏览,这些驱动
器统称为windows PS 驱动器。
可以通过: get-psdrive 来查看PS支持的驱动单元。如下图所示:
7、1 文件系统中导航/浏览
通过: set-location /cd (cd 为set-location cmdlet的别名) 来切换文件系统的路径。
通过: get-childitem /dir/ls (dir、ls为get-childitem cmdlet的别名)来查看文件系统路径下的对象。
文件系统中: 驱动器后必须跟 “ : ”, 如 cd d: ,和cmd中一样; 子目录和父目录之间用 斜杠 \ 或者 反斜杠 /来分割;
在PS中继承了cmd的一些特性, 例如 . 表示当前目录 ,而.. 表示当前目录的父目录; * 表示当前的目录类容。
Exp:
get-item * 可以用来获取当前目录下的内容; 而单独的get-item运行时会提示输入路径或者操作对象。
在PS中内置的变量 $home 表示当前登录者的家目录,$pshome 则表示widnows powershell的安装目录。与其他shell一样,可以再PS中进行目录和文件操作;
这通过下面的相关cmdlet实现: get-item、get-childitem、new-item、remove-item、set-item、move-item和copy-item实现。
7、2 浏览注册表
PS中最值得推荐的特性之一就是可以再注册表中进行浏览和方便的操作。并且浏览方法和文件浏览方法保持一致。在PS中HKEY_LOCAL_MACHINE配置单元
映射到hklm:驱动器; 而HKEY_CURRENT_USER配置单元则映射到HKCU:驱动器。如下图所示:
例如可以通过下面一系列的命令来查看某个子项的各个键值:
PS HKLM:\> cd software____________________________________________________________________________PS HKLM:\software> cd .\Microsoft____________________________________________________________________________PS HKLM:\software\Microsoft> cd .\PCHealth____________________________________________________________________________PS HKLM:\software\Microsoft\PCHealth> cd ..____________________________________________________________________________PS HKLM:\software\Microsoft> cd .\PowerShell____________________________________________________________________________PS HKLM:\software\Microsoft\PowerShell> cd 1____________________________________________________________________________PS HKLM:\software\Microsoft\PowerShell\1> cd .\ShellIds____________________________________________________________________________PS HKLM:\software\Microsoft\PowerShell\1\ShellIds> cd .\Microsoft.PowerShell____________________________________________________________________________PS HKLM:\software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell> dir____________________________________________________________________________PS HKLM:\software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell> ls____________________________________________________________________________PS HKLM:\software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell> get-itemproperty -path . PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\softwar e\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShellPSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\softwar e\Microsoft\PowerShell\1\ShellIdsPSChildName : Microsoft.PowerShellPSDrive : HKLMPSProvider : Microsoft.PowerShell.Core\RegistryPath : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exeExecutionPolicy : RemoteSigned
7、3 浏览证书存储区
前面提到数字签名证书存储区映射到cert: 驱动器,因此可以通过: cd cert: 来切换到这个驱动器中,并且可以通过ls来查看当前驱动器上的内容。如图所示:
还可以查看当前驱动器中其他的内容:
PS cert:\> dirLocation : CurrentUserStoreNames : {SmartCardRoot, UserDS, AuthRoot, CA...}Location : LocalMachineStoreNames : {SmartCardRoot, AuthRoot, CA, Trust...}_____________________________________________________________________________PS cert:\> cd currentuser_____________________________________________________________________________PS cert:\currentuser> dirName : SmartCardRootName : UserDSName : AuthRootName : CAName : TrustName : DisallowedName : MyName : RootName : TrustedPeopleName : TrustedPublisher
7、4 在其他驱动器中导航
除了文件系统、注册表和证书驱动器外,PS中还有其他几个内置的驱动器, 其中包括前面提到的别名驱动器、环境提供程序(env:)、函数(Function:)和
变量驱动器(variable:); 使用上面提到的方法均可以在这些驱动其中进行浏览。
Exp:
PS Env:\> lsName Value ---- ----- ALLUSERSPROFILE C:\ProgramData APPDATA C:\Users\vol_20120330\AppData\Roaming CG_BOOST_ROOT C:\Program Files\Embarcadero\RAD Studio\7.0\in...CommonProgramFiles C:\Program Files\Common Files COMPUTERNAME VOL_20120330_PC ComSpec C:\Windows\system32\cmd.exe FP_NO_HOST_CHECK NO HOMEDRIVE C: HOMEPATH \Users\vol_20120330 LOCALAPPDATA C:\Users\vol_20120330\AppData\Local LOGONSERVER \\VOL_20120330_PC MOZ_PLUGIN_PATH C:\Program Files\Foxit Software\Foxit Reader\p...NUMBER_OF_PROCESSORS 4 OS Windows_NT Path C:\Program Files\Embarcadero\RAD Studio\7.0\bi...PATHEXT .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.W...PROCESSOR_ARCHITECTURE x86 PROCESSOR_IDENTIFIER x86 Family 6 Model 37 Stepping 5, GenuineIntel PROCESSOR_LEVEL 6 PROCESSOR_REVISION 2505 ProgramData C:\ProgramData ProgramFiles C:\Program Files PSModulePath C:\Users\vol_20120330\Documents\WindowsPowerSh...PUBLIC C:\Users\Public SESSIONNAME Console SystemDrive C: SystemRoot C:\Windows TEMP C:\Users\VOL_20~1\AppData\Local\Temp TMP C:\Users\VOL_20~1\AppData\Local\Temp USERDOMAIN vol_20120330_PC USERNAME vol_20120330 USERPROFILE C:\Users\vol_20120330 VS90COMNTOOLS C:\Program Files\Microsoft Visual Studio 9.0\C...windir C:\Windows windows_tracing_flags 3 windows_tracing_logfile C:\BVTBin\Tests\installpackage\csilogfile.log
7、5 PS驱动器
windows PS通过PS驱动器的概念来支持上述的扩展驱动器导航功能;可以再Windows的任何有效对象数据存储中创建PS驱动器;而且可以为这些驱动器
指定有效的驱动器盘符,例如C:或者 MyDrive 后跟冒号 : ; 可以使用上面的提到的方法来在这些PS驱动器中进行导航。 注意:PS驱动器仅在PS环境中得到
支持,其他win32 程序中无法查看和访问,例如无法在 explorer.exe 或cmd中查看。
通过new-psdrive cmdlet可以创建自己的PS驱动器,如下所示:
PS Env:\> new-psdrive -name mydocs -psprovider filesystem -root "$home\my documents"警告: 列“CurrentLocation”无法显示,已被删除。Name Used (GB) Free (GB) Provider Root ---- --------- --------- -------- ---- mydocs 11.36 FileSystem C:\Users\vol_20120330\my..._____________________________________________________________________________PS Env:\> cd mydocs:_____________________________________________________________________________PS mydocs:\> lsGet-ChildItem : 对路径“C:\Users\vol_20120330\my documents”的访问被拒绝。所在位置 行:1 字符: 3+ ls <<<< + CategoryInfo : PermissionDenied: (C:\Users\vol_20120330\my docum ents\:String) [Get-ChildItem], UnauthorizedAccessException + FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.C ommands.GetChildItemCommand
8、小结
PS的功能目前已经相当的强大,如果知道面向对象的思想和理解C#,将有利于理解PS的各项功能,随着系列文章的深入,将逐步引入C#的交叉内容。