PowerShell的Exit与Return

合集下载

powershell常用命令总结

powershell常用命令总结

powershell常用命令总结PowerShell是一种功能强大的脚本语言和命令行工具,旨在帮助用户自动化管理和配置Windows操作系统。

作为一名系统管理员或开发人员,熟练掌握PowerShell的常用命令是非常重要的。

在本文中,我将向你介绍一些最常用的PowerShell命令,并为你提供详细的步骤和示例。

首先,我们来了解一下PowerShell的优势。

与其他命令行工具相比,PowerShell 具有以下几个重要特点:1. 管道(Piping):允许将一个命令的输出作为另一个命令的输入,实现更高效的数据处理和操作。

2. 通用性:PowerShell可以管理和配置不仅仅是Windows操作系统,还包括其他Microsoft产品和第三方应用程序。

3. 面向对象:PowerShell是基于.NET框架的,支持面向对象的编程和操作,提供了丰富的类库和API。

4. 可扩展性:通过编写脚本和自定义模块,你可以轻松扩展和定制PowerShell 的功能。

在接下来的内容中,我们将学习一些常用的PowerShell命令,并分析它们的应用场景和用法。

一、基本命令1. Get-Command:获取所有可用命令或查询特定命令的信息。

例如,你可以使用“Get-Command”来获取PowerShell中所有的命令列表。

powershellGet-Command2. Get-Help:获取命令的使用帮助和文档。

在PowerShell中,你可以通过“Get-Help”命令来获取任何命令的详细说明。

powershellGet-Help Get-Process3. Set-Location和Get-Location:用于切换和获取当前目录。

这些命令与常用的cd和pwd命令类似。

powershellSet-Location C:\Windows\System32Get-Location4. Clear-Host:清除控制台窗口的内容,使其保持清洁。

二十,Powershell基础入门及常见用法(二)

二十,Powershell基础入门及常见用法(二)

二十,Powershell基础入门及常见用法(二)一.Powershell操作符常见的比较运算符包括:•-eq 等于•-ne 不等于•-gt 大于•-lt 小于•-le 小于等于•-contains 包含•-notcontains 不包含67 -eq 5050 -eq 501gb -gt 1tb(1,2,3) -contains 1(1,2,3) -contains 2(1,2,3) -contains 4求反运算符:•-not$a=89 -gt 50$a-not $a逻辑运算:•-and 与运算•-or 或运算•-not 非运算•-xor 异或运算$true -and $true$true -and $false$true -or $false$false -or $false-not $true$true -xor $true比较数组和集合,从中筛选出不等于0的数字。

1,5,8,0,9 -ne 0二.Powershell条件语句1.if条件判断if-elseif-else条件判断,执行操作用大括号表示。

$num=100if($num -gt 90) {'大于90'} else {'小于等于90'}if($num -gt 100) {'大于100'} else {'小于等于100'}注意,if-else中间可以增加新的判断elseif,如下所示:if($num -gt 100) {'大于100'} elseif ($num -eq 100) {'等于100'} else {'小于100'}2.switch语句Switch语句主要用于多种情况的判断,这里在本地创建一个test01.ps1文件,并执行该代码。

传统的if判断如下:$num=56if($num -gt 50 -and $num -lt 60) { '大于50并且小于60'} elseif ($num -eq 50) { '等于50'}else{ '小于50'} 去到桌面1019文件夹,输入“.\test01.ps1”执行代码,再打印该文件的源代码。

powershell所有命令公布解析

powershell所有命令公布解析

powershell所有命令公布解析powershell所有命令公布!Split-Path Cmdlet返回指定的路径部分。

Test-Path Cmdlet确定路径的所有元素是否存在。

Get-Process Cmdlet获取在本地计算机上运行的进程。

Stop-Process Cmdlet停止一个或多个正在运行的进程。

Remove-ItemProperty Cmdlet从注册表项中删除属性及其值。

Rename-ItemProperty Cmdlet 重命名项的属性。

Resolve-Path Cmdlet解析路径中的通配符并显示路径内容。

Get-Service Cmdlet获取本地计算机上的服务。

Stop-Service Cmdlet停止一个或多个正在运行的服务。

Start-Service Cmdlet启动一个或多个已停止的服务。

