首页 > 其他分享 >第25章 额外的提示,技巧以及技术

第25章 额外的提示,技巧以及技术

时间:2023-02-04 16:00:10浏览次数:48  
标签:Profile 25 额外 技巧 PS 运算符 字符串 脚本 PowerShell

第25章 额外的提示,技巧以及技术

  到目前为止,一个月的“午饭学习时间”已经接近尾声。因此我们想给你分享一些额外的提示与技巧完成这次学习之旅。

25.1 Profile、提示以及颜色:自定义Shell界面

25.1.1 PowerShell Profile脚本

  首先PowerShell引擎会执行命令,然后托管应用程序再显示执行结果。托管应用程序的另一个功能是当新开一个Shell窗口时,载入和运行Profile脚本。
  这些Profile脚本可被用作自定义PowerShell的运行环境——能够自定义的包括:载入SnapIn管理单元或模块,切换到另外的路径,定义需要使用的功能等。例如:下面是在Don在计算机上使用的一个Profile脚本。

Import-Module ActiveDirectory
Add-PSSnapIn SqlServerCmdletSnapIn100

  该Profile载入了Don最常用的两个Shell的扩展程序,并修改根路径为C盘。
  在PowerShell中,并没有默认的Profile脚本存在,你创建的Profile脚本会依赖于你期望该脚本的工作方式。
  下面是控制台宿主尝试载入的一些文件,以及尝试载入这些文件的顺序。
  (1)$PsHome/Profile.PS1——不管使用何种托管应用程序,计算机上的所有用户都会执行该脚本(请记住,PowerShell已经预定义了$PSHome,该变量包含PowerShell的安装文件夹的路径)。
  (2)$PsHome/Microsoft.PowerShell.PS1——如果该计算机上的用户使用了控制台宿主,那么就会执行该脚本。如果他们使用的是PowerShell的ISE,那么会执行$PsHome/Microsoft.PowerShellISE.Profile.ps1脚本。
  (3)$Home/Documents/WindowsPowerShell/Profile.PS1——无论用户使用的是何种托管程序,只有当前用户会执行该脚本(因为该脚本存在于用户的根目录下)。
  (4)$Home/Documents/WindowsPowerShell/Microsoft.PowerShell_Profile.PS1——只有当前使用PowerShell控制台的用户才会执行该脚本。如果用户使用的是PowerShell ISE,那么会执行$Home/Documents/WindowsPowerShell/Microsoft.PowerShellISE_Profile.PS1。
  如果上面脚本中某一个或者几个不存在,那么也没关系。托管应用程序会跳过不存在的脚本,继续寻找下一个可用的脚本。
  $PsHome是包含PowerShell安装路径信息的内置变量;大部分操作系统中,该变量的值是C:\Windows\System32\WindowsPowerShell\V1.0。
  因为期望将相同的Shell扩展程序载入到PowerShell,而不管使用控制台还是ISE,所以我们选择自定义$Home\Document\WindowsPowerShell\Profile.PS1——因为该Profile脚本在微软提供的两种托管应用程序中都可以运行。
  请记住,Profile脚本也仅是脚本而已,它会依赖于PowerShell的当前执行策略。如果设置的执行策略是Restricted,那么Profile脚本就无法运行;如果设置的执行策略是AllSigned,那么Profile脚本必须经过签名才能运行。

25.1.3 调整颜色

  默认的文本前景色与后景色都可以通过单击PowerShell命令窗口左上角的边框来修改。选择“属性”,之后切换到“颜色”标签页。
  修改错误、警告以及其他信息的颜色略微有点复杂,需要通过运行命令才能实现。但是你可以将这部分命令放到Profile脚本中,这样每次进入PowerShell时,都会执行这些命令。比如下面的命令可以将错误消息的前景色修改为绿色,这样你可以觉得稍微舒缓一点。
(Get-Host).PrivateData.ErrorForegroundColor="Green"

25.2 运算符:-AS、-IS、Replace、-Join、Split、-IN、-Contains

  这些额外的运算符在多种情形下都非常有用,可以通过它们来处理数据类型、集合与字符串。

25.2.1 -AS和-IS

  -AS运算符会将一种已存在的对象转换为新的对象类型,从而产生一个新的对象。例如,如果存在一个包含小数的数字(可能来自一个除法计算),可以通过Converting或者Casting将该数字转化为一个整数。
