PowerShellPowerShell入门


备注

Windows PowerShell是Windows Management Framework的shell和脚本组件,Windows Management Framework是Microsoft构建于.NET Framework上的自动化/配置管理框架。自Windows 7 / Windows Server 2008 R2起,默认情况下会在所有受支持的Windows客户端和服务器操作系统版本上安装PowerShell。可以通过下载更高版本的Windows Management Framework (WMF)随时更新Powershell。 PowerShell 6的“Alpha”版本是跨平台的(Windows,Linux和OS X),需要从此版本页面下载和安装。

其他资源:

版本

包含在Windows中笔记发布日期
1.0 XP / Server 2008 2006-11-01
2.0 7 / Server 2008 R2 2009-11-01
3.0 8 / Server 2012 2012-08-01
4 8.1 / Server 2012 R2 2013年11月1日
5 10 / Server 2016技术预览版二零一五年十二月十六日
5.1 10周年纪念版/ Server 2016 2017年1月27日

别名和类似功能

在PowerShell中,有许多方法可以实现相同的结果。这可以通过简单熟悉的Hello World 示例很好地说明:

使用Write-Host

Write-Host "Hello World"  
 

使用Write-Output

Write-Output 'Hello world'
 

值得注意的是,虽然Write-OutputWrite-Host 都写入屏幕,但存在细微差别。 Write-Host 写入stdout(即控制台屏幕),而Write-Output 写入stdout AND到输出[success]流,允许重定向 。重定向(和一般的流)允许将一个命令的输出作为输入引导到另一个命令,包括赋值给变量。

> $message = Write-Output "Hello World"
> $message
"Hello World"
 

这些类似的功能不是别名,但如果想要避免“污染”成功流,则可以产生相同的结果。

Write-Output 别名为EchoWrite

Echo 'Hello world'
Write 'Hello world'
 

或者,只需输入“Hello world”!

'Hello world'
 

所有这些都将导致预期的控制台输出

Hello world
 

PowerShell中别名的另一个示例是旧命令提示符命令和BASH命令与PowerShell cmdlet的公共映射。以下所有内容都会生成当前目录的目录列表。

C:\Windows> dir
C:\Windows> ls
C:\Windows> Get-ChildItem
 

最后,您可以使用Set-Alias cmdlet创建自己的别名!作为一个例子,让我们的命名为Test-NetConnection ,它本质上是与命令提示符的ping命令等效的PowerShell,以“ping”。

Set-Alias -Name ping -Value Test-NetConnection
 

现在您可以使用ping 而不是Test-NetConnection !请注意,如果别名已被使用,您将覆盖该关联。

Alias将活着,直到会话活跃。关闭会话并尝试运行您在上一个会话中创建的别名后,它将无效。要解决此问题,您可以在开始工作之前将excel中的所有别名导入到会话中一次。

允许存储在计算机上的脚本以未签名方式运行

出于安全原因,默认情况下会将PowerShell设置为仅允许签名脚本执行。执行以下命令将允许您运行未签名的脚本(必须以管理员身份运行PowerShell才能执行此操作)。

Set-ExecutionPolicy RemoteSigned
 

运行PowerShell脚本的另一种方法是使用Bypass 作为ExecutionPolicy

powershell.exe -ExecutionPolicy Bypass -File "c:\MyScript.ps1"
 

或者从现有的PowerShell控制台或ISE会话中运行:

 Set-ExecutionPolicy Bypass Process
 

执行策略的临时解决方法也可以通过运行Powershell可执行文件并将任何有效策略作为-ExecutionPolicy 参数传递来实现。该策略仅在进程的生命周期内有效,因此不需要对注册表的管理访问权限。

C:\>powershell -ExecutionPolicy RemoteSigned
 

有多个其他可用策略,在线站点通常鼓励您使用Set-ExecutionPolicy Unrestricted 。此策略在更改之前保持不变,并降低系统安全性。这是不可取的。建议使用RemoteSigned ,因为它允许本地存储和编写代码,并且需要使用来自受信任根的证书对远程获取的代码进行签名。

此外,请注意执行策略可能由组策略强制执行,因此即使策略在系统范围内更改为Unrestricted ,组策略也可能在下一个执行间隔(通常为15分钟)恢复该设置。您可以使用Get-ExecutionPolicy -List 查看各种范围内的执行策略集

TechNet文档:
SET-ExecutionPolicy
参阅about_Execution_Policies

调用.Net库方法