Suspend-Service Cmdlet挂起(暂停)一个或多个正在运行的服务。

Resume-Service Cmdlet恢复一项或多项挂起(暂停的)服务。

Restart-Service Cmdlet 停止并接着启动一个或更多服务。

Set-Service Cmdlet更改服务的显示名称、说明或启动模式。

New-Service Cmdlet在注册表和服务数据库中为Windows 服务创建新项。

Set-Content Cmdlet在项中写入内容或用新内容替换其中的内容。

Set-ItemProperty Cmdlet设置位于指定位置的属性的值。

Get-Acl Cmdlet获取资源(例如文件或注册表项)的安全描述符。

Set-Acl Cmdlet更改指定资源(例如文件或注册表项)的安全描述符。

Get-PfxCertificate Cmdlet获取计算机上 .pfx 证书文件的相关信息。

Get-Credential Cmdlet获取基于用户名和密码的凭据对象。

Get-ExecutionPolicy Cmdlet获取外壳程序的当前执行策略。

PowerShell命令

PowerShell命令

PowerShell命令[PowerShell]#别名ac = Add-Contentasnp = Add-PSSnapinclc = Clear-Contentcli = Clear-Itemclp = Clear-ItemPropertyclv = Clear-Variablecpi = Copy-Itemcpp = Copy-ItemPropertycvpa = Convert-Pathdiff = Compare-Objectepal = Export-Aliasepcsv = Export-Csvfc = Format-Customfl = Format-Listforeach = ForEach-Object% = ForEach-Objectft = Format-Tablefw = Format-Widegal = Get-Aliasgc = Get-Contentgci = Get-ChildItemgcm = Get-Commandgdr = Get-PSDriveghy = Get-Historygi = Get-Itemgl = Get-Locationgm = Get-Membergp = Get-ItemPropertygps = Get-Processgroup = Group-Objectgsv = Get-Servicegsnp = Get-PSSnapingu = Get-Uniquegv = Get-Variablegwmi = Get-WmiObjectiex = Invoke-Expressionihy = Invoke-Historyii = Invoke-Itemipal = Import-Aliasipcsv = Import-Csvmi = Move-Itemmp = Move-ItemPropertynal = New-Aliasndr = New-PSDriveni = New-Itemnv = New-Variableoh = Out-Hostrdr = Remove-PSDriveri = Remove-Itemrni = Rename-Itemrnp = Rename-ItemPropertyrp = Remove-ItemPropertyrsnp = Remove-PSSnapinrv = Remove-Variablervpa = Resolve-Pathsal = Set-Aliassasv = Start-Servicesc = Set-Contentselect = Select-Objectsi = Set-Itemsl = Set-Location sleep = Start-Sleep sort = Sort-Objectsp = Set-ItemProperty spps = Stop-Process spsv = Stop-Service sv = Set-Variabletee = Tee-Object where = Where-Object ? = Where-Object write = Write-Output cat = Get-Contentcd = Set-Location clear = Clear-Hostcp = Copy-Itemh = Get-History history = Get-History kill = Stop-Processlp = Out-Printerls = Get-ChildItem mount = New-PSDrive mv = Move-Itempopd = Pop-Location ps = Get-Process pushd = Push-Location pwd = Get-Locationr = Invoke-Historyrm = Remove-Item rmdir = Remove-Item echo = Write-Output cls = Clear-Host chdir = Set-Location copy = Copy-Itemdel = Remove-Itemdir = Get-ChildItem erase = Remove-Item move = Move-Itemrd = Remove-Itemren = Rename-Item set = Set-Variable type = Get-Content#PSDrivealiascertenvfunctionhkcuhklmvariable#获取帮助help get*help *processhelp dirhelp dir -fullhelp dir -detailedhelp dir -exampledir -?#转义序列`0 //空值`a //Beep`b //退格`f //换页`n //新⾏`r //回车`t //制表符`v //垂直引号`` // "`"#数字常量1kb // 10241mb1gb1e3 // 10000xFFFF // 65535#编辑脚本,推荐使⽤PrimalScript的最新版本,⾮常强⼤#设置脚本安全策略set-executionpolicy Restricted #默认set-executionpolicy AllSigned #部署set-executionpolicy RemoteSigned #开发set-executionpolicy Unrestricted #不推荐#执⾏脚本必须带路径./myScript.ps1#获取基于⽤户名和密码的凭据对象$cert = get-credential#对脚本签名$cert = Get-PfxCertificate C:\Test\Mysign.pfxSet-AuthenticodeSignature myScript.ps1 -cert $cert#操作系统gwmi win32_operatingsystem#⾃动变量$Args #传递进函数的参数$_ #通过管道传⼊的对象$input #通过管道传⼊的对象集合$$ #前⼀命令⾏的最后⼀个标记$? #上⼀命令的布尔状态$^ #前⼀命令⾏的第⼀个标记$Matches #使⽤ –match 运算符找到的匹配项的哈希表$Error[0] #前⼀次错误$Home #⽤户的主⽬录$Host #引⽤宿主 POWERSHELL 语⾔的应⽤程序$LastExitCode #上⼀程序或脚本的退出代码$PSHome #Windows PowerShell 的安装位置$profile #标准配置⽂件(可能不存在)$StackTrace #Windows PowerShell 捕获的上⼀异常#类型空类型[void]数值类型[byte] typeof(byte)[decimal] typeof(decimal)[double] typeof(double)[float] typeof(float)[int] typeof(int)[long] typeof(long)[single] typeof(float)字符类型[char] typeof(char)[string] typeof(string)布尔类型[bool] typeof(bool)集合类型[array] typeof(System.Array)typeof(System.Object[])[hashtable] typeof(System.Collections.Hashtable) 其它[psobject] typeof(System.Management.Automation.PSObject)[ref] typeof(System.Management.Automation.PSReference)[regex] typeof(System.Text.RegularExpressions.Regex)[scriptblock] typeof(System.Management.Automation.ScriptBlock)[switch] typeof(System.Management.Automation.SwitchParameter)[type] typeof(System.Type)[wmi] typeof(System.Management.ManagementObject)[wmiclass] typeof(System.Management.ManagementClass)[wmisearcher] typeof(System.Management.ManagementObjectSearcher)[xml] typeof(System.Xml.XmlDocument)example:#[void][void] $var #可以阻⽌$var输出#[xml]$var = [xml] "onetwo3"$var.top$var.top.a$var.top.a = "13"#⾃定义函数function writeln([string] $str) { echo $str }function writeln([string] $str) { Begin {echo "Begin"} Process {echo $str} End {echo "End"} } function writeln { param ([string] $str = $(throw "missing parameter")); echo $str } ${function:writeln} = { param ([string] $str = $(throw "missing parameter")); echo $str }#⽂本⽂件读写${C:\test.txt} = "Hello`r`n"${C:\test.txt} += "-----------------"$Line1 = ${C:\test.txt}[0]# $null$var = $null #删除$vardir > $null$null = dir#Invoke$method = "ToUpper""abc".$method.Invoke()#布尔值$true$false#where, select等的⽤法cd c:\dir | where {$_.Name -eq "WINDOWS"} | select Length,Namedir | ? {$_.Name -eq "WINDOWS"}# 列出字符串对象"str"的所有属性与⽅法"str" | gm#强制类型变量[Boolean] $condition = 0[string] $str = "hello"#数组$array = 1,2,3,4,5,6,7,8$array = @(1,2,3,4,5,6,7,8)$array[-1] #最后⼀个元素$array[0..4]$array[-1..-8] #倒序#哈希表$hash = @{"Name"="Icebird"; "Job"="Engineer"}#如何取得⽂本的⾏数(type C:\test.txt | measure-object).Count#从控制台读取⼀⾏输⼊$var = Read-Host#获取环境变量$path = $env:Path#读取注册表$a = (gp "hklm:\\Software\Microsoft\Windows\CurrentVersion").ProductId #⽐较和运算-like "file.doc" -like "file.*"-notlike-contains 1,2,3 -contains 1-notcontains-----------------------------------eq = (忽略⼤⼩写)-ieq = (忽略⼤⼩写)-ceq = (不忽略⼤⼩写)-ne !=-gt >-lt <-ge >=-le <=以上操作符也可⽤于对数组操作:1,2,3,5,3,2 -lt 3-----------------------------------and-or-not! 等价于-not-xor% 模运算* 可⽤于字符串重复: "-" * 80#位操作-band-bor-bnot-bxor#特殊操作$a = "Hat"$a -replace "a","o"$a -is [string]$a = 1 -as [string]$b = @(1..5)"{0:d}" -f (get-date)"{0:yyyy-MM-dd}" -f (get-date)#格式化$a = 123456789.456789$a.ToString("F4")"{0:F4}" -f $a"{0,-20:F4}{1}" -f $a,0"{0,20:F4}" -f $a"{0:x}" -f 100000"{0:X}" -f 100000#正则表达式$regex = [regex]"He"$str = "Hello, Hello"$isMatch = $str -match $regex$isMatch = $regex.ismatch($str)$matches = $regex.matches($str)#双引号与单引号$a = 1;"$a"会输出1'$a'会输出$a# & 与 ..{$var = 1} #看作include&{$var = 1} #看作call&"dir" #意味着函数名之类的可以当作参数传⼊#foreachforeach ($file in dir) { $ }dir | % { $_.Name }#forfor ($i = 1; $i -lt 5; $i++) {echo $i}#while$i = 0while ($i -lt 4) { $i++; $i }#do...while$i = 10do {$i--; $i} while ($i -lt 5)#do...until$i = 10do {$i--; $i} until ($i -lt 5)#if...else[if]$obj = "Hello"if ($obj -is [string]) { "ISSTRING" }if ($obj -is [string]) { "ISSTRING" } else { "ISNOTSTRING" }if ($obj -is [string]) { "ISSTRING" } elseif ($obj -is [int]) { "ISINTEGER" } #switchswitch (1,2,3) { 1 {"a"} 2 {"b"} 3 {"c"} default {"?"} }switch (1) { "a" {"China"} "b" {"Japan"} "c" {"c"} default {"???"} }#switch -regex$var = "abcdefg"switch -regex($var) {"^\w+$" {echo $_" is a word"}"^\d+$" {echo $_" is a number"}"^\s+$" {echo $_" is a space"}default {echo "?"}}#switch -casesensitive#switch -wildcard#switch -extract ?怎么⽤#switch -file ?怎么⽤#抛出错误&捕获异常throw "Error"raised "Exception"trap{write-host "Error: " $_.Exception.Message#$_.TargetObject#$_.CategoryInfo#$_.FullyQualifiedErrorID#$_.ErrorDetails#$_.InvocationInfocontinue#break#return}#输出格式化Format-ListFormat-TableFormat-WideFormat-Customdir | format-table -groupby Modedir | sort Name -descdir | sort Name -desc | select Name,Length,Mode | export-csv C:\dir.csv dir | sort Name -desc | select Name,Length,Mode | export-clixml C:\dir.csv dir | convertto-html#使⽤.NET的对象$webclient = New-Object .WebClient$webclient.Encoding = [System.Text.Encoding]::UTF8$url = ""$data = [string]$webclient.downloadstring($url)#使⽤COM对象$spVoice = new-object -com "SAPI.spvoice"$spVoice.Speak("Hello, I am Icebird.")。