1000 / 3 -AS [INT]
  语句的结构:首先是一个被转换的对象,然后是-AS运算符,最后是一个中括号,中括号中包含转化之后的类型。这些类型可以是[string]、[XML]、[INT]、[Single]、[Double]、[Datetime]等,罗列的这些类型应该是你经常用到的类型。从技术来讲,在该示例中,将数值转化为整数是指将小数部分通过四舍五入方式转为整数,而并不是简单地将小数部分去掉。

  -IS运算符通过类似方式实现。该运算符主要用于判断某个对象是否为特定类型,如果是,则返回True,否则为False。比如下面的这些示例。

123.45 -IS [INT]
"SERVER-R2" -IS [String]
$True -IS [Bool]
(Get-Date) -IS [DateTime]

25.2.2 -Replace

  -Replace运算符主要用于在某个字符串中寻找特定字符(串),最后将该字符(串)替换为新的字符(串)。

PS C:\>"192.168.34.12" -Replace "34","15"
192.168.15.12

25.2.3 -Join和-Split

  -Join和-Split运算符主要用作将数组转化为分隔列表和将分隔列表转化为数组。例如,存在包含5个元素的数组。

PS C:\>$Array = "one","two","three","foure","five"
PS C:\>$Array
one
two
three
four
five

  因为PowerShell会自动将逗号隔开的列表识别为一个数组,所以上面的命令可以执行成功。假如现在需要将这个数组里的值转换为以管道隔开的字符串,可以通过-Join来实现。

PS C:\>$Array -Join "|" 
one|two|three|four|five

  同时,我们可以使用-Split运算符实现相反的效果:它会从一个分隔的字符串中产生一个数组。例如,假如存在仅包含一行四列数据的一个文件,在该文件中以制表符对列进行隔离。将该文件的内容显示出来,类似下面这样。

PS C:\>Gc Computers.tdf
Server1 Windows East Managed

  你可以通过-Split运算符将该内容拆成4个独立的数组元素。

