• PowerShell学习笔记四_函数、IO操作、字符操作、数组


    使用静态方法

    $now = [DateTime]::Now

    实例化

    $var=New-Object System.DateTime(1991,12,14)
    #实例化不需要[]

    函数定义

    Function Hi([string] $name){ 
      Write-Host "Hi $name"
    }

    调用:

    Hi("lucy")

    或者
    Hi lucy

    或者

    Hi -name lucy

    语句块

     

     begin{} end{}都只做一次,而process{}管道传入了多少个对象,就做多少次

    而非管道传入的,process{}只干一次

     CmdletBinding、parmeter

    Function  FindComputer(){ 

      #这个类似于C#的Atrribute
      [CmdletBinding(

        ConfirmImpace = [System.Management.Automation.ConfirmImpact]::High #如果设置为High,那么执行这个函数前,有用户提示,是否要执行。如果调用它的函数,低于或等于它,也会发出警告

        DefaultParameterSetName=”ByComputerIds#默认的参数集,相当于方法重载,在敲命令的时候,默认是用那种重载

        HelpURI=

        SupportsPaging=

        )]   #CmdletBinding 是用来控制命令的行为的

      Param   #Param这个是必须写的,即使为空,如果不写,那么写[CmdletBinding]就会报错

      (

         [parmeter(

          Mandatory = $true #参数是否是必须的

          ValueFromPipleline= $true #是否接受管道输入 ,那么就可以Get-Service Mysql | Hi 这样子

          HelpMessage = "需要输入电脑名称" 

                   )]   #parmeter是用来限制,或者检查输入的参数的

                 $ComputerNames , #这个位置写了就不能在方法名后边写了

      ) 

      begin {  

           }

      process{

        #会对传入的参数进行遍历,当参数没有指定类型时,语句“ 1,2,3|FindComputer” ,只能在这里获取到1、2、3,否则在其他地方就是“1,2,3”连在一起

      }

      end{   

        #可以使用$PsCmdlet.WriteObject()返回值

      }

    }

    [parmeter(ParmeterSetName="...",Position="...")]

    假如同时有:

    param(

      [parmeter(Mandatory=$true,ParmeterSetName="ByComputerNames")] 
      $ComputerNames 

      [parmeter(Mandatory=$true,ParmeterSetName="ByComputerIds",Position=1,

      VaildateCount(1,5)# 限制参数个数至少1,最多5个。如果类型是string,就限制字符串长度。GetComputer -ByComputerIds 1,2,3,4,5

      VaildatePattern("正则表达式")

      )]

      $ComputerIds 

      [parmeter(Mandatory=$true,ParmeterSetName="ByComputerIds",Position=2)] 

      [Alias("CA")] #使用的时候就可以GetComputer -CA "cmpname"

      $ComputerAlias 

      [VaildateSet("VM","RM")] #参数值只能为”VM“或者”RM“

      $ComputerType

      [Parmeter( ValidateScript( $_ = get-date))] #使用脚本,为CreateDate赋默认值

      $CreateDate

    )

    #提示:使用$PSCmdlet.ParmeterSetName来查看,当前是用了哪个参数集。

    当写了不同的ParmeterSetName(参数集),也就意味着,方法Process体要为两个不同的参数集做不同的逻辑(相当于方法重载,全部写到一个方法体内)

    if($PSCmdlet.ParmeterSetName -eq "ByComputerNames" ) {  #... }

    #使用 get-help Get-Service -Full 也能获取整个方法的参数集介绍

    注意:

    1. 必须写Position,Position说明了默认的参数集,就是使用ByComputerIds,也就是当FindComputer xxxx,相当于调用FindComputer -ComputerIds xxxxx

    2. 当两个[parmeter],都设置了Position=1是,默认的是哪个?

    使用的是[CmdletBinding(DefaultParameterSetName=...)]指定的那个

    3. 当两个参数,使用相同的参数集,如上:$ComputerIds、$ComputerAlias时,调用FindComputer "12345" "cp1",等价于FindComputer  -ComputerIds "12345"  - ComputerAlias "cp1"

    [CmdletBinding(SupportsShouldProcess=$true)]

    如果使用了这个,就可以在

    process

    {

      if($PSCmdlet.ShouldProcess($ComputerId,"执行XXX" ))#此处会弹出确认框提示:正在ComputerId上执行xxx,是否继续? 

      {

        

      }

    }

    文件操作

    $fs = New-Object System.IO.FileStream("C:Userspyl1.TXT",[System.IO.FileMode]::Create,[System.IO.FileAccess]::Write)
    $fs.Write([System.Text.UTF8Encoding]::UTF8.GetBytes("aaa"),0,3)
    $fs.Close()

    和C#一模一样

    注意:只能保存到当前工作目录下,如果要保存到其他目录,需要先cd到其他目录

    删除文件 

    Remove-Item C:DGCJP006

    获取文件信息

    $fileinfo = Get-Item .aa.csv

     $fileinfo的类型是FileInfo,这点和C#一样

    解析: “.” 是指当前工作目录下的位置,“..”是当前工作目录的上一个位置,多一个".",就上多一层。

    自定义对象

    $data = @{

      name = "tom"

      age =18

    }

    #注意,是要用回车,不能用“,”分隔

    保存对象

    如果是自定义对象,使用JSON

    $data| ConvertTo-JSON | Out-File   . bb.json

    注意:Out-File 是以覆盖,或则新建的方式

    如果是管道接受的对象,使用CSV

    Get-Service mysql| Export-Csv -Path .aa.csv

    Get-Service mysql| ConvertTo-Csv | Out-File "dd.csv"

    读取对象

    Json

    $dt = Get-Content .b.json | ConvertFrom-Json

    csv

    Get-Content .aa.csv | ConvertFrom-Csv

    字符操作

    1. 像C#一样多行字符串   var str = @"

      ";

    在PowserShell中,使用

    $str =

    ' #用单引号

    2. 转义字符,使用"`n",表示换行

    3. 

    数组

    1. [int[]] $id=@() ,追加元素 $id +=1 

    2.  $List =  New-Object  System.Collections.ArrayList,追加元素

    3.

    $lenght= $lines.Length
    $List = [System.Int32[] ]::new($lenght)  #注意,不能 ::new($lines.Length )
    $List.Length

    C#模板

    4.$List  = [System.Collections.Generic.List[PYLMath.Coordinate]]::new(100);

  • 相关阅读:
    ECSHOP订单隐藏前几位字符用星号*代替
    ECshop将团购说明改成FCKeditor编辑器
    ECSHOP默认编辑器换成实用的KindEditor编辑器
    织梦DEDECMS导航下拉菜单的实现方法
    CSS中右对齐float:right换行的解决方法
    ecshop后台我的收藏显示收藏的商品图片和时间的方法
    ECSHOP程序SEO完全优化
    ECSHOP商品详情页颜色、尺码 选择仿淘宝效果
    ecshop 前台 “非特殊等级”在那修改?
    ECSHOP登录注册信息提示页面的跳转时间设置
  • 原文地址:https://www.cnblogs.com/pylblog/p/14289614.html
Copyright © 2020-2023  润新知