Powershell对终端加域和退域

Powershell对终端加域和退域

Powershell对终端加域和退域
一、加、退域组件包
config.ini Add-Domain.ps1Add-Domain.bat Remove-Domain.ps1 Remove-Domain.bat
二、组件说明
1、加域配置
config.ini,配置加域,退域的条件。

用户只需修改这个配置,即可通过上述的组件包进行加域或退域。

2、加域入口文件
Add-Domain.bat,配置好加域配置,双击此文件即可对终端进行加域。

本文件做了强制使用管理员模式执行,对于windows 10系统默认权限都是非管理员,是无法加域成功。

3、退域入口文件
Remove-Domain.bat,配置好加域配置,双击此文件即可对终端进行退域。

本文件做了强制使用管理员模式执行,对于windows 10系统默认权限都是非管理员,是无法退域成功。

4、加域脚本
Add-Domain.ps1,具体实现加域的代码,并做了兼容性测试。

需要研究打开上面的附件即可。

5、退域脚本
Remove-Domain.ps1,具体实现退域的代码,并做了兼容性测试。

需要研究打开上面的附件即可。

PowerShell条件判断和循环

PowerShell条件判断和循环

PowerShell条件判断和循环比较运算符:-eq :等于-ne :不等于-gt :大于-ge :大于等于-lt :小于-le :小于等于-contains :包含-notcontains :不包含布尔运算符:-and:和-or:或-xor:异或-not:逆!($var)布尔运算:1 -eq 21,2,3,2 -contains 2("A","B","C") -notcontains "D"数组运算:1,2,3,2 -eq 21,2,3,2 -ne 21,2,3,2 -ge 2IF/ELSE 条件判断语句:$a=2if($a -gt 1) {"$a 大于 1"}if($a -gt 1) {"$a 大于 1"} else {"$a 小于 1"}if($a -gt 1) {"$a 大于 1"} elseif ($a -lt 1){"$a 小于 1"} else {"1等于1"}————————————————ForEach-Object 逐项处理数据:#逐项输出服务项Get-Service | ForEach-Object{$_}#逐项查看服务中列Name ,如包含“SQL”字符串,则输出服务中的列 DisplayNameGet-Service | ForEach-Object{if ($_.Name -like "*SQL*"){$_.DisplayName}}#输出当前目录下最近一天更改过的文件Get-ChildItem | ForEach-Object{if ($_.LastWriteTime -gt (Get-Date).AddDays(-1)){$_}}————————————————SWITCH 条件判断语句:#一般执行语法$a=10switch($a){1 {"return 1"}2 {"return 2"}3 {"return 3"}Default {"else return"}}#多个符合的条件都执行$a=10switch($a){1 {"return 1"}2 {"return 2"}10 {"return 10"}{$_ -gt 5 }{ "小于5" }{$_ -lt 100 }{ "小于100" }{($_ % 2) -eq 0}{ "余2为0" }Default {"else return"}}————————————————Do While 循环语句 / While 循环语句 / For 循环语句:#Do While 循环语句$n=1do { $sum2+=$n ; $n++ } while( $n -le 10); $sum2#While 循环语句$n=1while($n -le 10){ $sum3+=$n ; $n++ } ; $sum3#For 循环语句for($n=1;$n -le 10;$n++){ $sum4+=$n } ; $sum4 ————————————————。

