内容简介:PowerShell Switch 条件如果语句中有多路分支,使用IF-ELSEIF-ELSE不友好,可以使用Switch,看起来比较清爽一点。下面的例子将If-ElseIF-Else转换成Switch语句
PowerShell Switch 条件
如果语句中有多路分支,使用IF-ELSEIF-ELSE不友好,可以使用Switch,看起来比较清爽一点。
下面的例子将If-ElseIF-Else转换成Switch语句
# 使用 IF-ElseIF-Else
If( $value -eq 1 )
{
"Beijing"
}
Elseif( $value -eq 2)
{
"Shanghai"
}
Else
{
"Chongqing"
}
# 使用 Switch
switch($value)
{
1 {"Beijing"}
2 {"Shanghai"}
3 {"Chongqing"}
}
PowerShell IF-ELSEIF-ELSE 条件
Where-Object 进行条件判断很方便,如果在判断后执行很多代码可以使用IF-ELSEIF-ELSE语句。语句模板:
If(条件满足){如果条件满足就执行代码}Else{如果条件不满足}
条件判断必须放在圆括号中,执行的代码必须紧跟在后面的花括号中。
$n=8
if($n -gt 15) {"$n 大于 15 " }
if($n -gt 5) {"$n 大于 5 " }
8 大于 5
if($n -lt 0 ){"-1" } elseif($n -eq 0){"0"} else {"1"}
1
没有匹配条件
在IF-Else语句中如果没有合适的条件匹配,可以在Else中进行处理,同样在Switch语句中如果case中没有条件匹配,可以使用关键字Default进行处理。
如果碰到匹配条件时只处理一次,可以使用Break关键字
$value=99
# 使用 Switch 测试取值范围
switch($value)
{
5 { "等于5"; break}
{$_ -gt 0 } { "大于0"; break}
{$_ -lt 100} { "小于100"; break}
Default {"没有匹配条件"}
}
#大于0
大小写敏感
怎样在比较字符串时能够恢复为大小写敏感模式,Switch有一个-case 选项,一旦指定了这个选项,
比较运算符就会从-eq 切换到 -ceq,即大小写敏感比较字符串:
$domain="eddDEE"
#大小写敏感
switch -case ($domain)
{
"edDDEE" {"Ok 1"}
"EddDEE" {"Ok 2"}
"eddDEE" {"Ok 3"}
}
#Ok 3
使用通配符
字符串非常特殊,可是使用通配符,幸运的是PowerShell也支持,果然Power啊。但是在Switch语句后要指定 -wildcard 选项
$domain="xxx.x.com"
#使用通配符
switch -wildcard($domain)
{
"*" {"匹配'*'"}
"*.com" {"匹配*.com" }
"*.*.*" {"匹配*.*.*"}
}
匹配'*'
匹配*.com
匹配*.*.*
在字符串匹配中,比通配符功能更强大是正则表达式,PowerShell的Switch语句也支持,真是太棒了。当然需要给Switch关键字指定选项-regex
$mail="www@xxx.com"
#使用通配符
switch -regex ($mail)
{
"^www" {"www打头"}
"com$" {"com结尾" }
"d{1,3}.d{1,3}.d{1,3}.d{1,3}" {"IP地址"}
}
#www打头
#com结尾
同时处理多个值
Switch支持对集合所有元素进行匹配,下面的例子使用PowerShell Switch语句演示打印水仙花数:
$value=100..999
switch($value)
{
{[Math]::Pow($_%10,3)+[Math]::Pow( [Math]::Truncate($_%100/10) ,3)+[Math]::Pow( [Math]::Truncate($_/100) , 3) -eq $_} {$_}
}
#153
#370
#371
#407
0x02 PowerShell 流控制语句
1. PowerShell Do While 循环
Do和While可能产生死循环,为了防止死循环的发生,你必须确切的指定循环终止的条件。指定了循环终止的条件后,一旦条件不满足就会退出循环。
继续与终止循环的条件
do-while()会先执行再去判断,能保证循环至少执行一次。
do { $n=Read-Host } while( $n -ne 0)
10
100
99
20
0 (退出了)
如果你知道循环的确切次数可以使用For循环,For循环属于计数型循环,一旦达到最大次数,循环就会自动终止。
下面的例子通过循环求1-100的数列和。
$sum=0
for($i=1;$i -le 100;$i++)
{
$sum+=$i
}
$sum
2. For循环是特殊类型的While循环
在For循环开始的圆括号中,由分号隔开的语句为循环的控制条件,分别为:初始化,循环执行满足的条件,增量。
For循环的控制语句第一个和第三个可以为空:
$sum=0
$i=1
for(;$i -le 100;)
{
$sum+=$i
$i++
}
$sum
下面的例子演示逐行读取文本文件
for($file=[IO.File]::OpenText("C:\Users\w0nd\Desktop\mimi1.txt") ; !($file.EndOfStream);$line=$file.ReadLine() )
{
$line;
}
$file.Close()
label,break,continue,例:
for ($i = 0; $i -le 15; $i++)
{
if ($i % 2)
{ continue }
if ($i -eq 10)
{ break }
$i
}
:outer while ($true)
{
while ($true)
{ break outer }
}
3. PowerShell ForEach-Object 循环
PowerShell管道就像流水线,对于数据的处理是一个环节接着一个环节,
如果你想在某一环节对流进来的数据逐个细致化的处理,可是使用ForEach-Object,$_ 代表当前的数据。
对管道对象逐个处理
如果使用Get-WmiObject 获取系统中的服务,为了排版可能会也会使用Format-Table对结果进行表格排版。
Get-WmiObject win32_service | ft DisplayName,processid,state -AutoSize
但是如果想对每个服务进行更定制化的处理可是使用ForEach-Object
Get-WmiObject Win32_Service | ForEach-Object {"Name:"+ $_.DisplayName, ", Is ProcessId more than 100:" + ($_.ProcessId -gt 100)}
结合条件处理
ForEach-Object的处理可以包含任意PowerShell脚本,当然也包括条件语句
Get-WmiObject Win32_Service | ForEach-Object {if ($_.ProcessId -gt 3000){ "{0}({1})" -f $_.DisplayName,$_.ProcessID}}
-->
Client License Service (ClipSVC)(6072)
SSDP Discovery(3224)
Windows Modules Installer(4572)
Windows Search(5008)
调用方法
在ForEach-Object中,$ 代表当前对象,当然也允许通过$ ,调用该对象支持的方法。
下面的例子杀死所有IE浏览器进程:
Get-Process iexplore
Get-Process iexplore | ForEach-Object {$_.kill()}
4. PowerShell Foreach 循环
Foreach-object 为cmdlet命令,使用在管道中,对管道结果逐个处理,foreach为遍历集合的关键字
下面举两个例子:
$array=7..10
foreach ($n in $array)
{
$n*$n
}
or 1..10 | % {$a=$_ ; foreach($xx in $a){$xx * $xx}}
#49
#64
#81
#100
foreach($file in dir c:\windows)
{
if($file.Length -gt 1mb)
{
$File.Name
}
}
or foreach($file in dir c:\windows){if($file.Length -gt 1mb) { $File.Name}}
#explorer.exe
#WindowsUpdate.log
这里只为了演示foreach,其实上面的第二个例子可以用Foreach-Object更简洁。
dir C:\Windows | where {$_.length -gt 1mb} |foreach-object {$_.Name}
0x03 PowerShell定义函数
1. 函数是自定义的PowerShell代码,有三个原则
简短:函数名简短,并且显而易见。 聚合:函数可以完成多个操作。 封装和扩展:将一批PowerShell语句进行封装,实现全新的功能需求。
函数的结构由三部分组成:函数名,参数,函数体
2. 使用函数作为别名
假如PowerShell不支持”cd..” 命令,你可以通过定义函数实现这个功能:
Function cd.. { cd ..} 或者Function xx { cd ..} 之后运行xx就可以了
假如PowerShell不支持Ping命令,也可以如法炮制:
ping.exe : -n count Number of echo requests to send.
Function Ping2 { PING.EXE -n 1 $args }
ping2 xx.com
del function:ping2
3. PowerShell处理函数的参数
PowerShell函数可以接受参数,并对参数进行处理。函数的参数有3个特性:
任意参数:内部变量$args 接受函数调用时接受的参数,$args是一个数组类型。 命名参数:函数的每一个参数可以分配一个名称,在调用时通过名称指定对应的参数。 预定义参数:函数在定义参数时可以指定默认值,如果调用时没有专门指定参数的值,就会保持默认值。
$args 万能参数
给一个函数定义参数最简单的是使用$args这个内置的参数。它可以识别任意个参数。尤其适用哪些参数可有可无的函数。
function sayHello
{
if($args.Count -eq 0)
{
"No argument!"
}
else
{
$args | foreach {"Hello,$($_)"}
}
}
多个参数调用时:
sayHello LiLi Lucy Tom Hello,LiLi Hello,Lucy Hello,Tom
因为$args是一个数组,可以用它求和
function Add
{
$sum=0
$args | foreach {$sum=$sum+$_}
$sum
}
Add 10 7 3 100
#120
function StringContact($str1,$str2)
{
return $str1+$str2
}
StringContact cc dd
StringContact -str1 word -str2 press
ccdd
wordpress
function DayOfWeek([datetime]$date)
{
return $date.DayOfWeek
}
DayofWeek '1927-8-1'
#Monday
DayofWeek 2008-8-1
#Friday
Switch 参数
PowerShell函数最简单的参数类型为布尔类型,除了使用Bool类型,也可以使用Switch关键字。
下面的函数逆转字符串,但是可以通过$try 参数进行控制,如果没有指定$try的值,默认值为$false
function tryReverse( [switch]$try , [string]$source )
{
[string]$target=””
if($try)
{
for( [int]$i = $source.length -1; $i -ge 0 ;$i–)
{
$target += $source[$i]
}
return $target
}
return $source
}
tryReverse -source www.xxx
tryReverse -try $true -source www.xxx
->
xxx.www
PowerShell指定函数的返回值
一个或多个返回值
function Square([double]$num)
{
return $num*$num
}
#在控制台输出结果
Square 9.87
#97.4169
#将结果赋值给变量
$value=Square 9.87
$value
#97.4169
#返回值为Double类型
$value.GetType().FullName
#System.Double
Return语句
PowerShell会将函数中所有的输出作为返回值,但是也可以通过return语句指定具体的我返回值。
Return 语句会将指定的值返回,同时也会中断函数的执行,return后面的语句会被忽略。
function test($num)
{
1
9
return 10
4
6
}
test
# 1 和 9 作为输出会返回
# return语句中的10 也会返回
# return 语句后的4和6会被忽略
从函数的返回值中消除输出
函数默认会将函数中的所有输出作为函数的返回值返回,这样很方便。但有时可能会将不必要的输出误以为返回值。写脚本程序时,
可能需要自定义一些函数,这个函数可能只需要一个返回值,但是为了提高函数的可读性,可能会在函数增加一些注释输出行。
Function Test()
{
"Try to calculate."
"3.1415926"
"Done."
}
#保存在变量中输出,
$value=Test
$value
# Try to calculate.
# 3.1415926
# Done.
#如果要过滤注释,只输出,不作为返回值,
#可以使用Write-Host命令
Function Test()
{
Write-Host "Try to calculate."
"3.1415926"
Write-Host "Done."
}
# 在变量值中保存返回值,在控制台输出注释行
$value=Test
# Try to calculate.
# Done.
# 测试返回值
$value
# 3.1415926
使用调试信息报告
可能输出这些函数中临时提示信息,给函数的返回值造成干扰。要解决这个问题,除了上述的Write-Host,也可以使用Write-Debug命令。
Function Test()
{
Write-Debug "Try to calculate."
"3.1415926"
Write-Debug "Done."
}
# Debug调试信息只会在调试模式下被输出
$value=Test
# 3.1415926
#如果你想通过显示调试信息调试函数,可以开启调试模式
$DebugPreference="Continue"
$value=Test
# DEBUG: Try to calculate.
# DEBUG: Done.
# 测试返回值
$value
# 3.1415926
#如果关闭调试模式,这些调试信息自然不会输出
$DebugPreference="SilentlyContinue"
$value=Test
抑制错误信息
函数中的错误信息,也有可能作为返回值的一部分,因为默认这些错误信息会直接输出。
Function ErrorTest()
{
#该进程不存在
Stop-Process -Name "xxx"
}
ErrorTest
Stop-Process : 找不到名为"xxx"的进程。
很明显,类似这样的错误提示信息,对调试程序很重要,但如果你觉得它不重要,特意要隐藏,可以使用$ErrorActionPreference进行设置。
Function ErrorTest()
{
#从这里开始隐藏所有的错误信息
$ErrorActionPreference="SilentlyContinue"
Stop-Process -Name "www.xxx"
#该进程不存在
}
#错误信息不会输出
ErrorTest
PS E:xxx> Function output
>> {
>> $input
>> }
>>
PS E:xxx> output
PS E:xxx> 1,2,3 | output
1
2
3
PS E:xxx> dir | output
目录: E:xxx
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2012/2/28 23:34 a
d---- 2012/2/28 23:35 b
0x04 PowerShell 编写和运行脚本
1. 通过重定向创建脚本
如果您的脚本不是很长,您甚至可以直接在控制台中要执行的语句重定向给一个脚本文件。
PS E:> '"Hello,PowerShell Script"' > MyScript.ps1 PS E:> .\MyScript.ps1 Hello,PowerShell Script
脚本文件通过@‘‘@闭合起来 (PowerShell ISE):
@'
get-date
$env:commonProgramfiles
#note : script end
"files count"
(ls).count
#note : script really end
'@ > 11.ps1
输出 ->
Monday, August 14, 2017 1:36:26 AM
C:\Program Files\Common Files
files count
106
Here-String以 @’开头,以‘@结束.任何文本都可以存放在里面,哪怕是一些特殊字符,空号,白空格。
但是如果您不小心将单引号写成了双引号,PowerShell将会把里面的变量进行解析。
2. 执行策略限制
PowerShell一般初始化情况下都会禁止脚本执行。脚本能否执行取决于PowerShell的执行策略。
PS E:> .\MyScript.ps1
无法加载文件 E:MyScript.ps1,因为在此系统中禁止执行脚本….
PS E:> Get-ExecutionPolicy Restricted PS E:> Set-ExecutionPolicy RemoteSigned 执行策略更改 脚本执行策略类型为:Microsoft.PowerShell.ExecutionPolicy 查看所有支持的执行策略: PS E:> [System.Enum]::GetNames([Microsoft.PowerShell.ExecutionPolicy]) Unrestricted RemoteSigned AllSigned Restricted Default Bypass Undefined Unrestricted:权限最高,可以不受限制执行任何脚本。 Default:为PowerShell默认的策略:Restricted,不允许任何脚本执行。 AllSigned:所有脚本都必须经过签名才能在运行。 RemoteSigned:本地脚本无限制,但是对来自网络的脚本必须经过签名。 if: Import-Module : File Invoke-Phant0m.ps1 is not digitally signed. You cannot run this PS C:\> Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass ===> ok
3. 像命令一样执行脚本
怎样像执行一个命令一样执行一个脚本,不用输入脚本的相对路径或者绝对路径,甚至*.ps1扩展名。
那就将脚本的执行语句保存为别名吧:
PS E:> Set-Alias Invok-MyScript .11.ps1
PS E:> Invok-MyScript
Monday, August 14, 2017 1:36:26 AM
C:\Program Files\Common Files
files count
106
@'
For($i=0;$i -lt $args.Count; $i++)
{
Write-Host "parameter $i : $($args[$i])"
}
'@ >111.ps1
PS C:\Users\w0nd\Desktop> .\111.ps1 dd 3232 4 2
parameter 0 : dd
parameter 1 : 3232
parameter 2 : 4
parameter 3 : 2
4. PowerShell 增强脚本的可读性
在脚本中使用函数
要在脚本中使用函数,最简单的方法自然是将函数直接写在脚本中:
param([int]$n=$(throw "请输入一个正整数"))
Factorial $n
Function Factorial([int]$n)
{
$total=1
for($i=1;$i -le $n;$i++)
{
$total*=$i
}
return $total
}
PS C:\Users\w0nd> .\12.ps1 10
3628800
将脚本分为工作脚本和类库
真正的脚本开发需要处理的问题可能包含许多函数。如果在一个脚本的开头定义许多函数,脚本会显得很凌乱。
把函数和工作脚本分开,可以隔离函数,使它不容易被修改。
将Factorial函数保存在PSLib.ps1
Function Factorial([int]$n)
{
$total=1
for($i=1;$i -le $n;$i++)
{
$total*=$i
}
return $total
}
将脚本修改为:
param([int]$n=$(throw "请输入一个正整数"))
. .PSLib.ps1
Factorial $n
PS C:\Users\w0nd> .\12.ps1 10
3628800
5. PowerShell 创建管道脚本
低速顺序模式
如果你在脚本中使用管道,脚本收集上一个语句的执行结果,默认保存在$input自动变量中。
但是直到上一条语句完全执行彻底,管道脚本才会执行。
@'
foreach ($element in $input)
{
if($element.Extension -eq ".exe")
{
Write-Host -fore "red" $element.Name
}
else
{
Write-Host -fore "Green" $element.Name
}
}
'@ > 12.ps1
PS C:\Users\YvY> ls $env:APPDATA | .\12.ps1
Adobe
Everything
Microsoft
Notepad++
高速流模式
在PowerShell脚本的处理中,绝大多数情况下遇到的都是集合,一旦上一条命令产生一个中间结果,
下一条命令就对这个中间结果及时处理,及时释放资源。这样可以节省内存,也减少了用户的等待时间。在处理大量数据时,尤其值得推荐。
高速流模式的管道定义包括三部分:begin,process,end。上面的描述中提到了中间结果,中间结果保存在$_自动化变量中。
@'
begin
{
Write-Host "管道脚本环境初始化"
}
process
{
$ele=$_
if($_.Extension -ne "")
{
switch($_.Extension.tolower())
{
".ps1" { Write-Host -fore "red" "脚本文件:"+ $ele.name}
".txt" { Write-Host -fore "red" "文本文件:"+ $ele.Name}
".gz" { Write-Host -fore "red" "压缩文件:"+ $ele.Name}
".exe" { Write-Host -fore "green" "exe文件:"+ $ele.Name}
".log" { Write-Host -fore "red" "日志文件:" + $ele.Name} # +号后面必须有空格
}
}
}
end
{
Write-Host "管道脚本环境恢复"
}
'@ > test.ps1
6. PowerShell自动执行脚本之profile
在PowerShell控制台的许多更改只会在当前会话有效。一旦关闭当前控制台,你自定义地所有别名、函数、和其它改变将会消失,
除非将更改保存在windows环境变量中。这也就是为什么我们需要profile来保存一些基本的初始化工作。
四中不同的profile脚本
PowerShell支持四种可以用来初始化任务的profile脚本。
应用之前要弄清楚你的初始化是当前用户个人使用,还是所有用户。
如果是个人使用,可以使用”当前用户profile”,但是如果你的初始化任务是针对所有用户,可是使用”所有用户profile”。
Profile 描述 位置 所有用户 所有用户共有的profile $pshomeprofile.ps1 所有用户(私有) PowerShell.exe 中验证。 $pshomeMicrosoft.PowerShell_profile.ps1 当前用户 当前用户的profile $((Split-Path $profile -Parent) + "profile.ps1") 当前用户(私有) 当前用户的profile;只在PowerShell.exe中验证 $profile
创建自己的profile
Profile脚本并不是强制性的,换言之,profile可有可无。下面会很方便的创建自己的profile。
在控制台执行:
notepad $((Split-Path $profile -Parent) + "profile.ps1") ===> C:\Users\w0nd\Documents\WindowsPowerShellprofile.ps1
如果不存在profile默认会创建,在打开的记事本中输入: Set-Alias edit notepad.exe
也就是给notepad添加edit别名,保存关闭,之后重启控制台,输入:
edit $((Split-Path $profile -Parent) + "profile.ps1")
控制台会调用记事本打开之前的profile,可见edit别名已经生效。
脚本的数字签名
http://www.pstips.net/PowerShell-scripts-signature.html [没看懂]
PowerShell错误处理
what-if
http://www.pstips.net/PowerShell-what-if.html [没看懂]
0x05 PowerShell命令发现和脚本块
1. PowerShell 发现命令
PS C:> Get-command LS CommandType Name Definition ----------- ---- ---------- Alias ls Get-ChildItem
如果你想查看更加详细的信息可以使用:
PS C:>Get-Command ls | fl *
事实上,Get-Command 返回的是一个对象CommandInfo,ApplicationInfo,FunctionInfo,或者CmdletInfo;
PS C:> $info = Get-Command ping PS C:> $info.GetType().fullname System.Management.Automation.ApplicationInfo
通过函数可以重写ipconfig ,一旦删除该函数,原始的ipconfig才会重新登上历史的舞台:
PS C:> function ipconfig () {}
PS C:> ipconfig
PS C:> del Function:ipconfig
2. PowerShell 语句块
脚本块是一种特殊的命令模式。一个脚本块可以包含许多的 PowerShell命令和语句。它通常使用大括号定义。
最小最短的脚本块,可能就是一对大括号,中间什么也没有。可以使用之前的调用操作符”&”执行脚本块:
PS C:\Users\w0nd> & {"当前时间:" + (get-date) }
当前时间:07/06/2018 23:01:37
将命令行作为整体执行
可能你已经意识到,在PowerShell中,调用操作符不但可以执行一条单独的命令,还可以执行”命令行”.
最方便的方式就是讲你的命令行放在一个语句块中,作为整体。
在之前的文章中说过,调用操作符只能执行一条命令,但是借助语句块的这把利器,
可以让调用操作符执行,多条PowerShell命令,例如:
PS C:\Users\w0nd> & {$files=ls;Write-Host "文件数:" $files.Count }
文件数: 21
执行表达式
另外还有一条PowerShell命令集,Invoke-Expression=IEX,这条命令的逻辑就是将一条字符串传递给调用操作符。例如:
PS C:\Users\w0nd> iex ‘Get-Process | Where-Object { $_.Name -like “e*”}’
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
126 8 1844 1904 1.06 732 0 Everything
253 16 18532 17872 3.91 3936 1 Everything
808 45 44380 45352 5.27 4968 1 EXCEL
2007 105 50536 99288 271.77 3100 1 explorer
这里有一点需要注意,在传递给invoke-expression的字符串使用了单引号,单引号可以防止变量被替换。
如果上面的命令使用了双引号,会先去解释$ .name,但是当前作用域中,$ .Name 为null,所以结果不是期望的。
管道中的foreach-object语句块
管道中的foreach-object本身后面也会带语句块,针对数组中的每一个元素分别传递给语句块处理。 例如:
http://www.pstips.net/PowerShell-using-scriptblocks.html
向命令,函数和文件脚本传递文件
因为Dir的结果中返回的是独立的文件或目录对象,Dir可以将这些对象直接交付给其它命令或者你自己定义的函数与脚本。
这也使得Dir成为了一个非常重要的的选择命令
将多个Dir 命令执行的结果结合起来。
$list1 = Dir $env:windir\system32\*.dll
$list2 = Dir $env:programfiles -recurse -filter *.dll
$totallist = $list1 + $list2
$totallist | ForEach-Object {
$info =
[system.diagnostics.fileversioninfo]::GetVersionInfo($_.FullName);
"{0,-30} {1,15} {2,-20}" -f $_.Name, `
$info.ProductVersion, $info.FileDescription
}
# 只列出目录::
Dir | Where-Object { $_ -is [System.IO.DirectoryInfo] }
Dir | Where-Object { $_.PSIsContainer }
Dir | Where-Object { $_.Mode.Substring(0,1) -eq "d" }
# 只列出文件:
Dir | Where-Object { $_ -is [System.IO.FileInfo] }
Dir | Where-Object { $_.PSIsContainer -eq $false}
Dir | Where-Object { $_.Mode.Substring(0,1) -ne "d" }
Dir $home -filter *.ps1 -recurse -filter支持简单的模式匹配
Dir $home -include *.ps1 -recurse -include支持正则表达式
Where-Object也可以根据其属性来过滤。
通过管道过滤2007年5月12日后更改过的文件:
Dir | Where-Object { $_.CreationTime -gt [datetime]::Parse("May 12, 2007") }
也可以使用相对时间获取2周以内更改过的文件:
Dir | Where-Object { $_.CreationTime -gt (Get-Date).AddDays(-14) }
Dir -Recurse | Where-Object { $_.CreationTime -gt (Get-Date).AddDays(-14) }
相对路径转换成绝对路径
当Resolve-Path命令只有在文件确实存在时,才会有效。
PS> Resolve-Path $env:windir\*.log
构造路径
$path = [Environment]::GetFolderPath("Desktop") + "\file.txt"
使用命令 Join-Path方法,或者.NET中的Path静态类。
$path = Join-Path ([Environment]::GetFolderPath("Desktop")) "test.txt"
$path = [System.IO.Path]::Combine([Environment]::GetFolderPath("Desktop"), "test.txt")
Path类还包含了许多用来合并或者获取目录特定信息的额外方法。你只需要在下面表格中列出的方法中前加[System.IO.Path]::,比如:
[System.IO.Path]::ChangeExtension("test.txt", "ps1")
test.ps1
使用Get-Process返回所有的当前进程 ,但是你可能并不对所有的进程感兴趣
Get-Process | select -First 1 | fl *
然后通过每个Process对象的属性进行过滤。首先得知道每个对象支持那些属性
根据进程名过滤(显示)所有记事本进程
Get-Process | Where-Object {$_.Name -eq "notepad"}
根据company过滤所有产品发布者以”Microsoft”打头的进程:
Get-Process | Where-Object {$_.company -like '*Microsoft*' }| select Name,Description,Company
Where-Object的使用概率比较高,所以有一个很形象的别名 ?
Get-Service | ? {$_.Name -like "B*"}
以上所述就是小编给大家介绍的《PowerShell Tips》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Building Web Reputation Systems
Randy Farmer、Bryce Glass / Yahoo Press / 2010 / GBP 31.99
What do Amazon's product reviews, eBay's feedback score system, Slashdot's Karma System, and Xbox Live's Achievements have in common? They're all examples of successful reputation systems that enable ......一起来看看 《Building Web Reputation Systems》 这本书的介绍吧!
MD5 加密
MD5 加密工具
XML、JSON 在线转换
在线XML、JSON转换工具