是否有PowerShell语言参考手册?
我正在评估Windows PowerShell作为cmd.exe的替代品,用于命令行代码的基本过程自动化(例如安装,执行和大量Fortran作业的后处理)。我知道足够的perl和shell来实现我但我想保持在Windows工具链中,而不是需要在Perl,Python,Ruby,Cygwin等方面培训我的同事。我在一家工程公司工作,所以我们不需要为.NET开发.NET或广泛的框架。 简而言之:我们使用内部代码来处理很多数字,我需要一个合理的手段来自动执行重复的手动任务。
问题是我在评估语言时遇到了麻烦,因为我找不到PowerShell的简洁可打印语言参考手册,
是的,我已经看过微软的网站,但是(在2010年这个问题最初被问到的时候),它是如此的混乱和窒息,无关的信息是无法使用的。 谷歌往往指向我回到该网站,并没有非常有帮助。
以下是我感兴趣的一些主题(unix和Perl类似文件):
- 内在函数
- 基本testing/分支/循环function和stream量控制
- variables的内在types(布尔值,整数,浮点数,string)
- 内部数据结构(标量,列表,关联数组,对象)
- 运营商和运营商优先
- 特定于任务自动化语言的function:
- 过程控制(exec,fork,wait,kill)
- 系统监控(ps,正常运行时间,lsof,fuser,netstat,df)
- 文件和目录处理(查找,定位,cd,mkdir,touch,rm,rmdir)
- I / O(pipe道,猫,三通,xargs,读,写,覆盖,追加,寻求)
- 文本处理函数(awk,sed,grep,split,join,cut,fmt,strings)
其他问题,我希望得到回答:
- PowerShell强types(char,string,int,long,float,double)还是弱types(variant)?
- 常用的数据结构是可用的(标量,列表,关联数组),它们是一stream的元素吗?
- 有没有图书馆或模块系统?
- 如果是这样,标准库中是什么?
- 如果我找不到我需要的东西,是否可以使用第三方库?
- 这是一种程序性的,function性的或面向对象的语言 – 或者说每种语言的程度如何?
- 什么是编码习惯? (Perl最佳实践)
- 是否有格式化的期望 – 面向行或自由格式?
- 空格还是大小写?
- 是否有字符集限制?
- 语言是“8位清洁”吗?
- 它是否支持UTF-8,Unicode等?
我非常有兴趣在RTFM中findM,但是请注意,我正处于评估阶段,因此微软出版社(Microsoft Press)的这篇文章已经下降了50美元左右(他们在2010年将成为编辑,印刷文档的主要来源)是一个非首发。
首先 – PowerShell命令行提供了非常有用的文档。 只需input:
PS> help about Name Category Synopsis ---- -------- -------- about_Alias HelpFile Using alternate names for cmdlets and commands in Windows PowerShell about_aliases HelpFile Describes how to use alternate names for cmdlets and commands in Windows about_Arithmetic_Operators HelpFile Describes the operators that perform arithmetic in Windows PowerShell. about_Array HelpFile A compact data structure for storing data elements about_arrays HelpFile Describes a compact data structure for storing data elements. about_Assignment_Operators HelpFile Describes how to use operators to assign values to variables. ....
它会回答你的大部分问题。
请注意,您可以调用exe文件,而无需像以前那样更改(只需调用netstat
,您将看到)。 所以对于一些任务,你可以使用你知道的和喜欢的工具。
至于运营商的优先级,我只看到一个由Kirk Munro撰写的博客文章: Essential PowerShell:了解您的运营商和机箱优先级
书籍 (但仅限于PowerShell V1)
其他的问题在Bruce Payette的书“ PowerShell in Action”中有很好的描述。 它涵盖了V1,但是可以使用V2版本的许多章节来访问MEAP。
或者如果你只是评估,你可以看看一些免费的书籍:
- Jeffery Hicks: Windows PowerShell v.1 TFM (查找“Powershell TFM V1电子书”)
- Tobias Weltner: 掌握PowerShell或Pdf版本
对于一些最佳实践,您可以稍后查看Keith的书: Effective Windows PowerShell
内在函数
不是function本身。 本机PowerShell命令被称为cmdlet – 它们是.NET类,有一个通用的参数/参数系统,可以和pipe道一起使用。 不过,您现在可以直接在PowerShell语言中使用高级函数。
有很多内置的cmdlet用于文件I / O,进程控制,WMI访问以及诸如pipe理variables,别名,模块等的特定于shell的内容。
此外,您还可以使用完整的.NET框架,您可以在其中find各种math函数,而且仅使用PowerShell就可以轻松实现所有其他function。
基本testing/分支/循环function和stream量控制
通常的类C语句: if
, switch
, for
, while
, do
, foreach
。 请注意,花括号分隔块和所有这些语句期望块(不像其他语言中的块或单个语句)。 详细信息可以在Get-Help about_If
(和about_Switch
, about_for
, about_while
, about_do
, about_foreach
)中find。 特别是switch
是疯狂的强大,允许正则expression式匹配和其他niceties往往可以作为一个简单的临时parsing器。
variables的内在types(布尔值,整数,浮点数,string)
将$true
或$false
分配给一个variables,它是一个布尔值,将一个整数赋值给一个variables,它将变成Int32
, Int64
, Decimal
或Double
,具体取决于它的大小。 由于溢出,你不会惊讶地降落在-231。 浮点数和string可以用通常的符号来构造。 如果您不喜欢默认选项,则可以始终声明显式types:
PS> [long]$a = 5 # 5 would usually result in [int], not [long]
内部数据结构(标量,列表,关联数组,对象)
你可以很容易地得到标量:
PS> $a = "foo"
或列表(好吧,它们是下面的数组):
PS> $b = 5, 2, "bar"
或哈希表(关联数组):
PS> $c = @{ 'a' = 5; 7 = 'foo' }
数组和哈希表都默认基于Object
。 为了获得更强的types约束,您需要跳过几个圈。
运营商和运营商优先
运算符可以在Get-Help about_Operators
。
算术(请参阅about_arithmetic_operators
)
+ - * / % ++ --
作业(请参阅about_assignment operators
)
= += -= *= /= %=
逻辑(请参阅about_logical_operators
)
-and -or -xor -not !
非常简单 !
只是另一个名字,不是对那些植根于C语言的人有帮助。
按位
-band -bor -bxor -bnot
比较运营商
由于PowerShell是一个shell,它们不能简单地使用>
和<
它们保留用于redirect,因此稍微麻烦的变体:
-lt -le -eq -ge -gt -ne
其他
也有两种string匹配操作符:匹配正则expression式匹配和匹配通配符匹配; 他们否定的变体: -notmatch
, -notlike
; 和明确的区分大小写和不区分大小写的表亲(默认是不区分大小写的):- -cmatch
, -imatch
, -cnotmatch
, -inotmatch
, -clike
, -ilike
, -cnotlike
, -inotlike
。 请参阅about_comparison_operators
)
那么还有几个特殊的操作符,比如redirect操作符(参见about_redirection
):
> >> 2> 2>> 2>&1
拆分和连接(PowerShell v2中的新增function):
-split -join
那些可以用一个正则expression式分割一个string,或者用指定的分隔符连接一个数组。
replace运算符 – replace也允许正则expression式。
格式运算符-f
:
PS> "{0:N3} {1} {2:yyyy-MM-dd}" -f 123.456789,"foo",(Get-Date) 123,457 foo 2010-02-25
范围操作符..
:
PS> 1..10 -join ", " 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
以及一些其他的,如呼叫运营商&
,点采购.
,带有$( )
子expression式,带有@( )
数组子expression式和数组构造操作符。 虽然这在这里已经失控了,所以请自己来看看。
至于优先权,我怀疑这是你真正需要知道的。 如有疑问,请使用括号。 算术运算符使用通常的规则(add / sub之前的mul / div)。 我自己没有太多的惊喜,所以我没有打扰到目前为止。
特定于任务自动化语言的function
-
过程控制(exec,fork,wait,kill)
这是一个shell,所以
exec
是隐含的。 您可以直接运行其他程序没有问题。fork
是不是Windows的东西,所以没有运气那里。wait
Wait-Process
,我相信也是一样的(如果我正在阅读manpage)。 -
系统监控(ps,正常运行时间,lsof,fuser,netstat,df)
-
ps
是Get-Process
的别名。 -
系统正常运行时间可以通过WMI进行查询,如果需要,可以打包成一个方便的function:
function Get-SystemUptime { $os = Get-WmiObject Win32_OperatingSystem (Get-Date) - [Management.ManagementDateTimeConverter]::ToDateTime($os.LastBootUpTime) }
它返回一个
TimeSpan
对象。 -
lsof
,fuser
可能会以某种方式从过程对象中被抓取; 但是,从来没有这样做过。netstat
仍然可以作为一个本地程序,你可以简单地运行。 -
df
可以有点模仿Get-PSDrive -PSProvider FileSystem
如果你不仅仅需要看它,WMI可能是更为理智的方式。
-
-
文件和目录处理(查找,定位,cd,mkdir,touch,rm,rmdir)
-
find
和locate
通常可以通过Get-ChildItem
实现,并随后使用Where-Object
过滤结果。 -
which
映射到Get-Command
,从PowerShell v2开始按照执行顺序显示命令:PS Home:\> gcm where CommandType Name Definition ----------- ---- ---------- Alias where Where-Object Application where.exe C:\Windows\system32\where.exe
-
cd
是Set-Location
的别名。 可能的位置不仅包括文件系统,还包括registry,variables,别名,证书存储区等。 -
mkdir
是一个函数,最终用适当的参数映射到New-Item
。 -
touch
可以用Set-ItemProperty
来实现:Set-ItemProperty foo.txt LastWriteTime (Get-Date)
如果你喜欢,你可以把它放在一个名为
touch
的函数中。 -
rm
和rmdir
是Remove-Item
别名。
-
-
I / O(pipe道,猫,三通,xargs,读,写,覆盖,追加,寻求)
- pipe道使用的是对象而不是字节,与其他shell相比应该是最重要的。 除此之外,还没有太多惊喜。 许多cmdlet都接受pipe道input。
-
cat
是Get-Content
的别名。 -
tee
是Tee-Object
的别名。 它不仅允许写入文件,而且还可以将其捕获到一个variables中,例如:Get-Process | Tee-Object -Variable proc | Select-Object ProcessName,CPU
-
就我所见,
xargs
可以被ForEach-Object
所取代。 - 面向字节的文件I / O可能会更好地完成正常的.NET对象和方法调用。 用
Get-Content
获得一个完整的文件作为string是很容易的,但除此之外,这有点麻烦。
-
文本处理函数(awk,sed,grep,split,join,cut,fmt,strings)
大多数文本处理函数并不像UNIX系统那样急需,因为您不需要它们来parsing命令输出,至less在您处理返回对象的cmdlet时可能会更容易访问它们属性。
除此之外,还有各种文本处理工具。 根据你需要做什么
switch -regex
和-match
,-replace
和-split
运算符可以弥补我见过的sed
,awk
,cut
,split
和join
大部分用法。没有
strings
或fmt
。
PowerShell强types(char,string,int,long,float,double)还是弱types(variant)?
PowerShell使用.NETtypes的系统。 variables是隐式强types的,但没有声明。 不过,它们可以被赋予明确的types。
常用的数据结构是可用的(标量,列表,关联数组),它们是一stream的元素吗?
因此,您可以使用System.Collections
命名空间中的任何.NET数据结构。 通用集合有点痛苦,但可以完成。 如前所述,元素和散列表的列表也是语言元素。
有没有图书馆或模块系统?
PowerShell v2包含的模块是相关function的cmdlet集合。 有关更多详细信息,请参阅Get-Help about_Modules
。
如果是这样,标准库中是什么?
在这里描述不止是明智的。 您可以调用Get-Command
来查看可用的内容。 像往常一样Get-Help
有助于找出任何给定的事情。
如果我找不到我需要的东西,是否可以使用第三方库?
您可以使用dynamic加载任何.Net程序集
[System.Reflection.Assembly]::LoadFrom(...)
或(在PowerShell v2中) Add-Type
:
Add-Type -AssemblyName ...
这是程序性的,function性的还是面向对象的语言 – 或者说每个语言的程度如何?
维基百科说, 多范式:命令式,pipe道式,面向对象,function性,反思性 。 对象stream水线方面是实现某些问题域的优雅解决scheme的一个好方法。
它是面向对象的,主要是使用对象来实现你的目标,你很less用PowerShell中的对象build模 。 你不能创build自己的类(不包括允许你编写,编译和导入C#或VB代码的Add-Type
),所以就PowerShell语言中的自己的工作而言,抽象可能更多地是程序层面。
什么是编码习惯? (Perl最佳实践)
语言还很年轻,所以还没有这样的东西(至less我没有意识到)。 但是,当试图编码高尔夫PowerShell代码时,显然很难创build完全不可读的混乱。 花括号语言的通常规则工作得相当好,对于较长的pipe道,将它们分成几行通常有助于可读性。
是否有格式化期望 – 面向行或自由格式?
不知道如何回答:大部分是面向行的,但是pipe道命令可能在单行中的每条命令上都更好。
如果你调用一个内置的,你可以使用`(重音符号)作为行延续标记。
空格还是大小写?
除通常终止命令的换行外,除非在转义字符之前,或者当它们出现在块或其他周围结构内。
是否有字符集限制?
没有。
语言是“8位清洁”吗?
是。 我们已经不在70年代的耶Olde年龄了。 您也可以轻松地根据需要命名variables和函数,而不受限制。 我命名了一个函数♦
(U + 0004),例如,它允许我按Ctrl + D , Enter来closures会话。
它是否支持UTF-8,Unicode等?
由于PowerShell使用.Net,你有完整的Unicode支持。 input和输出stream可以设置为各种编码。
这些是来自Microsoft的官方文档(.docx文件,Word 2010+格式)。 您必须下载这些文件,目前无法在线阅读(2013年1月)。
Windows PowerShell语言规范版本2.0
2011年4月在互联网上发布。
(也许这个问题在2010年没有提供,当在这里问这个问题?)
2012年左右发布的Powershell 3.0更新:
Windows PowerShell语言规范版本3.0
同时检查相应页面底部的“相关链接”。
这是我使用的: http : //technet.microsoft.com/en-us/library/dd347616.aspx
我注意到,大多数PowerShell书籍是教程,pipe理员手册或食谱。 这些都是有用的,但是它们在语法和语言规则的细节方面经常不足。 这就是实际的语言参考是非常宝贵的地方。
到目前为止我所见过的PowerShell语言参考手册最接近的是Windows PowerShell in Action,由Bruce Payette编写。 第一版甚至在附录中包含PowerShell语法( 现在可以免费下载PDF格式 )。 第二版增加了有关PowerShell 2.0的详细信息,但不包括语法。
Richard Siddaway的“ PowerShell in Practice”更多的是PowerShell 2.0pipe理手册,但2.4节有十几页体面的语言摘要,描述variables,数据types,控制结构和function。
此外, 这里还有一个免费(需要注册)的 PDF格式的语言参考 ,也是由Bruce Payette提供的。
这个电子书对我来说是非常有用的,同时也是我在Powershell的第一步: http : //powershell.com/cs/blogs/ebook
但我也在寻找一个可用的参考…
Sapien Press已经发布了由Don Jones和Jeff Hicks为PoSh v2更新的Windows PowerShell v2.0:TFM 。 包含PoSh v1参考资料的原始版本现在可以免费下载,并且仍然非常相关。 为所有人提供大量资源
免费的dl版本在这个位置: http://www.primaltools.com/downloads/communitytools/
我仍然可以只下降1个链接每个职位< – 是啊,我是新手,所以…:P
kthxbye
-DBofTLP
快速search打开了这个Powershell用户手册 (这是一个在线手册)
但是如果你想坚持已经安装在Windows机器上的工具,那么除非你打算只支持Windows7和Server 2008及更高版本,否则PowerShell并不是真正的select。
但Windows Script Host在Win98以后的每个版本的Windows上都支持,它支持JScript或VBScript中的脚本或两者的混合。