powershell所有命令公布解析

powershell所有命令公布解析

powershell所有命令公布!Split-Path Cmdlet返回指定的路径部分。

Test-Path Cmdlet确定路径的所有元素是否存在。

Get-Process Cmdlet获取在本地计算机上运行的进程。

Stop-Process Cmdlet停止一个或多个正在运行的进程。

Remove-ItemProperty Cmdlet从注册表项中删除属性及其值。

Rename-ItemProperty Cmdlet重命名项的属性。

Resolve-Path Cmdlet解析路径中的通配符并显示路径内容。

Get-Service Cmdlet获取本地计算机上的服务。

Stop-Service Cmdlet停止一个或多个正在运行的服务。

Start-Service Cmdlet启动一个或多个已停止的服务。

Suspend-Service Cmdlet挂起(暂停)一个或多个正在运行的服务。

Resume-Service Cmdlet恢复一项或多项挂起(暂停的)服务。

Restart-Service Cmdlet停止并接着启动一个或更多服务。

Set-Service Cmdlet更改服务的显示名称、说明或启动模式。

New-Service Cmdlet在注册表和服务数据库中为Windows 服务创建新项。

Set-Content Cmdlet在项中写入内容或用新内容替换其中的内容。

Set-ItemProperty Cmdlet设置位于指定位置的属性的值。

