1、1. Windows Power Shell 入门系列之一:开始 原文链接:http:/ 几年前,脚本孩子得到了驾照,同一天,脚本爸爸带儿子去完成他的首次驾驶。就像你们可能想象到的一样,脚本孩子十分兴奋,甚至无法等待他的爸爸将车开到预定的地点。他们停好车后,脚本爸爸和脚本孩子交换了他们的座位。脚本孩子启动了汽车,认真地调整好了镜子的角度,松开了手刹,并将变速箱调整到了行进档位。接着,他停止了所有的动作。 为什么停止?就这么简单:想开车是一回事,而真的开车是完全不同的另一件事。你不能责备脚本孩子的犹豫,毕竟,他一直以来都只会骑自行车,他能骑自行车到达许多他想去的地方。既然如此,那又有什么理由改变
2、呢?为什么要放弃一个实践证明可行的交通方式,而采用另一种新的,你未必喜欢的,况且对于你来说或许太难的方式呢?诚然,汽车相比自行车有些优势,但是代价是什么呢? 同样的事情,正发生在在为 WINDOWS系统管理工作而设计的新技术上。现在你们大家都可能听说过 Windows Power Shell,微软的新命令行 CONSOLE和脚本语言,或许你们很多人都下载并安装了 PowerShell。(如果你还没有这么做,那么请到 下载 Windows PowerShell去查看更多信息) 然而,就像脚本孩子一样,也许你也到此为止了。毕竟,想用新的命令行 CONSOLE和脚本语言是一回事,而实际使用这个命令行
3、 CONSOLE和脚本语言,是完全不同的另一件事。你已经使用了几年的 GUI,cmd.exe,以及 VBScript,你本来就可以实现几乎所有你想实现的系统管理工作。为什么还要改变呢?为什么要放弃一个实践证明可行的系统管理方式,而采用另一种新的,你未必喜欢的,况且对于你来说或许太难的方式呢? 这些都是很好的问题和正常的疑虑。坦率地讲,我们也不能解释这些问题。但是,我们要说的是:拿到了驾照,不是说你就再也不能骑自行车了。交通方式不是唯一的:拿到小轿车的驾照不等于你就不能骑自行车、开公交车,或者骑摩托车(甚至喘着气步行)。你宁愿骑自行车?没问题!想骑自行车的时候,你就骑自行车,想开汽车的时候,你就
4、开汽车。如果你发现骑自行车给你带来更多乐趣,那么,你就骑自行车,只在真正需要的时候才开车。 Windows PowerShell也是一样。如果你学了 PowerShell,难道就意味着你不能再继续使用 GUI,并且抛弃你所有的 VBScript吗?当然不是!许多人都认为:PowerShell是 VBScript和其他管理技术的替代品。这不正确。准确地说,PowerShell是 VBScript和其他管理技术的补充。也许经过一段时间的使用,有人会觉得“喔!我喜欢 PowerShell,我想我会把 PowerShell用在所有任务”,没问题!祝你开心,把你的问题告诉脚本专家,让我们看看有什么能帮你
5、的。另外一些人会觉得:“我不太肯定,我喜欢 PowerShell提供的一些功能,但我已经在 VBScript上面花了很多时间。我宁愿继续使用 VBScript。”,那么会怎么样?同样没问题!就像俗话所说的一样:如果东西没坏,就不要去改变什么。如果 VBScript工作得没有问题,那么就继续使用它。 那么为什么还要考虑 Windows PowerShell?有几条理由:第一,它就像是一个驾驶执照,你可能永远用不着它,但最好还是能有一个。确实,目前看来,PowerShell可能还没有什么大不了的。PowerShell 能做到的大多数系统管理任务,VBScript 早就能够做到了。但另一方面,也有一
6、些例外:比如,如果你想实现自动化管理微软 Exchange Server 2007,你就必须使用 Power Shell。随着时间的推移,这些“例外”可能会演变为规则:因为 PowerShell会被连续地改进、加强(PowerShell 2.0 正在开发),而 VBScript却不会。不得不承认,你可能现在还不需要 PowerShell,但很快,也许就会发生改变。因此为什么不乘现在你有时间,并且可以根据自己的时间安排进度,提前先开始学习呢? 这个,就是这篇 Windows PowerShell Manual手册的初衷:本文希望用温和且轻松的方式介绍 Windows PowerShell。就像很
7、多其他手册,我们告诉你怎么踩油门,怎么“驾驶”你的新命令行 CONSOLE和新的脚本语言。其后,我们也要告诉你怎么维护你的新命令行 CONSOLE以及脚本语言。并且请不必担心,除了标准内容,我们也会介绍一下一些附件和自定义的项目。我们知道你们其中一些人已经安装了 Windows PowerShell,并且从那时起,就坐在一旁想:“好了,现在该干什么了?”。如果你也是这样,好,你可以停止烦恼了,你已经来到了正确的地方。 2. Windows Power Shell 入门系列之二:启动原文链接:http:/ 当你安装 Windows PowerShell 时,安装程序已经为你安装好了一个快捷方式。
8、对于 Windows XP 和 Windows 2003,快捷方式应该在“开始 - 所有程序 - Windows PowerShell 1.0 - Windows PowerShell”。没找到快捷方式?那么 PowerShell 的默认安装路径在 %windir%System32WindowsPowerShellv1.0 (例如:C:WindowsSystem32WindowsPowerShellv1.0)。打开文件夹,双击 PowerShell.exe。 当你启动 Windows PowerShell 后,会看见类似下图的一个窗口: 如果你在想“咦,这个看上去就像 MS-DOS 命令行窗口
9、“,对了!PowerShell 正是利用了 MS-DOS 的命令行 SHELL。这样做至少有一个好处:因为你可能已经使用了无数次旧的命令行窗口,那么你对如何使用 PowerShell 已经有了一个很好的基本概念:键入命令然后按下 ENTER 键。例如,你知道你的 IP 地址吗?键入 ipconfig 然后按下 ENTER 键。 PS C:Scripts ipconfig Windows IP Configuration Ethernet adapter Local Area Connection: Media State . . . . . . . . . . . : Media discon
10、nected Ethernet adapter Wireless Network Connection: Connection-specific DNS Suffix . : IP Address. . . . . . . . . . . . : 192.168.120.17 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : 192.168.120.1 正如上面的例子所暗示的一样,你可以在 PowerShell 中运行所有的命令行可执行命令。你甚至可以在 PowerShe
11、ll 窗口中运行你的 VBScript 和批处理文件。你想在 Windows PowerShell 窗口中运行 C:ScriptsTest.vbs 吗?没问题:PS C:Scripts test.vbsMicrosoft (R) Windows Script Host Version 5.6Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.This message was generated by Test.vbs.另外,在 Windows PowerShell 中你可以找到许多你喜欢的终端命令,比如 cd 和
12、 cls,甚至UNIX 命令如 ls。虽然也有些不重要的小小例外,但这些命令几乎会完全按照你期望的方式运行。你想把当前目录从 C:Script 改变到 C:Windows 吗?只需要使用一条 cd 命令:PS C:scripts cd c:windowsPS C:WINDOWS Or, if you prefer:PS C:scripts chdir c:windowsPS C:WINDOWS一般情况下,这些终端命令都是 Windows PowerShell cmdlets 的“别名“。如果你愿意看一下完整的别名列表,只需要输入下面的命令,并且按下 ENTER:Get-AliasPowerSh
13、ell 是大小写不敏感的,你也可以这样输入这个命令:get-alias甚至这样:geT-ALIaS3. Windows Power Shell 入门系列之三:停、停,等等,什么是 Cmdlets?原文链接:http:/ 哦,对了,问得好。Cmdlets 是 Windows PowerShell 的命令,它们有些类似命令行工具。(然而,Cmdlets 只能在 PowerShell 里使用,没有运行 PowerShell 时,你是不能单独运行PowerShell 的 Cmdlets 的)。如果没有命令行工具,Cmd.exe 也不会有太大作为的,即使它有那么几个内置命令(例如 cd 和 cls)。许
14、多“高级“的(以及大多数有用的)任务,都是通过命令行工具完成的,比如 ipconfig.exe 和 ping.exe。Windows PowerShell 也以相似的方式工作:虽然 PowerShell 已经有了一些内置的命令,但大多数高级的工作,还是必须通过 Cmdlets来完成。 实际上,PowerShell 的命令(比如 cd)没有更多的含义,它们都只是 Cmdlets 的别名而已,它们只是 Cmdlets 的“昵称“。在这个例子中,cd 命令只是一个调用 Set-Location 这个 Cmdlet的另外一种方法。想切换当前目录到 C:Windows?你可以直接使用 Set-Locat
15、ion 替代 cd 命令:PS C:scripts Set-Location C:WindowsPS C:WINDOWS当然,Windows PowerShell 中包含的 Cmdlets 功能远远比切换目录强大得多。举个例子来说:输入下面的命令,然后看看会发现什么:PS C:WINDOWS Get-Process你会得到下列类似的返回结果,所有正在你计算机上运行的进程信息!Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName- - - - - - - -103 5 1296 3676 32 0.05 2964 alg264 7 4872
16、 10244 70 0.84 920 asghost101 4 3080 4692 38 1.77 2124 atiptaxx168 7 5584 6968 54 0.30 2896 BTStackServer143 5 3712 6640 52 0.30 2776 BTTray752 13 11048 20256 77 2.81 452 CcmExec672 7 2796 6864 68 18.80 1184 csrss139 6 1204 4544 38 0.70 2760 ctfmon很灵活吧?或许你还想列出 C:Scripts 目录下的所有文件,包括所有子文件夹中的文件,你只需要输入:
17、Get-ChildItem C:Scripts -recurse我们所做的,只是调用了 Get-ChildItem 这个 Cmdlet。你也许注意到了我们传递给 Get-ChildItem 一对参数:C:Scripts 和-recurse。正如你猜到的一样,C:Scripts 是我们希望列举文件的目录路径名。你也许还注意到,我们没有把目录路径名称用双引号括起来。在PowerShell 中,有一条规则几乎总是成立:没有必要把参数名用引号包围起来,除非你的参数中包含空格。比如:假设你要列举在 C:Documents and SettingsKen Myer 目录下的所有文件。由于这个路径中含有空格
18、,因此需要将路径名用双引号包围起来:Get-ChildItem “C:Documents and SettingsKen Myer“我们最初那个命令的第二个参数,-recurse,告诉 Get-ChildItem 递归地获取目录文件信息。这是告诉 Get-ChildItem 获取所有 C:Scripts 的子目录信息(以及子目录的子目录)。Windows PowerShell 1.0 有 129 个 Cmdlet,这些 Cmdlets 包括文件、文件夹管理,文本文件读写,事件日志管理,甚至可以创建 COM 和.NET 框架的对象。 现在,一切都进行得很好,但是在坐到方向盘后面开始驾驶之前,脚本
19、孩子并没有真正学过开车。阅读并不能替代实践。Windows PowerShell 没有什么不同,你也可以阅读有关 Cmdlet 的相关资料,但是仅仅通过阅读,你不会得到对 cmdlets 的全面感受,以及它们能做什么,直到你真正坐到方向盘后面开始实际地使用 Windows PowerShell。当脚本专家无法做到副驾驶位置并给予你指导时(就像“减速!看路边!不要这么猛地踩刹车!”),我们可以做第二好的选择:我们提供每一个步骤的指引,带领你使用 Windows PowerShell 完成一些典型的系统管理场景。如果你觉得这很有趣(为什么不呢?),你可以去我们的 PowerShell 虚拟实验室看
20、一下Windows PowerShell virtual 。 提示: 这里有一个可以节约时间的小提示。当 cmdlet 和参数一起使用时,你可以只输入恰好可以唯一识别这个参数的字符数量。这是什么意思?比如,Get-ChildItem 只有一个参数(recurse),这个参数以字符 r 开头。这意味着我们可以使用下面的命令格式表示-recurse 参数:Get-ChildItem C:Scripts -r如果 Get-ChildItem 还有一个参数以字母 r 开头,我们假设它叫-readonly。在这个例子中,我们可以这样指定-recurse 参数:Get-ChildItem C:Script
21、s -rec为什么需要输入-rec?很简单:我们必须键入足够的字母(3 位),才能让 cmdlet 区分出-recurse 和 readonly: -recurse -readonly还是觉得打字太多了?那好,如果你用 gci 这个别名(不用说,gci 就是 Get-ChildItem 的别名),你可以用下面的简短命令递归地获取 C:Scripts 目录的内容:gci C:Scripts -r酷吧!4. Windows Power Shell 入门系列之四:我有几个问题要问你们原文链接:http:/ 是的,我们知道:你想了解另外还有哪些 cmdlets,你还想了解这些 cmdlets 都有什么
22、用。真实情况是:我们无法在这篇文章里解答这些问题。然而,我们可以给出一个容易接受的资源,你可以自己回答这些问题。 首先,Windows PowerShell 是一个非常容易交流而且开放的技术:你只需要提出问题进行询问,PowerShell 会非常高兴地告诉你所有关于它的一切,还记得 Get-Alias 这个 cmdlet 吗?它返回一个所有别名的列表。与此类似的,还有一条 cmdlet:Get-Command,它返回一个所有cmdlets 的列表。下面是部分 Get-Command 的返回信息:PS C:scripts Get-CommandCommandType Name Definitio
23、n- - -Cmdlet Add-Content Add-Content -Path -Value -Pass.Cmdlet Add-Member Add-Member -MemberType -Name.Cmdlet Add-PSSnapin Add-PSSnapin -Name -PassThru -Ve.Cmdlet Clear-Content Clear-Content -Path -Filter -Force -Filter .Cmdlet Clear-ItemProperty Clear-ItemProperty -Path -Name Get-Command | Format-L
24、ist这样,你就能按顺序获得所有 cmdlets 的完整信息了:Name : Add-ContentCommandType : CmdletDefinition : Add-Content -Path -Value -PassThru -Filter -Include -Exclude -Force -Credential -Verbose -Debug -ErrorAction -ErrorVariable -OutVariable -OutBuffer -WhatIf -Confirm -Encoding Add-Content -LiteralPath -Value -PassThru
25、-Filter -Include -Exclude -Force -Credential -Verbose -Debug -ErrorAction -ErrorVariable -OutVariable -OutBuffer -WhatIf -Confirm -Encoding Path :AssemblyInfo :DLL : C:WINDOWSassemblyGAC_MSILMicrosoft.PowerShell.Commands.Management1.0.0.0_31bf3856ad364e35Microsoft.PowerShell.Commands.Management.dllH
26、elpFile : Microsoft.PowerShell.Commands.Management.dll-Help.xmlParameterSets : Path, LiteralPathImplementingType : Microsoft.PowerShell.Commands.AddContentCommandVerb : AddNoun : Content我们怎么做到这个的呢?当查询返回时,Format-List 是一个 cmdlet,它接收信息并把它们按照 list view 的格式输出(list view 表示每行显示一种信息,而不是把信息以列的形式显示在一个表中)。但是这个
27、奇怪的符号“|”表示什么呢?其实,这个符号是一个管道符号,它表示:我们希望把 Get-Command 返回的信息通过一个内部的“管道”传递给 Format-List 这个cmdlet,并做进一步的处理。你说你无论如何无法理解这个东西?没关系,这也是为什么我们这篇手册专门有一章“pipelines and piping”的原因。 现在,回到我们的主题 Get-Command 是很有用的:毕竟,它给你列举了所有 cmdlets 的信息。然而,它并没有告诉你怎么使用这些 cmdlets。因此,你还需要访问 PowerShell 的内置帮助系统。5. Windows Power Shell 入门系列之
28、五:PowerShell 随时提供帮助原文链接:http:/ PowerShell 有一个非常好的特点,那就是它有一个非常全面的帮助系统,并与 Shell 本身紧密集成。一旦知道了 cmdlet 的名字,你就可以通过调用 Get-Help 来获取其他有关这个 cmdlet 的信息。Get-Help Format-List等一下,先不要输入这个命令。就像我们所提到的一样,PowerShell 含有一个十分全面的帮助系统。然而,它还含有一个稍微复杂一些的帮助系统。输入 Get-Help Format-List 的确可以获得一些有关 Format-List 的附加信息。然而,这些信息主要是一个语法图
29、和一些简单描述。如果希望获取到更多的信息,包括了例子和参数的详细描述等信息,你需要加入-full 参数,就像下面一样:Get-Help Format-List -full或许,你只对例子感兴趣,那么就加入-examples 参数:Get-Help Format-List -examples再等等!还是别急着输入这个命令。虽然这些帮助主题非常好,但是 PowerShell 的帮助引擎留下了一点小小的遗憾。例如:你用 Get-Help 打开了一个主题,PowerShell 会显示整个主题并把光标停留在末尾。真正需要阅读的时候,你可能需要向上滚动屏幕并找到第一行。要解决这个问题(并不完全是个问题),
30、你可以使用管道技术将 Get-Help 定向输出到 more 命令中,它允许你每次显示一个屏幕的内容:Get-Help Format-List full | more这样就好多了。虽然你还是只能向前翻页而不能向后翻页。(试一试就知道是什么意思。) 另外还有一个小问题:可能是好事也可能是坏事(更像是坏事),PowerShell 的帮助系统不会处理行末的断字。例如:DETAILED DESCRIPTIONThe Get-Process cmdlet retrieves a process object for each process. Without parameters, “Get-Proce
31、ss“ gets all of the processes on the computer, as though you typed “Get-Process *“. You can also identify a particular process by process name or process ID (PID), or pass a process object through the pipeline to Get-Process. For Get-Process, thedefault method is by process name. For Stop-Process, t
32、he default method is by process ID.看一下在 DETAILED DESCRIPTION 下面的一行。你会看到这一行最后的 the 字并没有很好的被处理。PowerShell 把字母 t 打印在这行的末尾,把 he 打印在下一行的开始位置,而不是把整个the 字放在下一行。这是不是使得帮助信息更加难度呢?你或许会说是。 有没有办法处理这个问题呢?据我们所知,目前还没有。这也是为什么脚本专家们把 Windows PowerShell 图形化帮助文件收集在一起的原因(另外,还有一个 our VBScript to Windows PowerShell Convers
33、ion )。这个帮助文件的内容和你在 PowerShell 所中能查询到的信息是一样的。所不同的是,我们已经把断字全都修复了,并且把它们全部都保存到了一个.chm 文件中。这有助于阅读,并且提供了图形化的全文搜索功能。如果你还阅读了它的 Readme 文件,那么你甚至可以通过命令行方式访问这个帮助文件。只需要简单地输入一条命令,例如:Get-GUIHelp Format-List不用输入像-full 或-examples 这样的参数,使用图形化帮助文件,你总是获取到所有的相关信息。 你知道吗?你是对的,帮助系统是那么有用,它提供了你已经知道的命令的详细帮助。(例如,你想使用 Get-Child
34、Item 来列举 C:Scripts 下所有的文件和目录,你只是记不清应该使用那个参数来递归获取目录和文件。)但是,如果你连使用 PowerShell 的哪个命令来完成你的工作都不知道了呢?是否意味着你必须从头到尾来阅读一遍帮助文件呢? 这样当然也不是不行。但更好的方法是,你也许可以去看看脚本中心的 基于任务的 Windows PowerShell 介绍。在这里你可以找到基于任务的文章,这些文章的标题就像这样: Save Data to a Text File and Copy Files or Folders。你只需要做一件事情,那就是浏览一下这些文章,然后再在 PowerShell 的帮助
35、文件中找到相关 cmdlet 的更详细的信息。 Note. 对,图形化帮助文件中带有“基于任务的帮助”的链接。例如,如果你正在查看 Set-Content 这条命令的帮助,那么你同时可以看到指向 Save Data To a Text File 文章的链接。 6. Windows Power Shell 入门系列之六:嗨!脚本呢?原文链接:http:/ 你不会真的以为我们忘记了脚本和脚本编写技术了吧?(脚本专家可不是白叫的。)Windows PowerShell 为编写和运行脚本提供了一个非常酷,非常强大的环境。然而,真正要开始在PowerShell 下运行脚本,还是需要一些技巧的,至少刚开始
36、的时候是这样。因此,本手册包含了一个单独的章节来介绍怎么在 Windows PowerShell 下运行脚本。 我们会在那个单独的章节中介绍大多数脚本相关的知识。如果你真的想编写 PowerShell 脚本,我们同样也建议你去看看我们的 PowerShell scripting webcast。这里,我们只想简单说一下,PowerShell 脚本可以使用任何的文本编辑器进行编辑。例如 Notepad 就包含了所有写脚本所需要的功能。确保将脚本文件保存在一个纯文本文件中,并且给他取一个.ps1 为扩展名的文件名。这就是所有需要做的工作。 Note. 好吧,或许还有一些要坦白的:其实,你必须要写一
37、些脚本。这也是你更加要去看看PowerShell scripting webcast 的原因。 PowerShell 另外还有一个很酷的功能。通篇文章我们都在说 PowerShell 是一个命令行 CONSOLE和脚本语言。这里也是一个很好的证明:你可以从命令行窗口运行命令,也可以把命令保存在一个.ps1 文件中作为一个脚本。更酷的是,这些命令都是一样的,你在在命令行中输入的命令,可以在脚本中不加改变的使用,反之亦然。 例如,下面的两行简单命令: $a = Get-ChildItem C:Scripts$a在第一行中,这个脚本用了 Get-ChildItem 来获取一个集合,这个集合包含了 C
38、:Scripts 的所有子文件夹和文件的信息。这个集合被保存在了变量$a。第二行,就是简单地显示了一下$a 变量的值。 并不那么令人激动是不是?这种想法很正常。然而,真正激动人心的是:你可以把这两个命令放在一个.ps1 文件中,然后运行这个脚本,或者你也可以一条一条地在命令行提示中输入这两条命令。 不用说,将来我们还会加入更多 - 多得多 - 的有关脚本和脚本编写的更新。2008/6/17. Windows Power Shell 入门系列之七:运行你的脚本原文链接:http:/ 生命中最激动人心的事,莫过于得到一个崭新的命令行 SHELL 和一个新的脚本语言。实际上,它太令人兴奋了,以至于你
39、迫不及待地想把它拿出来炫一下,但是过度的兴奋却让你都不知道怎么打开它的包装盒。下载并安装过 Windows PowerShell 的人知道我们在说什么,如果你也像其他人一样,当安装程序刚刚结束你就双击一个.PS1 文件(.PS1 就是 Windows PowerShell 脚本文件的扩展名),然后坐好等待奇迹发生。 结果下面的事情发生了: 哈!脚本没有运行,而是被 Notepad 打开了。很有趣,不过好像跟你的想象有些不符。等一下!你可能想,我知道怎么回事了:是不是在运行 Windows PowerShell Script 之前必须先运行PowerShell?好,这样好像也说得通。于是,在这样
40、的想法驱使下,你有打开了 Windows PowerShell 并且在命令提示下输入了.PS1 文件的路径。然后按下了 ENTER 键并继续等待奇迹的发生: 结果却发生了下面的事情: File C:scriptstest.ps1 cannot be loaded because the execution of scripts is disabled on this system. Please see “get-help about_signing“ for more details.At line:1 char:19+ c:scriptstest.ps1 哦好!太好了!一个新的命令行 SH
41、ELL 和一个新的脚本环境居然不允许你运行脚本!微软的那些专家们都在想些什么? 别慌张,相信它,所有事情都是正常的。你只需要学习一点 Windows PowerShell 的小技巧。而且脚本专家正在这里教你怎么做。8. Windows Power Shell 入门系列之八:从 Windows PowerShell窗口中运行你的脚本原文链接:http:/ 现在,我们开始从 Windows PowerShell 中运行脚本。(这是运行 Windows PowerShell 脚本的主要方法。)为什么你会得到一个怪异的错误信息呢?那是因为,Windows PowerShell 包含了一些安全设置,其中
42、有一项名叫“execution policy”(脚本执行策略)。这个策略会检测PowerShell 运行脚本的方式(或者是否允许执行)。默认情况下,PowerShell 的执行策略是被设置为 Restricted(限制执行)的,这意味着所有脚本包括你自己写的脚本,不被允许执行。Note. 你可以用这条命令检测脚本的执行策略:Get-ExecutionPolicy现在看来,这个策略有些太严格了。毕竟,我们要一个不能运行脚本的环境来做什么?但是没关系,如果你不喜欢默认的执行策略(你肯定不喜欢),我们可以改变它。例如,如果你希望PowerShell 能够流畅运行你所有的脚本,不提出任何问题,但是对于
43、从网络上下载的脚本,又只允许它运行那些经过可信签名的脚本。你可以用下面的命令,把执行策略设置为RemoteSigned。 Set-ExecutionPolicy RemoteSigned另外,你也可以设置执行策略为 ALLSigned(所有脚本,包括你自己写的脚本,都必须被可信任的证书供应商签名)或者 Unrestricted(所有脚本都可以运行,不管它们是否含有有效签名)。 Note. 不知道“给脚本签名”是什么意思?那么打开 PowerShell,输入下列命令,然后按下ENTER 键: Get-Help About_Signing或者,下载 Windows PowerShell Graph
44、ical Help File 然后阅读有关章节。 改变执行策略后,你就可以运行你的脚本了。然而还是可能发生错误。假如,你尝试切换你的当前目录到 C:Scripts(就像 cd C:Scripts)。C:Scripts 目录下含有一个叫 Test1.ps1 的文件,根据一般的想法,你输入了 Test.ps1 然后按下了回车: Test.ps1结果你得到了这样的回答: The term test.ps1 is not recognized as a cmdlet, function, operable program, or script file. Verify the term and try
45、 again.At line:1 char:7+ test.ps1 我们知道你怎么想的:我们不是已经改变了执行策略了么?是的,我们改了。但是,这与执行策略无关,这只是 PowerShell 处理文件路径的方法。一般情况下,如果你想运行一个脚本,你需要输入全路径。而与你的当前路径无关。就算你正在 C:Scripts 下工作,你仍然需要输入: C:ScriptsTest.ps1我们说“一般情况下”,是因为有几种特殊情况。举例来说,如果你想要运行当前目录下的脚本,你可以使用.符号来制定路径,就像这样: .Test.ps1虽然 PowerShell 不搜索你的当前路径,但是它会搜索所有 PATH 环境
46、变量指定的路径。这意味着什么?意味着如果 C:Scripts 目录是包含在 PATH 变量中的,那么你就可以使用这个命令: Test.ps1这里需要小心。假设你的 C:Scripts 不在 PATH 环境变量中,而另一个目录 D:Archive 在PATH 变量中,而且这个目录也包含一个叫 Test1.ps1 的文件。这时,如果你在 C:Scripts 目录下简单地输入 Test.ps1 并且按下 ENTER 键,想一下哪个脚本会被运行?对了,PowerShell不会运行 C:ScriptsTest.ps1,而是会去运行 C:ArchiveTest.ps1。仅仅因为 C:Archive在 PATH 路径中。 Note. 这里列出了一个命令,可以获