我是靠谱客的博主 酷酷抽屉,最近开发中收集的这篇文章主要介绍Powershell常用命令(一)Invoke-Command(icm)Get-Content(cat,gc,type)New-ObjectNew-Item(ni)New-PSSession(nsn)Copy-Item(copy,cp,cpi)param- -static parametersStart-Process(start,saps)Get-Alias(gal)Get-CommandSelect-String(sls)Select-ObjectGet-ChildItem(ls,dir,g,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
Invoke-Command(icm)
功能:在本地或者远程运行命令,命令执行的结果(含错误)返回到运行命令的机器。
说明:-Computer参数实现在远程运行一条命令。若要运行一系列命令,使用New-PSSesion命令在远程机器创建一个PSSession(持久连接),然后在PSSession中使用Invoke-Command命令中的Session参数去在远程机器运行一系列命令。
实例:
Invoke-Command -FilePath c:scriptstest.ps1 -ComputerName Server01 #在远程机器Server01上执行脚本test.ps1,脚本在本地。注意:执行当前路径下的脚本:./test.ps1。
Invoke-Command -ComputerName Server01 -Credential Domain01User01 -ScriptBlock { Get-Culture } #在远程机器Server01上执行一条命令Get-Culture
#常用模式:前五行是为了域用户的认证。
$ComputerName = "43.76.9.75"
$Username = "libai"
$Password = 'xxxxxx'
$pass = ConvertTo-SecureString -AsPlainText $Password -Force
$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList $Username,$pass
Invoke-Command -ComputerName $ComputerName -ScriptBlock { remove-item -Path "c:remotedirectory*" -Recurse -Force } -credential $Cred
$version = Invoke-Command -ComputerName (Get-Content myfile.txt) -ScriptBlock {Get-Culture} #在多台机器上执行命令,机器名存放在当前目录的myfile中,结果返回存放在$version变量中。
#将本地变量传到远程的方式
#1.$Using:VariableName
$Log = "PowerShellCore/Operational"
Invoke-Command -ComputerName Server01 -ScriptBlock {Get-WinEvent -LogName $Using:Log -MaxEvents 10} #在本地定义一个变量,使用$Using:VariableName形式,在远程使用改变量。
#2.-ArgumentList
$Log = "PowerShellCore/Operational"
$aa="xxxx"
Invoke-Command -ComputerName Server01 -ScriptBlock {....} -ArgumentList $Log,$aaa
#3.定义在-ScriptBlock中的变量会在远程其作用(不是本地变量)
Invoke-Command -ComputerName (Get-Content myfile.txt) -FilePath E:test.ps1 -ArgumentList Process, Service #远程机器名字存放在myfile.txt中,test.ps1这个文件中的命令会被复制到-ScriptBlock对应的值中。即在多台远程机器执行大量命令。
Get-Content(cat,gc,type)
功能:获取指定指定位置的对象的内容。
注意:-Delimiter是默认值为n.对于多行文件,delimiter按照-Delimiter的值来分割文件。所以多行文件返回的是一组对象。
1..100 | ForEach-Object { Add-Content -Path .LineNumbers.txt -Value "This is line $_." } #1..100表示1到100这100个数,这是个数组。通过管道发送给ForEach-Object命令,改命令通过脚本块中的Add-Content命令,向当前路径下的LineNumers.txt文件写入一个变量$_所代表的值。ForEach-Object的意思是对数组中的每个元素执行后面的操作。
Get-Content -Path .LineNumbers.txt #获取当前路径下的LineNumbers.txt文件的内容。
Get-Content -Path .LineNumbers.txt -TotalCount 5 #获取文件的前5行
(Get-Content -Path .LineNumbers.txt -TotalCount 25)[-1] #获取文件的第25行。括号返回一个含25行的对象,[-1]这个索引代表最后一行。
Get-Item -Path .LineNumbers.txt | Get-Content -Tail 1 #返回最后一行。比用[-1]这种方式快
Get-Content -Path E:* -Filter *.txt #获取E盘下的所有.txt文件。当使用-Filter参数时,路径中需要有*。-Filter筛选符合条件的。
#默认的,对于多行的文件,Get-Content返回的结果是一组串(按行分割)。-Raw换行符,使得返回的结果是一个串,串尾会有一个换行符。
#-Raw参数是正则表达式多行匹配的关键。
$raw = Get-Content -Path .LineNumbers.txt -Raw
$lines = Get-Content -Path .LineNumbers.txt
Write-Host "Raw contains $($raw.Count) lines."
Write-Host "Lines contains $($lines.Count) lines."
#输出结果:
Raw contains 1 lines.
Lines contains 100 lines.
(cat $workspaceaa.txt ) -replace "value=`"config.json`"","value=`"ip.json`"" #简单替换
New-Object
功能:创建一个.net framework 实例或者一个COM 对象
实例:
New-Object -TypeName System.Version -ArgumentList "1.2.3.4" #创建一个System.Version对象。
#-TypeNames 参数指明.NET Framework class的名字。
#-ArgumentList指明要传给.NET Framework class的构建器的的一组参数
$IE2 = New-Object -COMObject InternetExplorer.Application #创建一个COMObject对象。
$IE2.Navigate2("www.microsoft.com")#调用IE2的Navigate2方法,打开一个网页www.microsoft.com
$IE2.Visible = $True #设置对象的Visable属性使得应用可见。只执行前两行是不会自动弹出网页的。
#上述三行可用以下一行代码代替
$IE1 = New-Object -COMObject InternetExplorer.Application -Property @{Navigate2="www.microsoft.com"; Visible = $True}
#用一个带多个参数的构建器创建一个对象
$array = @('One', 'Two', 'Three') #定义一个字符串数字。串用单引号,逗号隔开,圆括号括起来,前加@符号。
$parameters = @{
TypeName = 'System.Collections.Generic.HashSet[string]'
ArgumentList = ([string[]]$array, [System.StringComparer]::OrdinalIgnoreCase)
}
$set = New-Object @parameters
New-Item(ni)
功能:创建一个文件或文件夹,同时也可以设置它所创建的对象的值。
注意:New-Item 创建已经有的目录,即使使用-Force参数,也只会返回原有对象,不会覆盖原来的对象。
实例:
New-Item -Path . -Name "testfile1.txt" -ItemType "file" -Value "This is a text string." #-Path指明在当前目录;-ItemType指明创建对象的类型;-Value指明创建对象的值(向文件中添加的内容)
New-Item -Path "c:" -Name "logfiles" -ItemType "directory" #在C盘下创建一个名字叫logfiles的目录。注意:添加-Force参数创建同名文件夹不会造成覆盖。但-Force创建同名文件夹会覆盖原文件。
New-Item -ItemType "directory" -Path "c:ps-testscripts" #在c:ps-test目录下创建目录scripts
New-Item -ItemType "file" -Path "c:ps-testtest.txt", "c:ps-testLogstest.log" #在c:ps-test下创建test.txt,在c:ps-testLogs下创建test.log文件
New-Item -Path * -Name temp.txt -ItemType File #-Path参数支持通配符,此命令是在当前路径的所有子目录下创建一个文件夹temp.txt。
New-Item -ItemType SymbolicLink -Path .link -Target aa #aa可以是文件夹名或者文件名。给当前目录下的对象aa在当前目录下创建一个名字叫link的符号连接。
New-PSSession(nsn)
注意:若是在远程机器创建一个PSSession,注意相关配置要配置好(建议两台机器在同一个域中)。参见此文
功能:在本地机器或远程机器上创建一个powershell会话(powershell session,PSSession)。
说明:使用一个PSSession可以运行多条共享数据(函数,变量的值)的命令。为了在一个PSSession中运行命令,需要用Invoke-Command cmdlet。为了使用PSSession直接和远程机器交流,使用Enter-PSSession cmdlet。当然,不创建PSSession而直接使用Enter-PSSession和Invoke-Command中的-ComputerName参数也可以实现在远程机器上运行命令。这种方式主要用于命令运行,之后连接会关闭。
实例:
$s = New-PSSession #在本地机器上创建一个PSSession,把此PSSession存放在变量$s中,之后可以用这个PSSession去在本地机器上运行命令。
$Server01 = New-PSSession -ComputerName Server01 #在远程机器Server01上创建一个PSSession,保存在变量$Server0中。之后可以用此PSSession在远程机器上运行命令。
$s1, $s2, $s3 = New-PSSession -ComputerName
Server01,Server02,Server03 #在多个机器上创建多个PSSession
Copy-Item(copy,cp,cpi)
功能:从一个位置的内容复制到另一个位置。不会删除源文件。
重要说明:默认的,即使目标路径有同名文件,也会自动覆盖。添加-Force参数会拷贝一些不能轻易改变(如只读文件)的文件(针对源文件而言)。-Recure参数长拷贝目录。
实例:
一台机器内
Copy-Item "C:WabashLogfilesfile.txt" -Destination "C:Presentation"#复制文件file.txt从源目录到目标目录C:Presentation下。
Copy-Item "C:WabashLogfilesfile.txt" -Destination "C:Presentationfile1.txt"#复制文件file.txt从源目录到目标目录C:Presentation下,重命名为file.txt
Copy-Item -Path "C:Logfiles*" -Destination "C:Drawings" -Recurse#将目录Logfiles下所有内容复制到目录Drawings下。
本地机器到远程机器
$Session = New-PSSession -ComputerName "Server01" -Credential "ContosoUser01" #创建一个PSSession连接到远程机器Server01,-Credential参数指明认证
Copy-Item "D:Folder001test.log" -Destination "C:Folder001_Copy" -ToSession $Session #在远程机器上复制一个文件到另一个目录。使用了储存在Session变量中的会话信息。
$Session = New-PSSession -ComputerName "Server02" -Credential "ContosoUser01"
Copy-Item "D:Folder002" -Destination "C:Folder002_Copy" -ToSession $Session #在远程机器上复制一个目录到另一个目录
param- -static parameters
静态参数是函数中可以访问的参数,非常常用。
声明一个ComputerName参数
Param(
[Parameter(Mandatory=$true,
ValueFromPipeline=$true)]
[String[]]
$ComputerName
)
以上方式定义的参数有以下特点:
1.此参数是强制性的(不可缺省)
2.从管道接收输入
3.接收一组串作为输入
参数属性是可选的,如果函数的参数无属性,则可以不要。当然,可以给一个参数添加多个属性。但作为一个高级函数,函数必须至少有CmdletBinding属性和参数属性中的一个。
从ComputerName参数的定义中抽象处定义参数的语法:
Param(
[Parameter(Argument1=value1,
Argument2=value2)]
$ParametrName
)
声明一个位置参数
Param(
[Parameter(Position=0)]
[String[]]
$ComputerName
)
#Position=0表示它是第一个参数。因此-ComputerName使用时可以不要。
Start-Process(start,saps)
功能:在本机启动一个或多个进程。默认的,进程会继承在当前进程中定义的所有环境变量。
实例:
Start-Process -FilePath "sort.exe" #利用一个放在当前目录下的可执行文件
Start-Process -FilePath "myfile.txt" -WorkingDirectory "E:" -Verb Print #打印Emyfile.txt文件。会弹出一个选项框,输入目标文件的名字。注意-WorkingDirectory指明的是myfile.txt文件
Start-Process -FilePath "notepad" -Wait -WindowStyle Maximized #启动一个notepad.exe进程,且会最大化窗口。
Start-Process -FilePath "powershell" -Verb RunAs #以管理员身份运行powershell。会打开一个新的powershell窗口。
参数说明:
-ArgumentList 指明要启动进程时要用的参数和参数值。参数形式:引号内用空格隔开。或者一组串用逗号隔开。
-Wait 包含此参数的命令会等待-Wait参数指定的进程及其子进程的完成。
Get-Alias(gal)
功能:获取当前会话的别名。
实例:
Get-Alias #获取当前会话的所有别名
Get-Alias -Definition Write-Ouptut #获取命令Write-Output的别名到原名的映射关系
Get-Alias -Name p* #获取以p开头的别名,同时可以看到别名到原名的映射关系。
Get-Alias -Name ls #获取ls的原名
Get-Command
功能:获取安装在机器上的所有命令。包括cmdlet,别名,函数,脚本,应用等。
实例:
Get-Command -Type Cmdlet | Sort-Object -Property Noun | Format-Table -GroupBy Noun #获取所有cmdlet,将命令名按Noun分类;然后按组显示。
Select-String(sls)
功能:从输入串或者文件中匹配固定的文本。它的匹配是基于文本行的。默认的,它会输出首次匹配的文件名,行号,和包含匹配目标的行。Select-String使用正则表达式匹配。
实例:
'Hello', 'HELLO' | Select-String -Pattern 'HELLO' -CaseSensitive -SimpleMatch #通过管道传输匹配的对象。-Pattern 指明匹配的模式。-CaseSentitive指明区分大小写。-SimpleMatch指明-Pattern的参数值并不解析为正则表达式,只做简单匹配。
Get-Alias | Out-File -FilePath .Alias.txt #Get-Alias返回的内容写入文件Alias.txt中。若当前目录没有此文件会自动创建Alias.txt。
Get-Command | Out-File -FilePath .Command.txt #同上
Select-String -Path .*.txt -Pattern 'Get-' #在当前目录的.txt文件中挑选以Get开头的行。注意用的是-Path参数。
Select-String -Path "$PSHOMEen-US*.txt" -Pattern '?' #在目录$PSHOMEen-US下的所有.txt文件中匹配有 ?这个字符的行。?是转义。$PSHOME这个变量是powershell目录。
Get-ChildItem -Path C:WindowsSystem32*.txt -Recurse | Select-String -Pattern 'Microsoft' -CaseSensitive #-Recurse参数使得会在system32的子目录下查找是否有.txt文件,进行匹配。
Select-String -Path E:tempaa.txt -Pattern "Microsoft" -NotMatch #匹配文件aa.txt中不含Microsoft的行。
Select-String -Path .Command.txt -Pattern 'Get-Computer' -Context 2, 3 #-Context输出每个匹配行的前2行和后三行。
#一行出现多次匹配用-AllMatches参数
Select-Object
Get-ChildItem(ls,dir,gci)
功能:在指定的一个或多个位置获取对象和子对象。
注意:Path值的书写要注意,C:test和C:test*的区别很大。假设Test目录下有一个空目录aa。则路径格式为C:test时,即使使用了-Depth或者-Recurse参数,也会获得一个空目录。而路径格式为C:test*时,使用了-Depth或者-Recurse参数时,输出为空。即以"*"结尾的目录,在使用了Recurse或者Depth参数时,是不会获取空目录这种对象的。
实例:
Get-ChildItem -Path C:Test #展示C:test目录下的文件和子目录。
#结果如下:
Directory: E:temp
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2021/4/16 15:50 111
-a---- 2021/4/16 16:08 305 aa.txt
结果说明:
mode列出文件或目录的属性。
l 链接文件
d 目录文件
a 结构文件
r 只读文件
h 隐藏文件
s 系统文件
Get-ChildItem -Path C:Test -Name #只输出子目录名和文件名。未使用-Recurse参数时,默认只获取C:Test目录下的对象:目录和文件。不会递归搜索子目录的对象。
Get-ChildItem -Path C:Test* -Name #只输出子目录名和文件名,也会输出空目录。因为没有Recurse和Depth参数
Get-ChildItem -Path C:Test*.txt -Recurse -Force #获取C:Test目录及其子目录下的所有.txt文件。
#下面第一个*说明是目录的内容,第二个*代表扩展名是txt的所有文件
Get-ChildItem -Path E:temp* -Include *.txt #获取E:temp目录下的txt文件。子目录中的.txt文件不显示。!!!!注意路径中的*不可少,否则将会无输出。
Get-ChildItem -Path E:temp* -Recurse -Include *.txt #会显示子目录中的.txt文件。若有-Recurse参数,可以不要路径中的*。但此时获取的对象中会有子目录,这往往很不变。所以建议加上*
Get-ChildItem -Path E:temp -Exclude a* #-Exclude参数指明获取的文件和目录不是以A或a开头的
Get-ChildItem -Path E: -Depth 0 -Name #获取E盘下所有目录和文件。若-Depth=1,则还有显示一级子目录下的目录和文件。即默认Depth值是0,获取的是path值目录下的内容(不递归搜索子目录)。此处可以看出,指明了Depth参数后,可以不用再指明Recurse参数。
Expand-Archive
功能:解压一个扩展名为zip的文件
实例:
Expand-Archive -LiteralPath ".backup.zip" -DestinationPath "E:temp" -Force #-LiteralPath参数指明要解压的文件,文件名不可以含有通配符。-Force参数最好加上,此时会覆盖同名文件(夹)
Expand-Archive -Path Draftv2.Zip -DestinationPath C:Reference #解压当前目录下的文件Draftv2.Zip到目标目录C:Reference。-Path参数值中可以有统配符。
参数说明:
-DestinationPath:默认情况下,Expand-Archive会在当前位置创建一个和源文件同名的文件夹。此参数可以指明其他文件夹,当此参数指定的文件夹不存在时,会自动创建。
Expand-Archive -LiteralPath ".backup.zip" #会在当前目录创建backup文件夹,用于放置解压的文件
Set-ItemProperty
功能:改变指定对象的属性值。
实例:
C:GroupFilesfinal.doc | Get-Member -MemberType Property #列出文件final.doc文件有哪些属性。并不会列出属性的值。
Set-ItemProperty -Path C:GroupFilesfinal.doc -Name IsReadOnly -Value $true #设置final.doc的IsReadOnly属性为TRUE。注意修改属性时要看对象是否有次属性。
Compare-Object
功能:比较两个对象,其中一个对象作为参照。
结果说明:<= 后面跟的是参照对象仅有的。=>后跟的是比较对象仅有的。-IncludeEqual参数使用时,==表示两者都有的。
实例:
Compare-Object -ReferenceObject (Get-Content -Path E:LineNumbers.txt) -DifferenceObject (Get-Content -Path E:myfile1.txt)
结果:
InputObject SideIndicator
----------- -------------
aaa => # aaa是myfile1.txt中仅有的
bbb =>
cc <= #cc是LineNumbers.txt仅有的
$objects = @{
ReferenceObject = (Get-Content -Path C:TestTestfile1.txt)
DifferenceObject = (Get-Content -Path C:TestTestfile2.txt)
}
Compare-Object @objects -ExcludeDifferent
#只要比较结果
$fileA = "E:LineNumbers.txt"
$fileB = "E:myfile1.txt"
#计算文件的hash值,比较。
if((Get-FileHash $fileA).hash -ne (Get-FileHash $fileB).hash)
{"files are different"}
Else {"Files are the same"}
Invoke-Expression
功能:把一个字符串当作命令允许或者计算一个表达式。返回"命令"的执行的结果。
实例:
$a="Get-"
$command=$a+"Process" #command值为Get-Process
Invoke-Expression $Command #获取本地或者远程机器上的进程
Invoke-Expression -Command "C:ps-testtestscript.ps1" #在本地允许一个脚本testscript.ps1。等价于"C:ps-testtestscript.ps1" | Invoke-Expression
$Command = 'Get-Process | where {$_.cpu -gt 1000}' #$_代表当前对象。
#单引号包裹的变量不会替换成值,双引号则相反。
Invoke-Expression $Command #Command变量中$_变量没有发送值替换
Select-Xml
功能:通过-XPath参数的值的设定,从XML串或XML文档中搜索文本。用Content,Path,Xml参数来指定要搜索的内容。
实例:
$Path = "$PshomeTypes.ps1xml" #Pshome是powershell.exe所在的目录,此目录下有一个名为Types.ps1xml的文件。
$XPath = "/Types/Type/Members/AliasProperty" #$XPath是一个类似路径的说明。见下文。
Select-Xml -Path $Path -XPath $Xpath | Select-Object -ExpandProperty Node #Select-Xml选中xml文件中的AliasProperty节点(Node对象),把这些节点发送给Select-Object。-ExpandProperty参数展开Node对象。
#以下结果表明Node对象有两个属性:Name和ReferencedMemberName
结果:
Name ReferencedMemberName
---- --------------------
Count Length
Name Key
Name ServiceName
RequiredServices ServicesDependedOn
....
[xml]$Types = Get-Content $PshomeTypes.ps1xml #[xml]使得$Types是一个xml对象。
Select-Xml -Xml $Types -XPath "//MethodName"|Select-Object -ExpandProperty Node #-Xml参数指明XML的内容来自$Types变量。 -XPath指明到MethodName节点的路径(搜索所有名为MethodName的节点)。Select-Object则是展开Node。
最后
以上就是酷酷抽屉为你收集整理的Powershell常用命令(一)Invoke-Command(icm)Get-Content(cat,gc,type)New-ObjectNew-Item(ni)New-PSSession(nsn)Copy-Item(copy,cp,cpi)param- -static parametersStart-Process(start,saps)Get-Alias(gal)Get-CommandSelect-String(sls)Select-ObjectGet-ChildItem(ls,dir,g的全部内容,希望文章能够帮你解决Powershell常用命令(一)Invoke-Command(icm)Get-Content(cat,gc,type)New-ObjectNew-Item(ni)New-PSSession(nsn)Copy-Item(copy,cp,cpi)param- -static parametersStart-Process(start,saps)Get-Alias(gal)Get-CommandSelect-String(sls)Select-ObjectGet-ChildItem(ls,dir,g所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复