是否有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语句: ifswitchforwhiledoforeach 。 请注意,花括号分隔块和所有这些语句期望块(不像其他语言中的块或单个语句)。 详细信息可以在Get-Help about_If (和about_Switchabout_forabout_whileabout_doabout_foreach )中find。 特别是switch是疯狂的强大,允许正则expression式匹配和其他niceties往往可以作为一个简单的临时parsing器。

variables的内在types(布尔值,整数,浮点数,string)

$true$false分配给一个variables,它是一个布尔值,将一个整数赋值给一个variables,它将变成Int32Int64DecimalDouble ,具体取决于它的大小。 由于溢出,你不会惊讶地降落在-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)

    • psGet-Process的别名。
    • 系统正常运行时间可以通过WMI进行查询,如果需要,可以打包成一个方便的function:

       function Get-SystemUptime { $os = Get-WmiObject Win32_OperatingSystem (Get-Date) - [Management.ManagementDateTimeConverter]::ToDateTime($os.LastBootUpTime) } 

      它返回一个TimeSpan对象。

    • lsoffuser可能会以某种方式从过程对象中被抓取; 但是,从来没有这样做过。 netstat仍然可以作为一个本地程序,你可以简单地运行。

    • df可以有点模仿

       Get-PSDrive -PSProvider FileSystem 

      如果你不仅仅需要看它,WMI可能是更为理智的方式。

  • 文件和目录处理(查找,定位,cd,mkdir,touch,rm,rmdir)

    • findlocate通常可以通过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 
    • cdSet-Location的别名。 可能的位置不仅包括文件系统,还包括registry,variables,别名,证书存储区等。

    • mkdir是一个函数,最终用适当的参数映射到New-Item
    • touch可以用Set-ItemProperty来实现:

       Set-ItemProperty foo.txt LastWriteTime (Get-Date) 

      如果你喜欢,你可以把它放在一个名为touch的函数中。

    • rmrmdirRemove-Item别名。

  • I / O(pipe道,猫,三通,xargs,读,写,覆盖,追加,寻求)

    • pipe道使用的是对象而不是字节,与其他shell相比应该是最重要的。 除此之外,还没有太多惊喜。 许多cmdlet都接受pipe道input。
    • catGet-Content的别名。
    • teeTee-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运算符可以弥补我见过的sedawkcutsplitjoin大部分用法。

    没有stringsfmt

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 + DEnter来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中的脚本或两者的混合。