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

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

"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



  1. #新建或更新脚本,脚本中使用参数 
    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

设置别名更方便:

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

【数字签名证书】

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

创建证书:    
开始——>所有程序——>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)

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

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

给脚本添加数字签名:

  1. #给文件(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


现在我把文件内容篡改:

执行脚本,出错!

完美!~微笑