Get-Acl Cmdlet获取资源(例如文件或注册表项)的安全描述符。

Set-Acl Cmdlet更改指定资源(例如文件或注册表项)的安全描述符。

Get-PfxCertificate Cmdlet获取计算机上 .pfx 证书文件的相关信息。

Get-Credential Cmdlet获取基于用户名和密码的凭据对象。

Get-ExecutionPolicy Cmdlet获取外壳程序的当前执行策略。

PowerShell 常见命令别名及其作用

PowerShell 常见命令别名及其作用

PowerShell 常见命令别名及其作用Name Category Synopsis? Alias Where-Object ac Alias Add-Content asnp Alias Add-PSSnapin cat Alias Get-Content cd Alias Set-Location chdir Alias Set-Location clc Alias Clear-Content clear Alias Clear-Host clhy Alias Clear-History cli Alias Clear-Item clp Alias Clear-ItemProperty cls Alias Clear-Host clv Alias Clear-Variable compare Alias Compare-Object copy Alias Copy-Item cp Alias Copy-Item cpi Alias Copy-Item cpp Alias Copy-ItemProperty cvpa Alias Convert-Path dbp Alias Disable-PSBreakpoint del Alias Remove-Item diff Alias Compare-Object dir Alias Get-ChildItem ebp Alias Enable-PSBreakpoint echo Alias Write-Output epal Alias Export-Alias epcsv Alias Export-Csv epsn Alias Export-PSSession erase Alias Remove-Item etsn Alias Enter-PSSession exsn Alias Exit-PSSession fc Alias Format-Custom fl Alias Format-List foreach Alias ForEach-Object ft Alias Format-Table fw Alias Format-Wide gal Alias Get-Alias gbp Alias Get-PSBreakpoint gc Alias Get-Contentgcm Alias Get-Command gcs Alias Get-PSCallStack gdr Alias Get-PSDrive ghy Alias Get-History gi Alias Get-Item gjb Alias Get-Job gl Alias Get-Location gm Alias Get-Member gmo Alias Get-Module gp Alias Get-ItemProperty gps Alias Get-Process group Alias Group-Object gsn Alias Get-PSSession gsnp Alias Get-PSSnapin gsv Alias Get-Service gu Alias Get-Unique gv Alias Get-Variable gwmi Alias Get-WmiObject h Alias Get-History history Alias Get-History icm Alias Invoke-Command iex Alias Invoke-Expression ihy Alias Invoke-History ii Alias Invoke-Item ipal Alias Import-Alias ipcsv Alias Import-Csv ipmo Alias Import-Module ipsn Alias Import-PSSession ise Alias powershell_ise.exe iwmi Alias Invoke-WmiMethod kill Alias Stop-Process lp Alias Out-Printer ls Alias Get-ChildItem man Alias help md Alias mkdir measure Alias Measure-Object mi Alias Move-Item mount Alias New-PSDrive move Alias Move-Item mp Alias Move-ItemProperty mv Alias Move-Item nal Alias New-Alias ndr Alias New-PSDrivenmo Alias New-Module nsn Alias New-PSSession nv Alias New-Variable ogv Alias Out-GridView oh Alias Out-Host popd Alias Pop-Location ps Alias Get-Process pushd Alias Push-Location pwd Alias Get-Location r Alias Invoke-History rbp Alias Remove-PSBreakpoint rcjb Alias Receive-Job rd Alias Remove-Item rdr Alias Remove-PSDrive ren Alias Rename-Item ri Alias Remove-Item rjb Alias Remove-Job rm Alias Remove-Item rmdir Alias Remove-Item rmo Alias Remove-Module rni Alias Rename-Item rnp Alias Rename-ItemProperty rp Alias Remove-ItemProperty rsn Alias Remove-PSSession rsnp Alias Remove-PSSnapin rv Alias Remove-Variable rvpa Alias Resolve-Path rwmi Alias Remove-WmiObject sajb Alias Start-Job sal Alias Set-Alias saps Alias Start-Process sasv Alias Start-Service sbp Alias Set-PSBreakpoint sc Alias Set-Content select Alias Select-Object set Alias Set-Variable si Alias Set-Item sl Alias Set-Location sleep Alias Start-Sleep sort Alias Sort-Object sp Alias Set-ItemProperty spjb Alias Stop-Job spps Alias Stop-Processstart Alias Start-Process sv Alias Set-Variable swmi Alias Set-WmiInstance tee Alias Tee-Object type Alias Get-Content where Alias Where-Object wjb Alias Wait-Job write Alias Write-OutputName Category SynopsisAdd-Computer Cmdlet 将本地计算机添加到域或工作组中。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