PS C:\>$Array = (Gc Computers.tdf) -Split "`t"
$Array
Serverl
Windows
East
Managed

  请注意,这里我们使用转义字符、一个重音符及一个“t”(`t)表示制表符。这些字符必须包含在一个双引号中,这样PowerShell才能识别该转义字符。
  产生的数组中包含4个元素,可以通过它的索引编号单独查询对应元素。

PS C:\>$Array[0]
Server1

25.2.4 -Contains和-In

  -Contains运算符对PowerShell初学者而言可能比较容易混淆。他们可能会尝试下面的脚本。

PS C:\>'this' -Contains '*his*'
False

  实际上,他们是期望运行-like运算符。

PS C:\>'this' -Like '*his*'
True

  -Like运算符用于进行通配符比较运算。-Contains运算符主要用作在一个集合中查找是否存在特定对象。比如,创建包含多个字符串对象的一组集合,然后检查特定对象是否包含在该集合中。

PS C:\>$Collection = 'abc','def','ghi','jkl'
PS C:\>$Collection -Contains 'abc'
True
PS C:\>$Collection -Contains 'xyz'
False

  -In运算符实现相同的功能,但是它会颠倒运算对象的顺序。也就是说,集合在右边,而需要检查的对象在左边。

PS C:\>$Collection = 'abc','def','ghi','jkl'
PS C:\>'abc' -IN $Collection
True
PS C:\>'xyz' -IN $Collection
False

25.3 字符串处理

  假如存在一个字符串,你需要将该字符串全部转化为大写,或者你可能需要取得该字符串的最后3个字符。那么该如何实现?
  在PowerShell中,字符串是对象,所以会存在多种方法(Method)。
PS C:\>"Hello" | gm

  下面是一些比较有用的String方法。

  • IndexOf()会返回特定字符在字符串中的位置。
  • Split(),Join()和Replace()类似于上面讲到的-Split,-Join和-Replace。但是我们更加倾向于使用PowerShell的运算符而不是String的方法。
  • ToLower()和ToUpper()可以将字符串转化为小写或大写。
  • Trim()会将一个字符串的前后空格去掉;TrimStart()和TrimEnd()会将一个字符串的前面或者后面的空格去掉。
PS C:\>$UserName = " Don"
PS C:\>$UserName.Trim()
Don

25.4 日期处理

  和String类型对象一样,Date(如果你喜欢,也可以是DateTime)对象也包含多个方法。通过这些方法,可以对日期和时间进行处理和计算。
PS C:\>Get-Date | Gm
  请记住,通过上面列表中的属性可以访问一个DateTime的部分数据,比如日期、年或者月。

PS C:\>(Get-Date).Month
10

  上面列表中的方法可以实现两个功能:计算或者将DateTime转化为其他格式。例如,假如需要获取90天之前的日期,使用AddDays()方法和一个负数参数实现。

PS C:\>$Today = Get-Date
PS C:\>$90DaysAgo = $Today.AddDays(-90)
PS C:\>$90DaysAgo
2014年12月19日 9:36:47

  名称中以“To”开头的方法可以实现将日期以及时间转化为某种特定格式,比如短日期类型。

PS C:\>$90DaysAgo.ToShortDateString()
2014/12/19

25.5 处理WMI日期

  在WMI中存储的日期和时间格式都难以直接利用。例如,Win32_OperatingSystem类主要用来记录计算机上一次启动的时间,其上期和时间格式如下。

PS C:\>Get-WMIObject Win32_OperatingSystem | Select LastBootUptime
LastBootUpTime
----------------
20150317090459.125599+480

  PowerShell的设计者知道直接使用这些信息会比较困难,所以他们对每一个WMI对象添加了一组转换方法。将WMI对象通过管道发送给Gm,请注意观察最后两个方法。
PS C:\>WMIObject Win32_OperatingSystem | Gm

  将输出结果集中间的大部分信息去除,这样你能很轻易地发现后面的ConvertFromDateTime()方法和ConvertToDateTime()方法。在该示例中,获取到的是WMI的日期和时间。假如需要转化为正常的日期和时间格式,请参照下面的命令。

PS C:\>$OS = Get-WMIObject Win32_OperatingSystem
PS C:\>$OS.ConvertToDateTime($OS.LastBootUpTime)
2015年3月17日 9:04:59

  如果你期望将正常的日期和时间信息放入一个正常表中,你可以通过Select-Object或者Format-Table命令创建自定义计算列以及属性。

PS C:\>Get-WMIObject Win32_OperatingSystem | Select BuildNumber,__Server,@{l='LastBootTime';E={$_.ConvertToDateTime($_.LastBootUpTime)}}
BuildNumber		_Server		LastBootTime
7601 			SERVER1		2015/3/17 9:04:59

标签:Profile,25,额外,技巧,PS,运算符,字符串,脚本,PowerShell
From: https://www.cnblogs.com/evan-whc/p/17091710.html

相关文章

  • ZOJ4125 Sekiro
    题目:​​点击这里​​题意:求n对2取k次余数,如果n为奇数,n+1后再取余。给的数据量很大,单纯遍历就会超时。当n==0时直接输出0,需要特判。有两种方法。当k>=32时,直接输出1.在循环......
  • 「 每日一练,快乐水题 」1252. 奇数值单元格的数目
    文章目录​​......
  • window系统使用技巧
    一、如何以管理员的身份运行程序?方式1先找到应用程序,右击以管理员身份运行  方式2,找到程序所在位置--属性--兼容性--以管理员身份运行   ......
  • 最基本的25道深度学习面试问题和答案
    近年来,对深度学习的需求不断增长,其应用程序被应用于各个商业部门。各公司现在都在寻找能够利用深度学习和机器学习技术的专业人士。在本文中,将整理深度学习面试中最常被问......
  • C++ 交叉编译技巧
    本文是借鉴的有关C相关的文章,由于C与C++有部分相似,此处用C距离,还没有验证过用C语言写一个小程序,在设计时希望该程序在Windows、Linux平台上都能够运行,所以使用宏来......
  • 代码随想录算法训练营第十七天 | 110.平衡二叉树,257. 二叉树的所有路径,404.左叶子之和
    一、昨日回顾与补充今天看了Day16讲解的视频,对于求二叉树最大深度、最小深度以及求完全二叉树的节点个数有了新的理解,总结如下:1.深度和高度的区别(之前就看看定义忽略......
  • 最完美WIN10_Pro_22H2.19045.2546软件选装纯净版VIP39.0
    【系统简介】=============================================================1.本次更新母盘来WIN10_Pro_22H2.19045.2546。进一步优化调整。2.此版本精简量不大,满足各大平......
  • codeforces 1257E The Contest(lis)
    题意:3堆数,要求使得第一堆的数为前缀,第三堆数为后缀,第二堆数为剩下的数,要求最少调整多少个数的位置使得要求成立。其实就是就把a1,a2,a3排个序然后拼成一个数组,问题转为一个......
  • codeforces 1257C Dominated Subarray
    题意就是找到一个最小的子区间使得这个区间中只有一个数的个数为2.AC代码:#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<vector>#inclu......
  • POJ 2253 Frogger(并查集+二分||Dijkstra)
    DescriptionFreddyFrogissittingonastoneinthemiddleofalake.SuddenlyhenoticesFionaFrogwhoissittingonanotherstone.Heplanstovisither,but......