内容简介: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》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
图解TCP/IP : 第5版
[日]竹下隆史、[日]村山公保、[日]荒井透、[日]苅田幸雄 / 乌尼日其其格 / 人民邮电出版社 / 2013-7-1 / 69.00元
这是一本图文并茂的网络管理技术书籍,旨在让广大读者理解TCP/IP的基本知识、掌握TCP/IP的基本技能。 书中讲解了网络基础知识、TCP/IP基础知识、数据链路、IP协议、IP协议相关技术、TCP与UDP、路由协议、应用协议、网络安全等内容,引导读者了解和掌握TCP/IP,营造一个安全的、使用放心的网络环境。 本书适合计算机网络的开发、管理人员阅读,也可作为大专院校相关专业的教学参考......一起来看看 《图解TCP/IP : 第5版》 这本书的介绍吧!