PowerShell的Exit关键字与Return关键字,以及自动变量$?和$LastExitCode
——与Unix Shell的比较
最近因为工作关系,第一次接触PowerShell。

因为之前接触的都是Unix Shell,所以在刚开始用PowerShell的时候,把Unix的想法与概念带到PowerShell中,到最后才发现二者之间很多东西都是不一样的。

关于这次的工作内容,主要任务是把原来在Unix上写的Shell用PowerShell再实现一下。

需求与接口都要求与原来的一样(实际上谁也不想改这些东西)。

一、Exit关键字
语法:Exit [状态值]
这个不用想都知道是退出命令,中止当前的执行。

但是这里面却是一大堆的陷阱。

在Unix Shell中,只要Exit被执行,不管Shell之间用source命令有多少层读取关系,都会中止所以执行,并且设置退出状态值。

状态值在执行结束之后用$?来确认。

一切都很清楚。

但是在PowerShell中却变得比较复杂。

先看一下PowerShell2.0中关于Exit的说明,少得可怜。

另外,在《Window PowerShell应用手册》里关于Exit也没有特别的说明。

对PowerShell中Exit的命令,分成下面三种情况。

1、在脚本中直接执行。

2、在用source读取的脚本中执行。

3、在函数中执行。

分别用例子来说明。

