一、输出重定向
1、1 兼容cmd重定向
有过console 模式管理经验的人都知道,几乎所有的console都支持重定向的概念(我目前还没有见过不支持重定向功能的console);例如在cmd中
可以利用下面的形式实现重定向。
tasklist > process.txt #将系统进程信息保存到process.txt中
systeminfo >>process.txt
那么在PS中是否也可以这样进行重定向呢? 这个就是可以有。
Exp:在PS中通过 > 来实现输出重定向
PS C:\Users\vol_20120330> get-process > process.txt
可以看到执行过程没有报错,那么我们查看一下是否真的生成了process.txt文件
PS C:\Users\vol_20120330> ls 目录: C:\Users\vol_20120330 Mode LastWriteTime Length Name ---- ------------- ------ ---- ........ -a--- 2012/5/12 16:41 10374 process.txt .........
如上所示,确实生成了process.txt文件。同样我们可以利用 >> appended文件内容。
Exp:利用 >> 追加信息
____________________________________________________________________________ PS C:\Users\vol_20120330> get-process >> process.txt ____________________________________________________________________________ PS C:\Users\vol_20120330> ls 目录: C:\Users\vol_20120330 Mode LastWriteTime Length Name ---- ------------- ------ ---- ............. -a--- 2012/5/12 16:44 20422 process.txt .................. ____________________________________________________________________________
可以看到,文件的内容增加了,这可以通过文件的length属性增大得知。
1、2 PS新增的特性 out-* cmdlet集重定向
PS中的out重定向命令集,具有两个特点:
1、 这些out-* cmdlets 的输出不是对象,而是文本格式的数据,这是因为out-* cmdlet要将数据传输到接受文本信息的系统组件
2、 这些out-* cmdlet 将数据从PS中发送到其他位置,同时在这些命令执行完毕的时候,会将在管道中传输的对象删除
下面我看来看第二个特性。
Exp: 利用Format-wide 命令来验证out-* cmdlet的第二个特性
PS C:\Users\vol_20120330> get-childitem | out-host |format-wide -column 2 目录: C:\Users\vol_20120330 Mode LastWriteTime Length Name ---- ------------- ------ ---- d-r-- 2012/3/30 18:27 Searches d-r-- 2012/3/30 18:27 Videos -a--- 2012/5/12 16:44 20422 process.txt -a--- 2012/4/15 19:14 509 regwizard.log -a--- 2012/4/15 19:14 9853 sanct.log
原本我们通过get-childitem命令获取当前目录下的子目录传递给out-host,然后想利用format-wide -column 命令输出2列name属性信息,结果输出了很多列。
我们变换一下管道传递的先后顺序则会得到:
PS C:\Users\vol_20120330> get-childitem |format-wide -column 2 | out-host 目录: C:\Users\vol_20120330 [Contacts] [Desktop] [Documents] [Downloads] [Favorites] [Links] [Music] [Pictures] [Saved Games] [Searches] [Videos] process.txt regwizard.log sanct.log
可以看到,确实是这样的,out-host命令将在管道中传输的对象删除了。其实质就是当out-* cmdlet执行时,将删除传递给他的对象。
注意:
所有的out命令均具有第二个特性,需要注意。
1、3 Ps中分页输出
执行某些命令的时候,其输出信息量大,无法在当前页面中完整的显示所有信息,这就需要分页显示;在cmd中又more命令,在bash中也有类似的命令。
在PS中通过参数来实现这一功能: -paging。
Exp: 在PS中利用-paging进行分页输出
如上图所示,在第一页输出的最底下有相关的提示信息。
同样利用more函数也可以完成这一功能,因为more函数就一个invoke out-host -paging的函数。图下图所示:
如上图所示,在输出窗口的左下角有一个类似于bash中的提示符号: -more-
1、4 放弃输出
在cmd利用重定向可以阻止输出信息, 例如:dir>nul; 而在PS中需要进行管道传递,并且使用专门的cmdlet: out-null。
Exp: 阻止程序输出
1、5 打印输出
我们知道在cmd中如果要调用系统的打印功能,那么需要进行很多的操作才能实现,而在PS中只需一个命令即可实现。
Exp: 利用 out-printer 命令打印输出信息。
上图就是利用:get-process | out-printer 命令打印输出信息
1、6 重定向输出到文件
上面我们说了兼容cmd格式的重定向输出信息到文件,其实在PS中这可以通过专用的cmdlet完成。
Exp:利用out-file命令将信息输出到文件。
PS C:\Users\vol_20120330> get-item process.txt Get-Item : 找不到路径“C:\Users\vol_20120330\process.txt”,因为该路径不存在。 所在位置 行:1 字符: 9 + get-item <<<< process.txt + CategoryInfo : ObjectNotFound: (C:\Users\vol_20120330\process.tx t:String) [Get-Item], ItemNotFoundException + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetIte mCommand _____________________________________________________________________________ PS C:\Users\vol_20120330> get-process | out-file process.txt _____________________________________________________________________________ PS C:\Users\vol_20120330> get-item process.txt 目录: C:\Users\vol_20120330 Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2012/5/12 17:25 10346 process.txt
可以看出,上面的 get-process | out-file process.txt 命令确实创建了文件。
有一点需要注意: out-file命令创建的是Unicode编码的文件,有时候为了输出ASCII编码的文件,我们需要增加-encoding参数, 从而控制输出的文本编码格式
Exp:利用encoding参数控制编码格式
get-process | out-file -encoding ascii -filepath .\process.txt
PS C:\Users\vol_20120330> get-process | out-file -encoding ascii -filepath .\process1.txt _____________________________________________________________________________ PS C:\Users\vol_20120330> get-item process1.txt 目录: C:\Users\vol_20120330 Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2012/5/12 17:31 5254 process1.txt
可以发现文件的大小减少了很多,大约只有前面的一半大小,这也符合unicode编码是ascii编码占用空间两倍的常识。
二、PS中的目录文件管理
前面的一篇文章我们说了部分在PS中进行文件浏览的基本概念,说到了几个虚拟驱动器的概念。并没有深入的描述相关的命令,这里我们进一步对这一知识点进行描述。
2.1 管理当前工作路径/位置
在日常管理中经常需要对当前的路径进行查询和管理;PS提供了四个管理的cmdlet: get-location、set-location、push-location、pop-location。
get-location: 相当于unix/Linux中的‘pwd’;用于获取当前的工作路径
set-location: 相当于chdir、cd命令,用于改变当前工作路径
push-location: 这是PS中新增加的特性, 当用这个命令的时候,PS就会创建一个历史路径堆栈,这个堆栈用来存储push-location的路径信息, push-location用来将路径保存
到历史路径堆栈。
pop-location: 用来将当前工作路径切换到历史路径堆栈的最后一条记录中的位置,并且删除最上的一条记录。
Exp:利用push/pop-loction命令切换工作路径
PS C:\Users\vol_20120330> push-location -path c:\ _____________________________________________________________________________ PS C:\> get-location Path ---- C:\ _____________________________________________________________________________ PS C:\> pop-location _____________________________________________________________________________ PS C:\Users\vol_20120330> get-location Path ---- C:\Users\vol_20120330
如上所示: 首先用push-location命令保存当前路径并且将当前工作路径切换到C:\ ; 接下来用get-location查看是否切换成功; 然后用pop-location命令切回到原先
保存的路径,并用get-location验证。
2、2 获取当前系统支持的驱动器信息
get-psdrive 命令获取当前系统支持的驱动器。
Exp: 利用get-psdrive获取当前我的系统上支持的驱动器
PS C:\Users\vol_20120330> get-psdrive 警告: 列“CurrentLocation”无法显示,已被删除。 Name Used (GB) Free (GB) Provider Root ---- --------- --------- -------- ---- Alias Alias C 17.89 11.41 FileSystem C:\ cert Certificate \ D 7.01 22.29 FileSystem D:\ E 35.61 22.98 FileSystem E:\ Env Environment F 26.06 32.54 FileSystem F:\ Function Function G 14.95 33.88 FileSystem G:\ H 31.67 17.15 FileSystem H:\ HKCU Registry HKEY_CURRENT_USER HKLM Registry HKEY_LOCAL_MACHINE I FileSystem I:\ K FileSystem K:\ N FileSystem N:\ Variable Variable WSMan WSMan
前面简述过get-psdrive命令的psprovider参数,这里不再进行介绍,同时如果需要获取相关信息,可以get-help online一下,可以得到比较详细的信息。
我们也说过可以利用new-item 命令创建虚拟驱动器;这里我们介绍一个新的命令: new-psdrive。
new-psdrive常用的参数有: name 用来指定新的驱动器盘符名
psprovider 用来指定驱动器的提供程序
root 用来指定新驱动器代表的路径
Exp: 利用new-psdrive命令创建mydirve: 盘符
PS C:\Users\vol_20120330> new-psdrive -name mydrive -psprovider filesystem -root $home 警告: 列“CurrentLocation”无法显示,已被删除。 Name Used (GB) Free (GB) Provider Root ---- --------- --------- -------- ---- mydrive 11.40 FileSystem C:\Users\vol_20120330
如实例所示,我们创建了一个盘符:mydrive。我们可以进入盘符进行操作:
PS C:\Users\vol_20120330> cd mydrive:\ _____________________________________________________________________________ PS mydrive:\> gl Path ---- mydrive:\
我们还可以删除当前添加的盘符,这通过remove-psdrive命令实现,见实例。
Exp: 利用remove-psdrive命令删除刚添加的驱动器盘符。
PS mydrive:\> remove-psdrive mydrive Remove-PSDrive : 无法删除驱动器“mydrive”,因为它在使用中。 所在位置 行:1 字符: 15 + remove-psdrive <<<< mydrive + CategoryInfo : InvalidOperation: (:) [Remove-PSDrive], PSInvalid OperationException + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.Re movePSDriveCommand _____________________________________________________________________________ PS mydrive:\> cd c:\ _____________________________________________________________________________ PS C:\> remove-psdrive mydrive _____________________________________________________________________________ PS C:\> cd mydrive:\ Set-Location : 找不到驱动器。名为“mydrive”的驱动器不存在。 所在位置 行:1 字符: 3 + cd <<<< mydrive:\ + CategoryInfo : ObjectNotFound: (mydrive:String) [Set-Location], DriveNotFoundException + FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.SetLo cationCommand
2、3 目录和文件的建立、复制、移动和删除
在windows PS中,用item表示在系统驱动器中的项目,因此用item作为cmdlet名词部分的cmdlet都与文件或目录的操作有关。
Exp:利用get-command的发现功能查询文件操作相关命令
PS C:\> get-command *-item CommandType Name Definition ----------- ---- ---------- Cmdlet Clear-Item Clear-Item [-Path] <String[]... Cmdlet Copy-Item Copy-Item [-Path] <String[]>... Cmdlet Get-Item Get-Item [-Path] <String[]> ... Cmdlet Invoke-Item Invoke-Item [-Path] <String[... Cmdlet Move-Item Move-Item [-Path] <String[]>... Cmdlet New-Item New-Item [-Path] <String[]> ... Cmdlet Remove-Item Remove-Item [-Path] <String[... Cmdlet Rename-Item Rename-Item [-Path] <String>... Cmdlet Set-Item Set-Item [-Path] <String[]> ...
从上面可以看到一共有9个相关的命令,但是这并没有包括全部的命令,因为还一个非常实用的命令:get-childitem;下面我们一一进行介绍:
1) get-item
get-item的作用是获取指定位置的项的相关信息。
Exp:利用get-item获取当前路径下项的信息
PS C:\> get-item .\ 目录: Mode LastWriteTime Length Name ---- ------------- ------ ---- d--hs 2012/4/20 6:38 C:\
Exp: 利用get-item获取当前用户home目录的信息
PS C:\> get-item $home 目录: C:\Users Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 2012/5/12 17:31 vol_20120330
这个命令具体可以参考帮助,其他就多说了。
2)get-childitem
这个命令获取某个项目中子项, 这个命令有很多的参数,但常用的有-name、 -recurse、-path、-force参数。
name: 指定获取子项的时候仅枚举子项的名称。
recurse: 递归获取
path: 指定要枚举的路径,这个参数可以省略
force: 获取所有的子项,包括隐藏的子项
这个命令还有include、exclude两个常用的参数,具体就不介绍了,大家可以查看帮助。
Exp:例举当前路径下的子项名称
PS C:\> get-childitem -name DRIVERS PerfLogs Program Files Users Windows autoexec.bat config.sys gdiplus.dll
Exp: 获取指定路径下的子项——获取$home路径下的子项
PS C:\> get-childitem -path $home 目录: C:\Users\vol_20120330 Mode LastWriteTime Length Name ---- ------------- ------ ---- d-r-- 2012/3/30 18:27 Contacts d-r-- 2012/5/12 17:19 Desktop d-r-- 2012/5/12 17:18 Documents d-r-- 2012/5/12 5:34 Downloads d-r-- 2012/5/2 9:51 Favorites d-r-- 2012/3/30 18:27 Links d-r-- 2012/4/30 14:15 Music d-r-- 2012/3/30 18:27 Pictures d-r-- 2012/3/30 18:27 Saved Games d-r-- 2012/3/30 18:27 Searches d-r-- 2012/3/30 18:27 Videos -a--- 2012/5/12 17:25 10346 process.txt -a--- 2012/5/12 17:31 5254 process1.txt -a--- 2012/4/15 19:14 509 regwizard.log -a--- 2012/4/15 19:14 9853 sanct.log _____________________________________________________________________________ PS C:\> get-childitem $home 目录: C:\Users\vol_20120330 Mode LastWriteTime Length Name ---- ------------- ------ ---- d-r-- 2012/3/30 18:27 Contacts d-r-- 2012/5/12 17:19 Desktop d-r-- 2012/5/12 17:18 Documents d-r-- 2012/5/12 5:34 Downloads d-r-- 2012/5/2 9:51 Favorites d-r-- 2012/3/30 18:27 Links d-r-- 2012/4/30 14:15 Music d-r-- 2012/3/30 18:27 Pictures d-r-- 2012/3/30 18:27 Saved Games d-r-- 2012/3/30 18:27 Searches d-r-- 2012/3/30 18:27 Videos -a--- 2012/5/12 17:25 10346 process.txt -a--- 2012/5/12 17:31 5254 process1.txt -a--- 2012/4/15 19:14 509 regwizard.log -a--- 2012/4/15 19:14 9853 sanct.log
Exp: 获取所有的子项,利用force参数
PS C:\> get-childitem -force 目录: C:\ Mode LastWriteTime Length Name ---- ------------- ------ ---- d--hs 2012/3/30 18:27 $Recycle.Bin d--hs 2009/7/14 12:53 Documents and Settings d---- 2012/3/30 18:30 DRIVERS d-rh- 2012/4/3 16:33 MSOCache d---- 2009/7/14 10:37 PerfLogs d-r-- 2012/5/5 16:00 Program Files d--h- 2012/5/5 16:00 ProgramData d--hs 2012/3/30 18:26 Recovery d--hs 2012/5/6 9:18 System Volume Information d-r-- 2012/3/30 18:27 Users d---- 2012/5/5 14:54 Windows -a--- 2009/6/11 5:42 24 autoexec.bat -a--- 2009/6/11 5:42 10 config.sys -a--- 2008/9/10 15:00 1724416 gdiplus.dll -a-hs 2012/5/12 3:32 1551273984 hiberfil.sys -a-hs 2012/5/12 3:32 2068369408 pagefile.sys
Exp:递归获取路径下的子项
PS C:\> get-childitem -path $home -recurse 目录: C:\Users\vol_20120330 Mode LastWriteTime Length Name ---- ------------- ------ ---- d-r-- 2012/3/30 18:27 Contacts d-r-- 2012/5/12 17:19 Desktop d-r-- 2012/5/12 17:18 Documents d-r-- 2012/5/12 5:34 Downloads d-r-- 2012/5/2 9:51 Favorites d-r-- 2012/3/30 18:27 Links d-r-- 2012/4/30 14:15 Music d-r-- 2012/3/30 18:27 Pictures d-r-- 2012/3/30 18:27 Saved Games d-r-- 2012/3/30 18:27 Searches d-r-- 2012/3/30 18:27 Videos -a--- 2012/5/12 17:25 10346 process.txt -a--- 2012/5/12 17:31 5254 process1.txt -a--- 2012/4/15 19:14 509 regwizard.log -a--- 2012/4/15 19:14 9853 sanct.log 目录: C:\Users\vol_20120330\Contacts Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2012/3/30 18:27 68381 vol_20120330.contact
get-childitem还有一个值得一提的功能: 就是支持通配符 * 、?和 [] ; 具体不举实例了,基本和cmd里面的通配符差不多。
3) new-item
通过new-item命令创建新项, 这个命令支持的常用参数有: path、itemtype。
path: 指定要创建的新项的存放位置
itemtype:指定要创建的新项的类型
Exp: 在 home路径下创建一个vol的文件夹,创建一个vol.txt 的文件
PS C:\Users\vol_20120330> new-item -path $home\vol.txt -itemtype file 目录: C:\Users\vol_20120330 Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2012/5/12 18:56 0 vol.txt
如上所示就为创建的文件。
PS C:\Users\vol_20120330> new-item -path $home\vol -itemtype directory 目录: C:\Users\vol_20120330 Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 2012/5/12 18:57 vol
如上所示创建的是文件夹/目录。
4、重命名项
利用rename-item来重命名项。
exp:
PS C:\Users\vol_20120330> rename-item vol.txt volcanol.txt _____________________________________________________________________________ PS C:\Users\vol_20120330> ls 目录: C:\Users\vol_20120330 Mode LastWriteTime Length Name ---- ------------- ------ ---- d-r-- 2012/3/30 18:27 Contacts d-r-- 2012/5/12 17:19 Desktop d-r-- 2012/5/12 17:18 Documents d-r-- 2012/5/12 5:34 Downloads d-r-- 2012/5/2 9:51 Favorites d-r-- 2012/3/30 18:27 Links d-r-- 2012/4/30 14:15 Music d-r-- 2012/3/30 18:27 Pictures d-r-- 2012/3/30 18:27 Saved Games d-r-- 2012/3/30 18:27 Searches d-r-- 2012/3/30 18:27 Videos d---- 2012/5/12 18:57 vol -a--- 2012/5/12 17:25 10346 process.txt -a--- 2012/5/12 17:31 5254 process1.txt -a--- 2012/4/15 19:14 509 regwizard.log -a--- 2012/4/15 19:14 9853 sanct.log -a--- 2012/5/12 18:56 0 volcanol.txt
如上所示,命令执行成功后vol.txt变为volcanol.txt; 注意rename-item不能用于移动项目。
5、移动项目
通过move-item移动项目
Exp: 通过move-item将当前路径下的volcanol.txt 移动到vol目录下
PS C:\Users\vol_20120330> cd vol _____________________________________________________________________________ PS C:\Users\vol_20120330\vol> ls _____________________________________________________________________________ PS C:\Users\vol_20120330\vol> move-item ..\volcanol.txt .\ _____________________________________________________________________________ PS C:\Users\vol_20120330\vol> ls 目录: C:\Users\vol_20120330\vol Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2012/5/12 18:56 0 volcanol.txt
如上所示,命令成功执行,volcanol.txt 被移动到vol目录下。
6、复制项
通过copy-item复制项,但是这里copy-item命令有一点特殊的特性,copy-item仅能复制容器,不能复制容器内的类容。
PS C:\Users\vol_20120330> copy-item vol .\desktop _____________________________________________________________________________ PS C:\Users\vol_20120330> get-childitem vol 目录: C:\Users\vol_20120330\vol Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2012/5/12 18:56 0 volcanol.txt _____________________________________________________________________________ PS C:\Users\vol_20120330> get-childitem .\Desktop 目录: C:\Users\vol_20120330\Desktop Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 2012/5/12 19:10 vol -a--- 2012/5/5 14:54 2001 QQ影音.lnk -a--- 2012/5/12 17:05 79858 截图00.jpg -a--- 2012/5/12 17:10 129290 截图01.jpg -a--- 2012/5/12 17:16 10264 截图02.jpg -a--- 2012/5/12 17:19 97789 截图03.jpg -a--- 2012/4/6 19:36 1007 腾讯QQ.lnk _____________________________________________________________________________ PS C:\Users\vol_20120330> get-childitem .\Desktop\vol _____________________________________________________________________________
如上面的执行情况所示,vol目录被成功的复制到desktop目录,但是vol下的volcanol.txt文件没有复制到desktop\vol下面。
为了复制容器下的项目需要添加recurse参数。
exp:复制容器下的项目
PS C:\Users\vol_20120330> copy-item vol .\desktop -recurse _____________________________________________________________________________ PS C:\Users\vol_20120330> get-childitem vol 目录: C:\Users\vol_20120330\vol Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2012/5/12 18:56 0 volcanol.txt _____________________________________________________________________________ PS C:\Users\vol_20120330> get-childitem .\Desktop 目录: C:\Users\vol_20120330\Desktop Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 2012/5/12 19:14 vol -a--- 2012/5/5 14:54 2001 QQ影音.lnk -a--- 2012/5/12 17:05 79858 截图00.jpg -a--- 2012/5/12 17:10 129290 截图01.jpg -a--- 2012/5/12 17:16 10264 截图02.jpg -a--- 2012/5/12 17:19 97789 截图03.jpg -a--- 2012/4/6 19:36 1007 腾讯QQ.lnk _____________________________________________________________________________ PS C:\Users\vol_20120330> get-childitem .\Desktop\volcanol PS C:\Users\vol_20120330> get-childitem .\Desktop\vol 目录: C:\Users\vol_20120330\Desktop\vol Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2012/5/12 18:56 0 volcanol.txt _____________________________________________________________________________
如上所示,vol下的文件也被复制。
7、删除项目
利用remove-item删除项目
Exp:利用remove-item删除上面复制的内容
PS C:\Users\vol_20120330> remove-item .\Desktop\vol _____________________________________________________________________________ PS C:\Users\vol_20120330> remove-item .\Desktop\vol -recurse _____________________________________________________________________________ PS C:\Users\vol_20120330> get-item .\Desktop\vol Get-Item : 找不到路径“C:\Users\vol_20120330\Desktop\vol”,因为该路径不存在。 所在位置 行:1 字符: 9 + get-item <<<< .\Desktop\vol + CategoryInfo : ObjectNotFound: (C:\Users\vol_20120330\Desktop\vo l:String) [Get-Item], ItemNotFoundException + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetIte mCommand
如上,第一个命令: “PS C:\Users\vol_20120330> remove-item .\Desktop\vol” 在执行的时候当vol下面有文件的时候,会弹出一个
对话框询问是否删除非空目录。
第二个命令: “PS C:\Users\vol_20120330> remove-item .\Desktop\vol -recurse” 将直接删除目录容器及其包含的内容,而且不提示,因此
在使用的时候需要注意。
第三个命令: “PS C:\Users\vol_20120330> get-item .\Desktop\vol” 的执行情况,说明第二个命令成功执行了。
7、执行项目
通过在PS中使用 invoke-item 命令可以实现执行项目的作用。
Exp: 在PS中执行$home
invoke-item $home #这个命令像在windows资源管理器中双击$home 目录一样,将会打开资源管理器,并且定位到$home目录。
三、小结
PS中关于重定向和文件目录管理的功能,还是非常易于使用的,掌握这些对系统管理将大有帮助。