PowerShell 脚本(Scripts)

对于经常用或者重要的脚本,可以保持到本地文件中,需要的时候可直接调用,这样处理更加方便!

 

编写脚本输出到文件 (若不指定绝对路径,默认都使用当前目录)

"Get-Date" > MyScript.ps1
"pwd" >> MyScript.ps1
"'测试'" >> MyScript.ps1


"Get-Date
pwd
'测试'" > MyScript.ps1


#或者使用 @''@ 批量写入
@'
Get-Date
pwd
"测试"
'@ > MyScript.ps1


相关操作:

#执行文本脚本
.\MyScript.ps1


#获取脚本到PS控制台
Get-Content .\MyScript.ps1


#打开文本文件
notepad MyScript.ps1

 

#新建或更新脚本,脚本中使用参数
notepad MyScript.ps1

Write-Host "Hello,$args"

.\MyScript.ps1 kk

 

 

 

脚本中的参数用法与函数内部定义一样

#函数
Function Test{    
begin{ $i=1 }    
process{    
     $_.name  
     $i++    
}    
end{}    
}    
  
Get-Service -DisplayName "*MSSQLSERVER*" | Test  



#脚本 notepad MyScript.ps1
begin{ $i=1 }    
process{    
     $_.name  
     $i++    
}    
end{} 

 

 

 

管道中执行的脚本:

#编辑脚本如下 notepad MyScript.ps1

foreach ($element in $input)
{
    if($element.Extension -eq ".exe")
    {
        Write-Host -fore "red" $element.Name
    }
    else
    {
        Write-Host -fore "Green" $element.Name
    }
}



#或者使用流处理,编辑脚本如下 notepad MyScript.ps1
begin{}
process
{
    if($_.Extension -eq ".exe")
    {
        Write-Host -fore "red" $_.Name
    }
    else
    {
        Write-Host -fore "Green" $_.Name
    }
}
end{}
#执行
ls $env:windir | .\MyScript.ps1

 

 

设置别名更方便:

 

 

 

#设置别名更方便
Set-Alias edit notepad.exe

edit MyScript.ps1

 

脚本中传递变量:

param (
	[Parameter(ValueFromPipeline = $true, HelpMessage = "Enter your name: ")]
	[String]$Name = "kk" #default value
)

Write-Host "Your name is $Name."
Write-Host ("Your name is {0} and {1}." -f $Name,"mm")

 

 

执行:

 

【数字签名证书】

脚本很容易被替换或者更高,使用签名验证会告诉我们脚本是否信任,是否包含了恶意篡改。

 

创建证书:
开始——>所有程序——>Microsoft Visual Studio 2012——>Visual Studio Tools——>VS2012 x86 本机工具命令提示
或者:
C:\Program Files\Windows Kits\8.1\bin\x86\makecat.exe

makecert.exe -pe -r -n "CN=PowerShellTestCert" -eku 1.3.6.1.5.5.7.3.3 -ss "My"

 

查看证书:

dir Cert:\CurrentUser\My -CodeSigningCert
ls cert:CurrentUser\My
ls cert:CurrentUser\My | where {$_.subject -eq "CN=PowerShellTestCert"}

 

 

 

设置数字签名认证:

$Cert=ls cert:CurrentUser\My | where {$_.subject -eq "CN=PowerShellTestCert"}
Set-AuthenticodeSignature -PSPath "MyScript.ps1" -Certificate $Cert

edit MyScript.ps1


 

 

签名已经成功!!

 

证书相关信息:

#证书的代表
$Cert.subject

#证书的签发者
$Cert.issuer

#证书的序列号,指纹
$Cert | select SerialNumber,Thumbprint | fl *

#证书是否受信任
$Cert.Verify()

#打开证书窗口界面
[System.Reflection.Assembly]::LoadWithPartialName("System.Security")
[System.Security.Cryptography.x509Certificates.X509Certificate2UI]::DisplayCertificate($Cert)

 

 

 

上面打开的证书并不受信任!

 

添加信任(或者窗口添加:certmgr.msc)

$rootStore= New-Object system.security.cryptography.X509Certificates.x509Store("root","Currentuser")
$rootStore.Open("ReadWrite")
$rootStore.Add($Cert)
$rootStore.Close()
$Cert.Verify()


操作 Add($Cert) 会提示对话框,点击确认即可!

 

 

给脚本添加数字签名:

#给文件(MyScript.ps1)添加签名
Set-AuthenticodeSignature MyScript.ps1 $Cert
Set-AuthenticodeSignature -PSPath "MyScript.ps1" -Certificate $Cert

#给所有文件添加签名
Set-AuthenticodeSignature (ls *.ps1) $Cert
Set-AuthenticodeSignature (Dir -recurse -include *.ps1) $Cert

#文件是否有数字签名
Get-AuthenticodeSignature test.ps1
Get-AuthenticodeSignature MyScript.ps1


对于脚本的执行权限,powershell 有几个设置:

#设置脚本执行权限
Set-ExecutionPolicy Restricted		#禁止执行脚本
Set-ExecutionPolicy Default		#默认
Set-ExecutionPolicy AllSigned		#只执行数字验证的脚本
Set-ExecutionPolicy RemoteSigned	#本地无需证书,远程需要证书
Set-ExecutionPolicy Unrestricted	#无限制,可执行任何脚本


查看当前PS中脚本执行权限:

 

#查看当前PS中脚本执行权限
Get-ExecutionPolicy
Get-ExecutionPolicy -List


现在设置为只有数字签名的文件可执行:

#现在设置为数字签名可执行
Set-ExecutionPolicy AllSigned


执行脚本(第一个无签名,报错;第二个有签名,正常执行)

 

#执行脚本(第一个无签名,报错;第二个有签名,正常执行)
ls $env:windir | .\test.ps1
Get-Service -DisplayName "*MSSQLSERVER*" | .\MyScript.ps1

 

 

 

现在我把文件内容篡改:

 

执行脚本,出错!

完美!~微笑

 

 

没有更多推荐了,返回首页