1、在脚本中直接执行。

这种情况下和Unix Shell是一样的,都是中止脚本的执行。

不同的是在PowerShell中自动变量$?是一个布尔值,因为退出代码不是0而是50,所以执行结束是失败(False);自动变量$LastExitCode里保存的则是退出代码。

2、在用source读取的脚本中执行。

用testMain.ps1文件读取上一个例子中的脚本。

可以看到即使test1.ps1的执行了Exit命令并中止了执行,但是testMain.ps1却还是继续执行后面的命令。

这一点和Unix Shell完全不一样。

3、在函数中执行。

这种情况下和Unix Shell 也是一致的。

补充说明一下,即使这个函数是在另一个脚本中定义的,通过读取该文件后调用这个函数,结果也是一样的。

二、关于$?和$LastExitCode
在上面的几个例子里用到了这两个自动变量来查看脚本的执行结果。

先看一下PowerShell2.0帮助手册里的说明,内容也一样很简单。

$?都是用来确定前一个命令的执行状态,如果是脚本的话,由Exit 命令后面所带的参数和决定执行状态。

0是True ,0以外的数字都是False 。

所有的程序和命令都会在执行后设置$?的值。

$LastExitCode 的值是由Exit [状态值]命令来设置的。

需要注意的是,并不是所有的命令和程序都会去设置这一个自动变量;也就是说,你现在看到$LastExitCode 的值可能并不是前一个命令设置的,而是更早之前的某一个命令设置之后一直保持下来的值。

还有一点需要注意的是,当你刚打开一个PowerShell 的时候,$LastExitCode 这个自动变量是不存在的,只有在某一个设置$LastExitCode 的命令执行过以后才会出现。

刚开始时,我一直以为$?和$LastExitCode 保存的都是前一个命令的结果,直到后来做测试时才发现不是。

之后再找了一下资料,也没有发现相关的说明。

有兴趣的朋友可以自己测试一下。

三、Return 关键字
首先看一下在Return 命令在Unix Shell 中的作用。

Return 和Exit
一样都可以设置命令的执行
状态值,不同的是Exit会中止脚本的执行,而Return不会中止脚本的执行。

在PowerShell里虽然也有Return这一个命令,但是和Unix Shell的完全就是两个不同的概念。

在PowerShell里只有Exit可以设置$LastExitCode,但是Return不能做到。

先看一下PowerShell2.0帮助手册的说明:
所以这里的Return,不是像Unix Shell一样设置%?,也不像C或Java一样只返回Return关键字后面所跟的值,而是当前脚本或函数所有语句的输出。

如果Return前面只有一个输出的话,就是把那个输出返回;如果是有多个输出的话,返回值如下图所示是一个Object数组。

这是一个会让人崩溃的结果,真不知道PowerShell的设计者脑子是不是进水了,还是有我无法想像到的深意在里面。

总结,PowerShell和Unix Shell完全是两种不同的语言,有相似的地方,但是更多的是不同。

工作上碰到的问题,都只能说是自己对这两者的理解都还十分肤浅,不能够运用自如。

2016年1月16日
关于这篇文章
从接触PowerShell开始,有问题上网找资料时发现关于PowerShell的资料比较少,就想把自己的一些理解写出来分享一下。

第一次写这种文章,加上从事工作资历也比较短,不足之处还请大家多多包涵。

文中的观点与理解如有错误,请务必指正出来,不胜感激。

邮箱:xxbcf@
关于作者
80后,2013年才进入IT行业,工作经验与水平都处在入门水平。

相关文档
最新文档