可以通过在第三个括号中封装完整的类名,然后使用:: 调用方法,从PowerShell调用静态.Net库方法

#calling Path.GetFileName()
C:\> [System.IO.Path]::GetFileName('C:\Windows\explorer.exe')
explorer.exe
 

可以从类本身调用静态方法,但调用非静态方法需要.Net类(对象)的实例。

例如,无法从System.DateTime类本身调用AddHours方法。它需要一个类的实例:

C:\> [System.DateTime]::AddHours(15)
Method invocation failed because [System.DateTime] does not contain a method named 'AddHours'.
At line:1 char:1
+ [System.DateTime]::AddHours(15)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 

在这种情况下,我们首先创建一个对象 ,例如:

C:\> $Object = [System.DateTime]::Now
 

然后,我们可以使用该对象的方法,甚至是无法直接从System.DateTime类调用的方法,如AddHours方法:

C:\> $Object.AddHours(15)

Monday 12 September 2016 01:51:19
 

评论

通过使用# (哈希)符号预先添加行来评论电源脚本

# This is a comment in powershell
Get-ChildItem
 

您还可以分别在注释的开头和结尾使用<##> 进行多行注释。

<#
This is a 
multi-line
comment
#>
Get-ChildItem
 

创建对象

New-Object cmdlet用于创建对象。

# Create a DateTime object and stores the object in variable "$var"
$var = New-Object System.DateTime

# calling constructor with parameters
$sr = New-Object System.IO.StreamReader -ArgumentList "file path"
 

在许多情况下,将创建一个新对象以导出数据或将其传递给另一个命令行开关。这可以这样做:

$newObject = New-Object -TypeName PSObject -Property @{
    ComputerName = "SERVER1"
    Role = "Interface"
    Environment = "Production"
}
 

创建对象的方法有很多种。以下方法可能是创建PSCustomObject 的最短且最快的方法:

$newObject = [PSCustomObject]@{
    ComputerName = 'SERVER1'
    Role         = 'Interface'
    Environment  = 'Production'
}
 

如果您已有一个对象,但只需要一个或两个额外属性,则可以使用Select-Object 简单地添加该属性:

Get-ChildItem | Select-Object FullName, Name, 
    @{Name='DateTime'; Expression={Get-Date}}, 
    @{Name='PropertieName'; Expression={'CustomValue'}}
 

所有对象都可以存储在变量中或传递到管道中。您还可以将这些对象添加到集合中,然后在结尾显示结果。

对象集合与Export-CSV(和Import-CSV)配合良好。 CSV的每一行都是一个对象,每一列都是一个属性。

格式命令将对象转换为文本流以供显示。避免使用Format- *命令直到任何数据处理的最后一步,以保持对象的可用性。

安装或设置

视窗

PowerShell包含在Windows Management Framework中。现代版本的Windows不需要安装和设置。

可以通过安装较新版本的Windows Management Framework来完成对PowerShell的更新。

其他平台

PowerShell 6的“Beta”版本可以安装在其他平台上。安装包可在此处获得

例如,用于Ubuntu 16.04的PowerShell 6发布到打包存储库以便于安装(和更新)。

要安装,请运行以下命令:

# Import the public repository GPG keys
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -

# Register the Microsoft Ubuntu repository
curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list | sudo tee /etc/apt/sources.list.d/microsoft.list

# Update apt-get
sudo apt-get update

# Install PowerShell
sudo apt-get install -y powershell

# Start PowerShell
powershell

在以超级用户身份注册Microsoft存储库之后,从那时起,您只需要使用sudo apt-get upgrade powershell 来更新它。然后运行powershell

管道 - 使用PowerShell cmdlet的输出

人们在开始使用PowerShell进行脚本编写时遇到的第一个问题是如何操作cmdlet的输出来执行另一个操作。

管道符号| 在cmdlet的末尾使用它来获取它导出的数据并将其提供给下一个cmdlet。一个简单的例子是使用Select-Object仅显示Get-ChildItem显示的文件的Name属性:

Get-ChildItem | Select-Object Name
#This may be shortened to:
gci | Select Name
 

更高级的管道使用允许我们将cmdlet的输出传递到foreach循环:

Get-ChildItem | ForEach-Object {
    Copy-Item -Path $_.FullName -destination C:\NewDirectory\ 
}

#This may be shortened to:
gci | % { Copy $_.FullName C:\NewDirectory\ }
 

请注意,上面的示例使用$ _自动变量。 $ _是$ PSItem的短别名,它是一个自动变量,包含管道中的当前项。