powershell 进阶教程


PowerShell 3.0 进阶 教程 2 / 44 PowerShell 3.0 进阶教程 在上一期的《PowerShell v3 入门级教程》技术手册中,我们初步介绍了PowerShell v3 新功能、PowerShell v3 的使用等。 PowerShell 3.0 助力 Windows Server 2012 增强了对多服务器和群集等的管理功能,并帮助 Hyper-V 3.0 管理交换机等等。PowerShell 的作用无处不在。这里我们总结了最常见和最实用的 PowerShell 技巧,与你分 享。 PowerShell 与 Windows Server 2012 Windows 管理员可以充分利用 Windows Server 2012 中的 PowerShell 3.0 来简化故障转移群集、组策 略等的管理过程。  在 Windows Server 2012 中启用多服务器管理  PowerShell cmdlets 增强 Windows Server 故障转移群集管理  组策略常用的五大 Power Shell 命令  PowerShell vs. CMD vs. Bash:究竟谁是最好的命令行 shell? PowerShell 与 Hyper-V 3.0 PowerShell 除了能够帮助管理员使用故障排除集群、管理组策略之外,当然还能帮助其管理 Hyper-v 3.0。  用 Hyper-V 3.0 与 PowerShell 管理可扩展交换机  借助 PowerShell cmdlets 配置 Hyper-V 3.0 虚拟交换机  使用 PowerShell remoting 简化虚拟机部署过程——准备工作  使用 PowerShell remoting 简化虚拟机部署过程——完成部署  对比 Hyper-V 2012 与 Hyper-V 2008 中的 PowerShell cmdlets PowerShell 其他小技巧 3 / 44 PowerShell 还有很多其他的小技巧,比如调整 VHD 大小、远程传输信息等等。这里你可以体验一下啦!  使用 PowerShell 命令调整 VHD 大小  如何使用 PowerShell 过滤器根据时间区分文件?  通过 PowerShell 脚本制作并运行输入提示  如何解决访问文件时遇到的 PowerShell 错误  如何使用 Powershell remoting 向远程计算机传输信息?  PowerShell 常见问题及解决方法 4 / 44 在 Windows Server 2012 中启用多服务器管理 基于云的目的,微软 Windows Server 2012 能够完全在本地或者远程进行管理。不仅允许管理远程服务 器,微软也为多服务器管理平台敞开大门。 启用远程管理 你需要在个人服务器上启用远程管理,以此来充分利用多服务器管理的优势。启用远程管理过程:打开服 务器管理器,选择“本地服务器”。接下来,点击紧挨着远程管理的“关闭”。这样做是关闭从其他计算机上 启用远程管理选项的选择对话框。选上启用远程管理复选框(图 1),点 OK。 图 1. 在个人服务器上启用远程管理:打开服务器管理器,选择“本地服务器”容器,点“关闭” 使用服务器管理器 通过服务器管理器管理多个服务器最有效的方法是创建一个服务器组。服务器组包含运行相同任务的物理 或者虚拟服务器组成,统一进行管理和监测。创建服务器组:打开服务器管理器,点击“控制面板”选项,就 会出现 “创建一个服务器组”选项(图 2)。 5 / 44 图 2. 创建服务器组:打开服务器管理器,点击“控制面板”选项,就会出现 “创建一个服务器组”选项。 这一步,Windows 会显示创建服务器组对话框。输入要创建的服务器组的名称呢个,然后选择组内要包 含的服务器。例如,我创建了一个叫 Hyper-V 主机(图 3)的组。选择完应有的服务器后,点击 OK。 图 3. 输入服务器组的名称,并选择要包含的服务器 6 / 44 创建组完毕之后,就会显示在服务器管理器的控制台的列表中。点击此组,会看到组里服务器的一览表(图 4)。例如,你可以看到事件日志、服务项目、性能和最佳实践分析器等。你甚至为组内不同的服务器配置性 能警报。 图 4. 如果点击此组,可以全览组内的所有服务器 PowerShell 呢? 微软一直声明 Windows PowerShell 是用来管理 Windows Server 2012 的首选。大多数的多服务器管理 功能只能通过 PowerShell 来管理。 同时管理多个计算机的方法有很多种。最简单的是使用 Invoke-Command cmdlet。Invoke-Command cmdlet 包含三部分。第一,是它本身。第二,是 ComputerName 开关,接着是运行该命令的电脑列表。最 后一部分是管理远程机器的实际的命令。 为了验证有效性,可以想象你有多个 Hyper-V 服务器,并且想看每个 Hyper-V 主机上的虚拟机名称。通 常,你可以使用该命令创建一个虚拟机和运行该虚拟机的主机名称列表: 7 / 44 Get-VM | FT VMName, ComputerName 图 5. 管理远程服务器的 PowerShell 运行命令以括号结束 这条命令的问题在于它只跟本地服务器上的虚拟机有关。如果我们想运行命令来管理多个服务器,可以使 用 Invoke-Command cmdlet。来看看怎么使用:假设我们给三个服务器分别命名为 Lab1、Lab2 和 Lab3。 使用如下命令: Invoke-Command –ComputerName Lab1, Lab2, Lab3 {Get-VM | FT VMName, ComputerName} 开始执行 Invoke-Command cmdlet。接下来,我们使用 ComputerName 开关和服务器的名称。对远 程服务器进行管理的实际运行的命令包含在括号里,以括号为结束(图 5)。 Windows Server 2012 多服务器管理的一个重要注意事项是,多数情况下,远程主机必须运行 Windows Server 2012 才能进行管理。 (来源:TechTarget 中国 作者:Brien Posey 译者:杨旭) 8 / 44 PowerShell cmdlets 增强 Windows Server 故障转移群集管 理 如果你管理 Windows 故障转移群集,你会发现安装 Windows Server 2012 故障转移群集之后, Cluster.exe CLI 命令没了。这些年,系统管理员们一直使用 Cluster.exe 脚本创建集群、转移故障转移组、修 改资源属性和解决集群宕机问题。是的,Cluster.exe 命令仍在远程服务器管理工具(RSAT)中。但不是默认 安装。 你可能会在 Windows Server 2012 中发现任务栏上的 PowerShell 和 Server Manager 图标,但可能会 疏忽 Windows Server 2012 操作系统默认安装的是 Server Core,包含 2300 多个 PowerShell cmdlet。微 软明确表明了,就像其他任何数据中心服务器一样,可以远程或者使用脚本管理 Windows 服务器。在 Windows 中,意味着 PowerShell。 幸运的是,Windows Server 故障转移群集对 PowerShell 来说不再陌生了。Windows Server 2008 R2 中 就有 69 个群集相关的 PowerShell cmdlet 协助配置集群、组织和资源。本文探讨 Windows Server 2012 故 障转移集群中的新 PowerShell cmdlet。 Windows Server 2012 中,总共有 81 个故障转移群集 cmdlet 可以用来管理 PowerShell 组件。新的群 集 cmdlet 可以执行群集资源注册表检查点(Add-ClusterCheckpoint)、监控虚拟机服务故障 (Add-ClusterVMMonitoredItem)和配置两个新角色:Scale-Out File Servers (Add-ClusterScaleOutFileServerRole)和 iSCSI Target Server (Add-ClusteriSCSITargetServerRole)。 9 / 44 图 1. Windows PowerShell ISE 帮助管理员熟悉故障转移集群 cmdlets 图 1 中,使用 PowerShell cmdlet“Get-command –module FailoverClusters”列出了所有的故障转 移群集 cmdlets。我正在使用内置的 Windows PowerShell 脚本集成环境(ISE)编辑器,它可以帮助管理员 们熟悉所有的故障转移群集 cmdlets。 除了故障转移群集 cmdlets 之外,微软还有一些新的 PowerShell cmdlets 模块,包括 ClusterAwareUpdating(17 个新 cmdlets)、ClusterAware ScheduledTasks(19 个新 cmdlets)和 iSCSITarget(23 个新 cmdlets)。还有很多群集识别更新 cmdlets,比如 Add-CauClusterRole(添加 CAU 角色)、Get-CauReport(获得更新报告)以及 Invoke-CauRun(调用执行扫描和安装任何新的更新) 群集识别任务调度是 Windows Server 2012 的新功能,并且任务调度程序目前与故障转移群集集成。一 个调度任务可以以下面三种方式运行:  ClusterWide on all cluster nodes  AnyNode on a random node in the cluster  ResourceSpecific on a node that owns a specific cluster resource 10 / 44 新的 ScheduledTasks cmdlets 创建一个群集识别调度任务。在表格中,你可以看到 cmdlets 可以注册、 获取和设置集群预定任务属性。 想要使用这些 PowerShell cmdlets,首先你要指派一个动作和 Trigger 变量。这个动作变量指定执行程 序,比如下面例子中的 Windows 计算器。Trigger 变量在执行任务前设置。生成的 cmdlets 安排群集中的任 务在每天 14:00 执行,就像下面这样: PS C:\> $action = New-ScheduledTaskAction –Execute C:\Windows\System32\Calc.exe PS C:\> $trigger = New-ScheduledTaskTrigger -At 14:00 –Daily PS C:\> Register-ClusteredScheduledTask -Action $action -TaskName ClusterWideCalculator -Description "Runs Calculator cluster wide" -TaskType ClusterWide -Trigger $trigger TaskName TaskType -------- -------- ClusterWideCa... ClusterWide PS C:\> 11 / 44 图 2. 在 Task Scheduler 中,管理员可以浏览所有的群集任务 但是,只有 PowerShell 能用来注册、获得/设置和注销群集识别调度任务。你可以在 Computer Management 中使用 Task Scheduler 浏览群集任务(图 2)。 图 3.管理员以使用新的 iSCSI Target cmdlets 配置 iSCSI LUNs 最后,可以使用高可用的 iSCSI Target Server 配置故障转移群集。使用 Install-WindowsFeature –name FS-iSCSITarget-Server(或使用 Server Manager)安装 iSCSI Target Server 角色。然后使用新的 cmdlet Add-ClusteriSCSITargetServerRole 创建 iSCSI Target 资源并产生共享存储。然后,你可以使用新的 iSCSI Target cmdlets 配置 iSCSI LUNs(图 3)。 12 / 44 Windows Server 2012 中的 PowerShell cmdlets 完全可以帮助你管理你的故障转移群集。除了创建、配 置和解决群集问题,你还可以使用 PowerShell cmdlets 添加新的扩展文件服务器、iSCSI Target Server 角色、 集群调度的任务和 Cluster-Aware Updating。 (来源:TechTarget 中国 作者:Bruce Mackenzie-Low 译者:杨旭) 13 / 44 组策略常用的五大 Power Shell 命令 对于组策略的管理,传统的方式是通过组策略管理控制台(GPMC)来进行。使用图形界面(GUI)让管 理员对数千个组策略选项的管理轻松了许多。然而,从 Windows Server 2008 开始,诞生了组策略的 PowerShell 命令,它们可以更加简化组策略的管理过程。 Get-GPO Get-GPO 命令可以检索到每一个组策略对象(GPO)的所有信息。而且可以根据 GPO 的名称,GPO 的 GUID 来检索组策略信息,也可以使用-all 选项来检索域中的所有组策略。虽然你会觉得通过 GPMC 也能获取 这些信息,但是命令的输出还能列出一些通常会错过的信息,如 GPO 的所有者,它的创建时间,最后的修改 时间以及启用还是禁用的信息。在网络中对于组策略问题进行排错时,这些信息将至关重要。 Backup/Restore-GPO 虽然可以通过系统状态的备份来对 GPO 进行备份,但是通过一个专门的任务对组策略进行单独备份也是 一个不错的主意,毕竟这会让 GPO 的恢复变得更加容易。幸运的是,使用 PowerShell 命令 backup-GPO 就 可以做到。与 Get-GPO 协作,可以根据 GPO 的名称,GUID 或者使用-all 选项来指定备份的 GPO。这个命令 最有用的部分是可以使用 PowerShell 脚本来定时进行备份: Backup-Gpo -Name CompanyGPO -Path C:\GPO-Backup -Comment "Monthly Backup" Restore-GPO 命令可以将 GPO 还原到指定的域。然而,如果你使用 backup-GPO 和 restore-GPO 命令 来迁移组策略对象,需要保证 Windows Server2008 操作系统版本的一致性。也就是说,Windows Server 2008 R2 的 GPO 将只能由 Windows Server 2008 R2 进行恢复。 Get-ResultantSetOfPolicy 很久以前,GPMC 就都可以提供组策略的结果报告,这对于组策略的规划和记录来说都是一个非常有用的 工具。如果你使用 PowerShell 命令 get-ResultantSetOfPolicy,也可以迅速得到组策略的结果,而且报告可 14 / 44 以是 HTML 的格式。例如,如果你想检查一个特定的用户在特定的计算机上组策略设置的结果,可以运行以下 的命令,命令的结果会产生一个所有信息的 HTML 文档: Get-GPResultantSetofPolicy -user domain\domain.user -reporttype html -path c:\GPO-Reports\UserGPOReport.html 使用所有提到的 cmdlet,PowerShell 还能够提供一种额外的管理能力,那就是将这些命令脚本化,并按 照计划执行,这样就可以更有效的监控组策略基础架构的运行状况。 Set/Remove – GPLink GPLink 的 cmdlet 可以让你创建和删除 GPO 与 OU 之间的关联关系。虽然在 GPMC 中执行这项任务也 非常容易,但是cmdlet还可以提供另一个方便的管理工具。假如你需要一个GPO只是在每个月的某一天运行, 其它时间禁止运行。可以在这一天计划运行 GP link 命令将 GPO 和需要的 OU 关联起来,并在这一天结束前 将 GPO 的关联删除,整个过程系统自动处理,无需手工运行。你还可以使用其它 GPO 命令与 GPLink 的 cmdlet 进行组合,通过使用管道命令执行 remote-GPLink,以下示例就是如何指定一条组策略或继承组策略,然后删 除其链接: (Get-GPInheritance -Target "ou=CompanyOU,dc=domain,dc=com").GpoLinks | Remove-GPLink Get-GPPermissions 组策略有时会应用失败的原因之一是因为在 GPO 上不正确的权限设置。Get-GPPermissions cmdlet 会 生成详细的报告,报告中会显示 GPO 的访问控制列表(ACL)以及应用的权限。所以,如果你想准确的了解 谁对某个 GPO 有权限,可以使用下列命令: Get-GPPermissions -Name CompanyGPO -TargetName "Company" - TargetType Group 命令会给出以下的输出: Trustee: Domain Users TrusteeType: Group PermissionLevel: GpoRead Inherited: False 15 / 44 你能看到 ACL 中的所有对象,包括所有的管理组和系统组。在应用 GPO 时,有这样一个简单的输出,就 可以非常容易的排除任何基于权限的问题。 (来源:TechTarget 中国 作者:Dave Leaver 译者:陈中华) 16 / 44 PowerShell vs. CMD vs. Bash:究竟谁是最好的命令行 shell? 提问:和其他流行的命令行 shell Bash 相比,PowerShell 的最新版本怎么样?和 CMD 相比呢? Jason Helmick:PowerShell 和 CMD 或 Bash 相比,就好比拿 2013 年的法拉利跑车和 1969 年的甲壳 虫汽车相比。尽管它们都有轮胎和方向盘,但法拉利毕竟更加出众,而且还具备一些令人惊讶的功能。 好不开玩笑地说,开发 PowerShell 的人们非常喜欢并欣赏 LINUX/UNIX (*NIX)shell 能够调用 Windows 基于对象的功能。通过深入体会*NIX shell 长期以来的成功之处并吸取其最优特性,PowerShell 给有过使用 *NIX 经历的 IT 管理员带来了宾至如归的感觉。 微软 PowerShell 团队对于交互式管理重要性的信念通过基于对象的管道以及数以千计的命令(cmdlets) 来体现。PowerShell 在任意规模下为 IT 管理人员提供了即刻的问题解决方案,而这在 Windows 图形用户界 面管理工具中却是严重欠缺的。尽管对只使用 Windows 图形用户界面的管理员来说,学习 PowerShell 的过 程有些艰难,但是掌握 PowerShell 还是值得的。通过 PowerShell remoting,你可以在任何地方按需管理、 部署、编制目录并修复很多系统。 命令的自动化就和将其拷贝到 PowerShell 脚本文件中一样简单,而 PowerShell 脚本文件和原来的批处 理文件很像。管理员不用学习编程就可以将重复出现的任务自动化,但是 PowerShell 脚本语言的强大功能只 有在熟练的脚本编写者手下才能够发挥出来。尽管 PowerShell 的脚本语言基于 C(实际上是基于 C#),但是 具有*NIX 脚本编写经历的专业人士将会看到其受到了其他语言比如 PHP 的影响。PowerShell 脚本能够使用工 作流执行复杂的任务以及真正的 Runbook 自动化。 为了使 PowerShell 成为优秀的管理工具,微软投入了大量的研发,而且在其企业产品线中增加了 PowerShell 命令。 在对比 PowerShell 和 CMD 时,法拉利和甲壳虫之间的差距更加明显。在很多重要的特性上 PowerShell 全面胜过了 CMD——很多特性*NIX 专业人员已经使用了很多年,比如: •一致的命令-命名结构(动词-名词); 17 / 44 •一致的语法。不用再猜究竟是破折号,斜线还是问号了; •完全基于对象的管道; •为所有管理员提供了简单的脚本(自动化); •高级脚本功能,比如 Runbook 自动化; •能够快速为管理员将脚本开发为 cmdlets; PowerShell remoting 允许管理员在任何地方,任意时间, 在任何电脑上执行脚本。 如果你是一名需要管理微软产品以及操作系统的*NIX 专业人员,那么使用 PowerShell 就像是在*NIX 之 外增加了一款相当好用的工具。 如果你是一名 Windows 管理员而且在之前的职业生涯中长期被锁定在图形用户界面之下,那么 PowerShell 是座大山,但是你可以成功登顶。为了今后的职业生涯更进一步,PowerShell 值得你付出努力, 而且掌握 PowerShell 为公司带来的投资回报率相当不错。 (来源:TechTarget 中国 作者:Jason Helmick 译者:张冀川) 18 / 44 用 Hyper-V 3.0 与 PowerShell 管理可扩展交换机 Hyper-V 是微软近年来对虚拟化市场的响应,虽然进展缓慢,但却扎扎实实地提升了微软的 hypervisor 平台。这种进步将在 Windows Server 2012 中持续,下面我们看看跟随微软旗舰服务器操作系统发布的新版 Hyper-V 3.0 有哪些亮点,尤其是如何使用 PowerShell 利用这些功能作完成一些基础任务。 Hyper-V 扩展交换机 Hyper-V 扩展交换机之前未透露,但它对 Windows Server 2012 来说是个神奇的改进。它允许厂商和合 作伙伴撰写扩展,并直接插入到 Hyper-V 的网络架构,将虚拟网络的功能从“虚拟端口的面板”扩展为智能的、 可管理的、可扩展的虚拟网络硬件。 你能放到交换机中的扩展能完成一系列复杂的或不可能在之前版本的 Hyper-V 和虚拟网络中完成的场景。 简言之,微软的合作伙伴已经宣布下个可用扩展将随着 Windows Server 2012 交付给 RTM。 思科发布了为 Hyper-V 打造的 Nexus 1000V,将思科交换机的所有管理和配置功能都进行了打包,并结 合了虚拟交换机功能。 5Nine 展示了将服务器用作虚拟防火墙的扩展功能。 Inmon 证明其 sFlow 产品可用于流量捕获与分析。 可扩展交换机有几大优势。其一,获得 Hyper-V 虚拟网络中的新功能,可添加你想要的扩展,还能保持内 置虚拟交换机的性能与集成。此外,这些扩展紧密插入,它们继承了 Windows Server 2012 中的所有功能, 如热迁移。可直接运行,不需要扩展开发者建立特殊的支持。这些扩展也使用目前的开发架构,并通过验证测 试,因此你能基本确定它们运行得很好,不会引发稳定性问题。 PowerShell cmdlets 可用于管理扩展交换机。例如,如果我想要在扩展交换机实例上启用一个具体的扩 展,我会使用下面的 Enable-VMSwitchExtension cmdlet 命令。 Enable-VMSwitchExtension “name of extension” NameOfSwitchToUse 19 / 44 你也可使用 Get-VMSwitchExtension cmdlet 获得可用的扩展交换机目录,如下面的命令: Get-VMSwitchExtension NameofSwitchToUse | fl Hyper-V Replica Hyper-V Replica 能够让你将一个地点的复虚拟机以及 Hyper-V 和网络连接一同复制到另一个地点。特殊 的是,你不需要任何共享存储。在以前,为了在虚拟机之间实现故障转移,你必须设立故障转移群集来访问共 享存储如 SAN、NAS 设备或者至少一个 quorum 盘。共享存储不再是必须,本质上意味着虚拟机在主机之间 的转移发生在管道中——它们在网络中传达。虚拟机没有中断服务,用户在使用从一台虚拟机复制到另一个主 机的工作负载时,将不会看到任何差异。 在以下两种情境中,Hyper-V Replica 功能尤其显著: • 分散的虚拟机之间的故障转移。可能订阅服务的顾客故障转移自己的虚拟机到“云”,一个可以在高度 互联的数据中心甚至组数据中心支持 Windows Server 2012 的供应者。然后,客户可以直接发送复制信息到 云。这使得一个灾难恢复场景中不需要除了 Windows 以外的其他任何软件。 • Premises-to-premises 支持。随着需求增长或减弱或操作需求,公司可以在总部和企业园区和较小 的分支机构移动主机之间的虚拟机。为了效能靠量、维护窗口或灾难恢复,必要时可以将工作负载从分支机构 复制或者复制到分支机构。 你还可以通过 PowerShell 管理 Hyper-V replica。Cmdlets 可以配置复制过程。你得在想要进行复制的 主机上开始,并使用 Set-VMReplicationServer cmdlet。 Set-VMReplicationServer –ReplicationEnabled 1 –ComputerName computertoenable 在两台主机上运行这些,然后你可以设置一台虚拟机在其之间进行复制,只要两台服务器是相同的域,只 需一个简单的指令 Set-VMReplication: Set-VMReplication –VMName targetvm –ReplicaServerName replicaservertarget – ReplicaServerPort 80 为了加强复制,你可以使用 Start-VMInitialReplication cmdlet 开始复制: 20 / 44 Start-VMInitialReplication –VMName targetvm 在 Windows Server 2012 中,Hyper-V 发展成数据云产品。PowerShell 管理此版本中添加的新功能, 数据中心管理员会发现日常任务和自动化脚本有了一个全新的水平。 (来源:TechTarget 中国 作者:Jonathan Hassell 译者:唐琼瑶) 21 / 44 借助 PowerShell cmdlets 配置 Hyper-V 3.0 虚拟交换机 随着 Windows Server 2012 和 Hyper-V 3.0 的发布,服务器虚拟化变得简单同时也带来更多的惊喜。简 单是由于 PowerShell cmdlets 的存在,惊喜是因为众多新功能。 过去,IT 人员在 PowerShell 方面获得帮助很有限,因此建立和自动化配置宿主机和虚拟机配置很困难。 缺乏帮助曾导致 IT 人员不能使用服务器虚拟化中最具价值、精简、高速和高安全性的工具——Server Core。 借助 Hyper-V 3.0 和 PowerShell,管理员可以轻松地自动化和扩展虚拟化环境、准备容灾脚本和掌控 Server Core。第一步是为网络配置新的 Hyper-V 可扩展交换机。即使您需要为自己的环境进行定制,了解基 本交换机 cmdlets 的相关细节依然非常重要。 在 Hyper-V 3.0 中使用 PowerShell 的优点 通过 PowerShell 配置单个虚拟交换机无法体现其优势。优点如下: • Cmdlets 可以支持虚拟交换机的–ComputerName 等参数,可以同时配置多个宿主机。 • Cmdlets 可以在 PowerShell 上远程运行,提供高效的多宿主机配置途径。 • 您可以写一个单行程序用于配置虚拟交换机,并保存为.ps1 文件,创建脚本用于自动化和容灾。 现有工具 了解了这些优势,你可以开始使用工具完成交换机配置过程。Hyper-V 3.0 包含了 164 个 cmdlets,其中 19 个用于虚拟交换机配置。看起来很多,实际上不用担心,如果您不需要额外的第三方扩展,多数的命令是用 不到的。 现在,创建和配置虚拟机交换机,只会用到 6 个交换机 cmdlets 以及 1~2 个网卡 cmdlets,包括: • Get-Help *VMSwitch* --列出虚拟交换机相关的所有 16 个 cmdlets • Get-Help *VMSwitch -- 列出 6 个必须的 cmdlets(注意命令的最后没有通配符) 22 / 44 创建新的以太网虚拟交换机 外部的虚拟交换机把物理界面和虚拟环境联系起来。涉及 2 个 cmdlets :New-VMSwitch 和 Add-VMSwitch。两个命令很类似,但是用法不同: New-VMSwitch 为一台或多台宿主机创建新的交换机。下面是在两台宿主机上创建以太网交换机的示例: New-VMSwitch –Name ‘Outside Ethernet’ –NetAdapterName Ethernet –ComputerName Host1, Host2 –Notes ‘Teamed nic support required’ 您可以使用 Get-NetAdapter cmdlet 列出宿主机上所有的网卡,以便于使用–NetAdapterName 命令时 识别正确的参数。默认情况下,Hyper-V 3.0 以太网交换机支持宿主机访问网卡。如果您不希望这样,可以通 过-AllowManagementOS 设置为$False 状态。 如果您在 System Center Virtual Machine Manager(SCVMM)中配置了以太网资源池,Add-VMSwitch cmdlet 命令把虚拟交换机添加到资源池。如果还需要定义池的名字,所需命令类似于: Add-VMSwitch –ComputerName host1 –Name ‘Outside Ethernet’ -ResourcePoolName ‘Ethernet Pool’ 配置以太网交换机或许是交换机相关的工作内容,很多环境中还需要宿主机上配置内部或私有网络交换机。 创建额外的内部/私有虚拟交换机 New-VMSwitch cmdlet 命令结合一组网卡相关 cmdlets,将会简化创建内部/私有交换机。如下实例在 Host1 和 Host2 上创建一个新的名为“Inside File Servers”的内部交换机。 New-VMSwitch -Name 'Inside File Servers' -SwitchType Internal -Notes 'File server network' 根据需求,–SwitchType 参数可配置为内部或私有。使用–NetAdapterName 命令时该参数不可用,因为 这个设置仅用于外部接口。 一旦创建内部网卡,您需要为它们分配 IP 地址。现有一组关于网卡的 cmdlets,如下命令显示出我之前创 建的内部交换机: 23 / 44 Get-NetAdapter -name *inside* New-NetIPAddress cmdlet 设置端口相关的 IP 地址、子网掩码和默认网关信息。在本实例中,是我们创 建的内部交换机的虚拟端口。 Get-NetAdapter -name *inside* | New-NetIPAddress -IPAddress 192.168.3.10 -PrefixLength 24 如果宿主机加入了域而某台内部虚机是作为域控的,您还需要给内部适配器添加一个 DNS 入口。在主控 失效时,为宿主机提供了额外的 DNS 服务器用于访问。DNS 的设置通过 Set-DnsClientServerAddress cmdlet 命令实现。 Get-NetAdapter -name *inside* | Set-DnsClientServerAddress -ServerAddresses 192.168.3.15 其它的交换机 cmdlets 剩余的四个基本 cmdlets 可以检索、删除和更改某个虚拟交换机。下面是我个人推荐的一些例子: 要获得多台宿主机虚拟交换机列表及相关参数信息,使用如下 cmdlets: Get-VMSwitch –ComputerName Host1, Host2 | Format-List –Property * 要把虚拟交换机名字从“Inside file Server”更改为“Inside Print Server”,使用 cmdlets 如下: Get-VMSwitch –Name ‘Inside file server’ | Rename-VMSwitch –NewName ‘Inside Print Server’ Set-VMSwitch cmdlet 提供了多个参数可用于现有交换机的调整。下面的命令禁止管理 OS 使用外部交换 机: Get-VMSwitch –SwitchType External | Set-VMSwitch –AllowManagementOS $False 24 / 44 最后一个 cmdlets 是 Remove-VMSwitch,如同字面意思,它的功能是通过名字来锁定和移除某个虚拟 交换机。在测试交换机配置脚本时,您可能会需要把宿主机所有的交换机移除。最后一个例子是把所有交换机 从宿主机移除: Get-VMSwitch | Remove-VMSwitch Hyper-V 3.0 的 PowerShell cmdlets 扩展包使得多宿主机的配置和自动化配置变得简单。通过这些技术 编制 DR 脚本并通过 PowerShell 配置您以后的宿主机交换机。 (来源:TechTarget 中国 作者:Jason Helmick 译者:李哲贤) 25 / 44 使用 PowerShell remoting 简化虚拟机部署过程——准备工作 快速部署新虚拟机的服务需求在不断增加,在支持 PowerShell 的 Hyper-V 3 中快速构建实验环境已经变 得非常简单。本文介绍构建黄金镜像的过程,您可以使用构建的黄金镜像快速部署并配置新虚拟机。 准备工作 在开始之前,为了能够开展相关工作,需要对现有环境或者实验环境进行检查。配置的关键在于部署完服 务器或客户端后,使用 PowerShell remoting 对服务器或客户端进行配置。Windows Server 2012 默认启用 PowerShell remoting。但在之前的版本中必须手动启用。如果你不确定如何实现,可以参考免费的电子书 《PowerShell remoting 的秘密》。 因为直到配置之后新部署的服务器或客户端才能成为域中的会员,所以需要在管理计算机上对配置进行更 改,这样 PowerShell remoting 才能够连接到不在域中的计算机中。打开 PowerShell 并输入如下内容: Set-Item -Path WSMan:\localhost\Client\TrustedHosts -Value * 当然,至少需要一台 Windows Server 2012 运行 Hyper-V 3,一台域控制器以及动态主机配置协议(DHCP) 或者 Boostrap 协议(BOOTP)——假使你想构建用于测试的实验环境,那么我确定你已经准备好了,只是 在此提醒一下。 现在你所需要的就是一个用于虚拟机部署的基础黄金镜像。 制作黄金镜像 黄金镜像是配置过程的核心,而且很容易创建。黄金镜像是一个包含操作系统的虚拟机而且已经做好了使 用 SysPrep.exe 进行克隆的准备。我制作的服务器黄金镜像相当简单,只包括了基本安装以及管理账户。之后 你可以使用 PowerShell 添加角色或者软件。你所需要的仅仅是创建完虚拟机后所生成的虚拟磁盘.vhd 文件 或.vhdx 文件,既然虚拟机以文件形式存在,因此可以在 Hyper-V 中将虚拟机删除。在构建黄金镜像时,主要 的注意事项如下: 26 / 44 • 虚拟机设置。不用担心虚拟机的内存或者其他基本设置,因为所有重要的设置都可以在部署之后进行处 理。 • 计算机名。你所选择的计算机名并不重要,因为主机名可以通过 SysPrep 过程进行修改。正如你所看 到的那样,在部署之后,你将使用 PowerShell 更改计算机名。 • 管理员账号。你需要设置管理员帐户的口令,这样你就可以使用 PowerShell remoting 连接新服务器 了。 • IP 地址设置。网络适配器应该包括通过 DHCP 或者 BOOTP 动态获得的 IP 地址。如果服务器需要一个 专用的 IP 地址,可以在部署之后使用 PowerShell 配置 IP 地址。 配置完服务器后,一定要运行 SysPrep 以确保计算机名和安全标识符的唯一性。示例如下: c:\windows\system32\syspre\sysprep.exe /generalize /oobe /shutdown 黄金镜像现在已经准备好用于部署并配置额外的服务器了。整个过程要从使用黄金镜像制作服务器的新虚 拟磁盘开始。 (来源:TechTarget 中国 作者:Jason Helmick 译者:张冀川) 27 / 44 使用 PowerShell remoting 简化虚拟机部署过程——完成部署 上文介绍了使用 PowerShell remoting 简化虚拟机部署过程的上半部分:构建黄金镜像。这里继续分享下 半部分:使用黄金镜像创建虚拟磁盘、创建虚拟机以及部署完成后的设置。 创建虚拟磁盘 部署过程从创建服务器的新虚拟磁盘开始。通常这个步骤在整个部署过程中消耗的时间最多。你可以通过 拷贝整个虚拟磁盘来为新虚拟机创建一个单独的磁盘或者基于黄金镜像创建不同的磁盘。我喜欢使用 PowerShell Copy-Item cmdlet 进行磁盘拷贝。目标参数可以设置为本地目录或者是通用命名约定路径。 Copy-Item -Path C:\hyperv\GoldImageCore.vhdx -Destination c:\hyperv\FullDisk.vhdx 如果你想创建差分磁盘,可以使用如下示例中的 Hyper-V 3 New-VHD cmdlet: New-VHD -ParentPath C:\hyperv\GoldImageCore.vhdx -Path c:\hyperv\diffDisk.vhdx -Differencing 拷贝完虚拟磁盘后,你可以使用 Hyper-V cmdlets 在 Hyper-V 中创建新虚拟机。 创建新虚拟机 New-VM cmdlet 将创建虚拟机,添加虚拟磁盘并将虚拟机与虚拟交换机相关联。下面这个例子对所使用 的参数进行了解释: New-VM -Name Server1 -VHDPath C:\hyperv\diffDisk.vhdx-SwitchName (Get-VMSwitch -name inside* | Select-Object -ExpandProperty name) • -Name. 虚拟机的名字 • -VHDPath. 虚拟机虚拟磁盘的路径 28 / 44 • -SwitchName. 虚拟机所使用的虚拟交换机。 在之前的文章中,对如何使用 PowerShell 创建并管理虚拟机进行了演示。在上述命令中,我使用附加参 数和 Get-VMSwitch 获取虚拟机将要关联的虚拟交换机的名字。 虚拟机被添加到 Hyper-V 之后,你可以配置虚拟机的参数,比如内存以及 CPU 的数量。在下面这个例子 中,虚拟机 Server1 被配置为使用动态内存,启动内存为 1GB。同样设置了最小内存以及最大内存。 Set-VMMemory -VMName Server1 -DynamicMemoryEnabled $True -StartupBytes 1GB -MinimumBytes 512mb -MaximumBytes 2GB 然后就可以启动虚拟机了! Start-VM -Name Server1 部署之后 请记住新部署的虚拟机还不是域中的一员而且已经生成了计算机名。现在你可以使用 PowerShell remoting 连接虚拟机并更改设置了。 首先,获取虚拟机的 IP 地址并将其保存在变量中。下面这个例子获取了虚拟机的 IPV4 地址: $ip=(Get-VMNetworkAdapter -VMName server1 | Select -ExpandProperty ipaddresses)[0] 为了使用 PowerShell remoting 你需要提供新虚拟机的认证信息。因为经常需要使用这些信息,所以可以 将认证信息保存在变量当中: $cred=Get-Credential 通过 PowerShell remoting 使用 Add-Computer cmdlet 将服务器连接到域中并设置计算机名: Invoke-Command -ComputerName $ip -Credential $cred {Add-Computer -NewName Server2-DomainName company.loc -Credential company\administrator -Restart -Force} 将计算机添加到域中之后,你可以继续使用 PowerShell remoting(或者任何其他的软件)安装角色并更 改配置。下面这个例子在新虚拟机上安装了 Web-Server 角色。 29 / 44 Invoke-Command -ComputerName server1 {Install-WindowsFeature Web-Server} 在下一篇文章中,将演示如何自动化(脚本化)整个过程,读取文本或者值以逗号分割的文件来为计算机 命名。 (来源:TechTarget 中国 作者:Jason Helmick 译者:张冀川) 30 / 44 对比 Hyper-V 2012 与 Hyper-V 2008 中的 PowerShell cmdlets Windows Server 2012 中的 Hyper-V PowerShell 模块使得在无 System Center 虚拟机管理器 (SCVMM)情况下的虚拟化管理变得容易起来。Hyper-V 2012 PowerShell cmdlets 中一些重要的改变值得 我们注意。 如果要对虚拟环境进行批量修改,使用 SCVMM 2012 更方便。但是在大多数情况下,使用内置的 Hyper-V cmdlets 进行一些操作比如创建 VM、修改 VM 的属性、监控 VM 的使用情况等已经绰绰有余了。 Windows Server 2008 R2 中的 Hyper-V PowerShell cmdlets 功能简单明了,但是 Hyper-V PowerShell cmdlets 需要的 CodePlex PowerShell 模块并没有集成在 Windows Server 2008 中。使用 Hyper-V PowerShell 只能执行一些基本的任务,但 SCVMM 却是编写高级 Hyper-V Powershell 脚本的唯一 选择——这对许多组织来说意味着需要增加软硬件成本。 Hyper-V PowerShell cmdlets 的所有功能在新版本的 Hyper-V 中继续存在,但是很多 cmdlets 已经发 生了变化。因此将 PowerShell 脚本迁移至 Hyper-V R2 需要有一个了解新语法的学习过程。 让我们一起来了解一下 Windows 2008 R2 Hyper-V 以及 Hyper-V 2012 PowerShell cmdlets 的一些不 同之处,以及我在新平台上所使用的一些基础脚本。 Hyper-V 2012 与 Hyper-V 2008 中的 PowerShell cmdlets 差异 两个脚本首要的不同之处就是从第三行到第七行。CreateVMR2.ps1 脚本加载了外部的 Hyper-V PowerShell 脚本,而在 Hyper-V 2012 PowerShell 脚本中没有。因为当你打开 PowerShell 时,Hyper-V 会 默认加载外部的 Hyper-V PowerShell 脚本。 继续看一下脚本中创建 VM 的部分,你会看到两个语法的不同之处。New-VM 是一样的,但是当给虚拟 机添加 CPU 时,我们看到的是新的 cmdlet Set-VMProcesssor(CreateVM2012.ps1 的第 33 行) 而不是 Set-VMCPUCount(CreateVMR2.ps1 / 的 35 行)。 31 / 44 另外,Hyper-V 2008 中的 -VM switch 在 Hyper-V 2012 中变成–VMName。Hyper-V 2008 中为 VM 分配 CPU 数量的命令–Count ,在 Hyper-V 2012 中变成-CPUTCount。 为虚拟机配置网络适配器的 cmdlet 在 Hyper-V 2008 以及 Hyper-V 2012 中也有不同之处。Add-VMNic (CreateVMR2.ps1 第 37 行)现在是 Add-VMNetworkAdapter(CreateVM2012.ps1 第 35 行),同时 虚拟网络交换机已经从–VirtualSwitch 更改为–Switchname。 接着看看使用 PowerShell cmdlets 设置 VM 内存的差异。Set-VMMemory cmdlet 是相同的,但是切换 为动态内存的配置已经发生了明显改变。–dynamic cmdlet(CreateVMR2.ps1 的第 36 行) 已经替换为了– DynamicMemoryEnabled(CreateVM2012.ps1 的第 34 行)。–MinimumBytes 以及–MaximumBytes 开 关是 Hyper-V 2012 cmdlets 中的一部分,取代了 Hyper-V 2008 中的-limit。 用于增加虚拟硬件驱动器(VHD)的 PowerShell cmdlets 同样发生了变化。创建新 VHD 的 cmdlets 都 是 New-VHD,但是定义访问 VHD 的文件路径已经从–VHDPaths、–ParentVHDPath (CreateVMR2.ps1 的第 40 行) 替换为 –Path 和–ParentPath(CreateVM2012.ps1 的第 38 行)。为 VM 增加磁盘所需要的 cmdlets 已经从 Add-VMdisk(CreateVMR2.ps1 的第 46 行) 更换为 Add-VMHardDiskDrives (CreateVM2012.ps1 的第 44 行)。同时设置控制器类型以及控制器数量的开关也进行了全面的修改:由– ControllerID 更改为 ControllerType ,由–LUN 更改为 ControllerNumber。 除了 cmdlets 以及开关发生变化外,Windows Server 2012 Hyper-V 还提供了一些新特性。 上述实例并不仅仅是为了比较 Windows Server 2008 R2 Hyper-V 以及 Windows Server 2012 Hyper-V cmdlet 的差异之处,更是为了说明当迁移至新 Hyper-V 平台后需要做的调整。必须对现有的脚本进 行某些转换,在最新版本的 Hyper-V 中所发现的已经扩展的 cmdlets 以及某些新功能的 cmdlets 同样值得花 时间去练习使用。 (来源:TechTarget 中国 作者:Rob McShinsky 译者:张冀川) 32 / 44 使用 PowerShell 命令调整 VHD 大小 在物理机到虚拟机的转换过程中,通常需要调整物理硬盘和虚拟磁盘的大小。避免存储瓶颈比成功迁移更 重要,但是 Hyper-V 磁盘管理工具包中没有可以调整虚拟磁盘大小的工具。即使没有这些工具,你依然可以通 过 PowerShell 命令、VHDResizer 或其它工具设置虚拟磁盘的大小。 使用 PowerShell 命令调整 VHD 大小 微软的 Hyper-V 项目经理 Ben Armstrong 在博客中公布了该方法,似乎可以快速缩小虚拟磁盘空间并缓 解管理员压力。下面是主要的步骤: 打开 Microsoft PowerShell:如果没有安装 Hyper-V PowerShell cmdlets,使用如下命令: Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Management-PowerShell 加载 VHD 文件:使用如下命令加载 VHDX 文件,把命令中的路径更换为需要进行压缩的 VHDX 文件的 路径。 Mount-VHD "C:\VMs\ResizeMe.vhdx" –passthru | get-disk | get-partition | get-volume 请注意,该过程只适用于 Windows Server 2012 自带 Hyper-V 兼容的 VHDX 文件。从 VHD 转化为 VHDX 格式很简单,但在虚拟磁盘文件转换过程中需要停机。 调整分区大小:在压缩 VHDX 文件之前需要调整分区大小,只允许把文件尺寸压缩为分区本身的大小。保 留合理的缓冲区间,请牢记,磁盘碎片整理需要至少 20%的空闲虚拟磁盘空间才可以进行。如下命令调整分区 大小。要注意参数单位包含 KB、MB、GB 和 TB。 Resize-Partition –driveletter D –size 40MB 卸载 VHD:到此为止分区管理就结束了。接下来需要调整 VHD 虚拟磁盘文件的大小。如下命令把 VHDX 文件压缩到您最新设置的分区大小。 33 / 44 Resize-VHD "C:\VMs\ResizeMe.vhdx" –ToMinimumSize 使用下面的命令检查新 VHDX 文件的大小。 Get-VHD "C:\VMs\ResizeMe.vhdx" | fl path, vhdformat, vhdtype, size (来源:TechTarget 中国 作者:Rob McShinsky 译者:李哲贤) 34 / 44 如何使用 PowerShell 过滤器根据时间区分文件? IT 管理员们最常见的一个问题就是如何使用 Windows PowerShell 过滤器依据时间找到目标对象。经常 以这种形式出现“我需要找到某个日期之前的所有文件。” 第一步就是确定日期: $date = (Get-Date).AddDays(-90) 括号里面的命令会得到当前日期。AddDays()方法产生日期对象,括号里的-90 会得到 90 天之前的日期。 这个方法可以计算闰年、长度不同的与以及所有其他变量,其总是返回一个准确的日期。 在 PowerShell v3 中,你可以使用 Get-ChildItem 检索文件列表,使用–recurse 包含子文件,使用–file (PowerShell 3 中的新参数)返回文件。 Get-ChildItem –Path C:\Logs\ -Recurse –File Where-Object –Filter { $PSItem.LastAccessTime –lt $date } 这些文件对象具有各种各样的与日期有关的属性,比如 LastAccessTime。简单的过滤掉: Get-ChildItem –Path C:\Logs\ -Recurse –File | Where-Object –Filter { $PSItem.LastAccessTime –lt $date } 注意,在 PowerShell 2 中,必须将$PSItem 替换为$_。还需要填补 2 中缺少的–File 参数。 Get-ChildItem –Path C:\Logs\ -Recurse | Where-Object –Filter { -Not ($_.PsIsContainer) } | Where-Object –Filter { $_.LastAccessTime –lt $date } 35 / 44 不管怎样,这些命令的输出结果都是 LastAccessTime 是 90 天之前的那些文件。 (来源:TechTarget 中国 作者:Don Jones 译者:杨旭) 36 / 44 通过 PowerShell 脚本制作并运行输入提示 我应该如何运行 PowerShell 脚本的输入提示,并得到最佳结果? 实现这种方式有多种途径,最好的方法是充分利用 PowerShell。看看下面这个脚本: [CmdletBinding()] Param( [Parameter(Mandatory=$True,HelpMessage="Enter one or more computer names")] [string[]]$ComputerName ) ForEach ($computer in $computername) { # $computer has one name - do something with it } 该脚本将 ComputerName 参数(见$ComputerName in the Param() block)定义为接受者,意思是默 认 PowerShell 提示结果。这里还提供了一个帮助信息,但控制台主机不会默认显示。不添加参数,运行这段 脚本,你会得到下面的结果: PS C:\> .\test.ps1 Cmdlet test.ps1 at command pipeline position 1 Supply values for the following parameters: (Type !? for Help.) ComputerName[0]: !? Enter one or more computer names ComputerName[0]: localhost ComputerName[1]: server2 ComputerName[2]: 37 / 44 黑体显示我输入的内容。输入!?,你会看到 HelpMessage。因为该参数是[string[]],不是[string],它可 以接收多个值。在提示空白处点击“Enter”,告诉 shell 你已经完成输入。接下来,你就可以准备执行这个脚 本了。 (来源:TechTarget 中国 作者:Don Jones 译者:杨旭) 38 / 44 如何解决访问文件时遇到的 PowerShell 错误 有时候 PowerShell 会在访问文件时出现错误。这跟设置的 PowerShell 访问文件方式无关。这里有一小 段代码,可以说明哪里出错了: $files = Get-ChildItem c:\mydirectory -File foreach ($file in $files) { $content = Get-Content $file $content –replace 'x','y' $content | Set-Content $file } 命令的目的是将文本文件中的所有“x”替换为“y”,这些文本文件存放在 C:\MyDirectory。假设此路 径下的所有文件都是.txt 格式,并且针对所有的文件执行此命令。 下面中的第一个错误: $content = Get-Content $file $file 针对所有文档文件,不是单个文件。而 Get-Content 至返回一个文件名称。 解释完这个问题,我想在 Powershell 中解决这个错误:通过 Write-Verbose 添加脚本,调试 output 窗 口: $VerbosePreference = 'Continue' $files = Get-ChildItem c:\mydirectory -File foreach ($file in $files) { Write-Verbose "the file name is $file" $content = Get-Content $file $content –replace 'x','y' 39 / 44 $content | Set-Content $file } 继续执行。将 C:\MyDirectory 文件夹名称改成适合系统的并在文件夹中添加两个测试文本并运行。Output 窗口立马显示$file 并不仅仅包含一个简单的文件名称。$file 是一个重要和复杂的对象,包含很多属性,其中 有 Name 属性。 你可能要想,“嗯,这里是解决方法”并运行下面的代码: $VerbosePreference = 'Continue' $files = Get-ChildItem c:\mydirectory -File foreach ($file in $files) { Write-Verbose "the file name is $($file.name)" $content = Get-Content $file.name $content –replace 'x','y' $content | Set-Content $file.name } 实际上,这个是有用的。但问题是,Get-Content 和 Set-Content 命令都需要不止一个文件名称,他们 需要文件的绝对地址。如果你运行 C:\MyDirectory 路径下的文件脚本,这个方法是没问题的。如果从其他路 径运行脚本,Get-Content 不能查找到文件,并会产生 PowerShell 错误。 这时候最好后退一步,试着运行这个: Dir c:\mydirectory | Format-List * 目的是为了查看$file 变量是否有效,包含什么有效属性和什么类型的数据。Fullname 属性提供文件的完 整路径?或者你需要添加一些路径和名称的组合吗?不要猜想,基于事实,修正你的脚本。 与其告诉你答案,不如你自己看看是否搞定了。假设最后一个命令指向一个有效的目录,其中包含有效的 文件,是解决这一问题的关键。 如果事实证明连接是正确的,避免在 PowerShell 中使用+操作符: $name = $file.path + '\' + $file.name 40 / 44 我发现很难读懂,大部分人也一样。因此,依靠 PowerShell 的神奇的双引号和子表达式: $name = "$($file.path)\$($file.name)" 一对双引号,两个$(表达式),你已经完成了。可能不是容易阅读,但它利用了 PowerShell 中很酷的特性。 这实际上是让大家记住,大部分 PowerShell 命令产生对象作为 output。另一方面,一条命令的 input 参 数可能不会接受全部对象。你需要访问一个或两个属性来获得需要的信息。 (来源:TechTarget 中国 作者:Don Jones 译者:杨旭) 41 / 44 如何使用 Powershell remoting 向远程计算机传输信息? 使用 PowerShell remoting 时,区分本地执行代码和远程执行代码很重要。如果你需要在本地执行某个动 作,然后将该命令传递给一个或多个远程的计算机,有一个特殊的方式可以允许这样做——而且这种方式并不 总是显而易见的。 例如,假设你已经创建了一个证书对象,想将其传输给一台远程电脑并在下面的命令中使用: $cred = Get-Credential 要想实现,应该在远程命令脚本块中创建一个参数块。然后,指定该数据通过–ArgumentList 参数传输。 Invoke-Command –ScriptBlock (param($c) Add-Computer –Credential $c } -ComputerName SERVER2 –ArgumentList $cred –ArgumentList 搭载的应该是一个以逗号为分隔符的列表,由 Param()块代替。第一个–ArgumentList 参数定位到第一个 Param()变量,第二个对应第二个变量,一次类推。然后,Param()变量就跟其他变量一样 用在脚本块中。 该技术可以在 Invoke-Command 的内置的帮助中找到。这里是另外一个技术: Invoke-Command –FilePath MyScript.ps1 –ComputerName SERVER2,SERVER2 -ArgumentList $this,$that 这里假设 MyScript.ps1 在内部定义了一个包括两个参数的 Param()块,-- $this 将会发送到第一个参数, $that 对应第二个参数。这基本上跟-ScriptBlock 使用的是相同的技术,但相反的是,一切都是在脚本文件中 定义的。 (来源:TechTarget 中国 作者:Don Jones 译者:杨旭) 42 / 44 PowerShell 常见问题及解决方法 随着 Windows Server 2012 的发布,PowerShell 作为脚本语言,将成为命令行接口的新规范。拥有超过 2300 条命令的 PowerShell 可以更容易的实现任务自动化,为管理员节省宝贵的时间。 但是,当管理员遇到 PowerShell 错误时要怎么处理?如何才能将其修复?PowerShell 专家 Don Jones 将通过处理一些常见的 PowerShell 错误来指导大家如何解决这些问题。 为什么 PowerShell 命令能够在本地正常运行,却无法在远程运行? 对于管理员来说,远程处理是在远程计算机上运行命令的绝佳方式。Jones 甚至将 PowerShell 远程处理 功能称为管理的“未来方式”。但 Windows Server 2012 的远程处理有几个困难需要克服。 解决此问题的方式有多种。首先要确认远程运行的命令是否存在于远程的服务器中。另外当你运行命令时, 时间的准确性也相当重要。最后还需要检查一下这条命令是否是外部命令,避免远程服务器因此而出错。 如果所有方法都无法奏效,问题可能就是 Jones 所说的“环境障碍”,这需要单独的步骤进行排错。 为何无法比较 PowerShell 的变量内容? 无法比较 PowerShell 变量的内容有多种原因。首先,某些 PowerShell 命令返回的结果将多于你的请求。 例如,Dir 命令可以返回多个对象和多种类型的对象。其次,一些命令,如$file,几乎总是会返回多种类型的 对象,而像-like 这样的 PowerShell 运算符则不能针对多个对象运行。 要解决这个问题,可以通过写一条命令来枚举文件,这样可以让用户每次只比较一个对象。如果你一直在 使用 PowerShell,可以有多种方式来做到这一点。 一种方式是构造法(如使用 Foreach),它可以接受多个对象,然后逐个进行比较。另一种方法则是使用 命令的方式(非脚本方式)来进行处理。 为什么当我尝试访问一个文件时,PowerShell 会出错 43 / 44 如果你在试图访问一个文件时,总是遇到问题,部分原因可能是使用 PowerShell 访问文件的方式有问题。 在这个问题上要牢记的最重要的一点就是大多数 PowerShell 命令的输出是对象,而输入参数可能无法接受整 个对象。 若要解决此问题,请务必检查命令变量的属性以及它们包含的数据是你真正需要的。例如,使用$file 是要 获得类似 Fullname 提供的文件路径还是以某种形式将名称和路径进行组合呢? 实际上,到最后你在命令中实际需要或查询的只是其中的一到两个属性。 (来源:TechTarget 中国 作者:Toni Boger 译者:陈中华) 本期电子书由 TechTarget 出品
还剩43页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 1 人已下载

下载pdf

pdf贡献者

xiaodjy

贡献于2016-04-18

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf