1

I'm coming from a unix background where I've written some scripts using bash and bourne. But I need to write some scripts using powershell and I'm having a hard time finding information.

For example, in *nix, I can do man bash and read all about how to use bash and I can do man some_command to read about a specific command. So far, I found some powershell equivalents like get-command to see all available commands, but getting and using objects is really confusing me.

For instance, I'm trying to create a new scheduled task using powershell and found some sample code here on SO. Here is a snippit:

$schedule = new-object -com Schedule.Service 
$schedule.connect() 
$tasks = $schedule.getfolder("\").gettasks(0)

$tasks | select Name, LastRunTime

foreach ($t in $tasks) {
  foreach ($a in $t.Actions) {
     $a.Path
  }
}

I understand what this script is doing, but without experience how would I know to do the following:

  • Know to use new-object -com Schedule.Service
  • Know that this object has a .connect method
  • Know that this object has a .getfolder and .gettasks object

A lot of the code seems ambiguous to me, so where would I find out the above information natively using powershell?

4

4 回答 4

2

我不熟悉 powershell 脚本,但发现了这个,也许是一些使用参考:

第一个链接是要查找的 PowerShell 脚本网络广播等等。

使用 Windows PowerShell API 调度作业:http: //msdn.microsoft.com/en-us/library/windows/desktop/jj150476%28v=vs.85%29.aspx

Windows PowerShell 入门指南:http ://technet.microsoft.com/library/ee221100.aspx

关于 Windows PowerShell,以下帮助主题:
get-command :从 cmdlet 代码获取有关 cmdlet 的信息。
get-member :获取对象的属性和方法。
where-object :过滤对象属性。
about_object :解释 Windows PowerShell 中对象的使用。
about_remote :告诉如何在远程计算机上运行命令。

概念帮助文件被命名为“about_”,例如:
about_regular_expression。

帮助命令还显示 cmdlet 的别名。这些是替代名称或昵称,通常更易于键入。例如,Invoke-Command cmdlet 的别名是“remote”。

要获取别名,请键入:

获取别名

希望这会有所帮助。

于 2013-07-08T12:50:07.147 回答
2

于是你发现了Get-Command。这是一个好的开始,它将向您展示可用的 cmdlet。导入管理单元/模块后可能会有更多可用。使用Get-PSSnapin -RegisteredGet-Module -ListAvailable查看可以导入的其他模块,以便为您提供更多 cmdlet。

PowerShell 的好处是创建者内置了别名系统。它的目标之一是让您在具有 bash/DOS 背景时更容易学习 PowerShell。例如,如果您键入man Get-Process,它将为您提供Get-Process cmdlet. 要查看它的所有文档,请使用man Get-Process -Full. man实际上并不存在,它是一个别名,具有与UNIX/Linux 上Get-Help相同的功能。man您可以使用Get-Aliascmdlet 显示已注册的别名及其定义。

您找到的脚本正在处理一个COM对象。您可以通过-com用于的参数来判断New-Object(实际上是 的缩写-ComObject)。与 .NET 对象不同,COM对象不是内置到 PowerShell 中的,但是 PowerShell 支持它们的方式与 VBScript 支持它们的方式相同。该Get-Membercmdlet 将公开 .NET 和 COM 类型的对象成员(属性和方法)。更多关于Get-Member下面。

您找到的脚本使用New-Objectcmdlet 创建COM名为Schedule.Service. 有两种主要方法可以找到有关此对象的更多信息。第一个是您可以使用Get-Membercmdlet 在 PowerShell 中直接列出其属性和方法。此 cmdlet 适用于 .NET 和 COM 对象。这是一个非常宝贵的 cmdlet,它将向您展示您可以对您的对象执行哪些操作。使用manGet-Help Get-Member来了解它。实际上,您可以使用Get-Member来发现您询问的对象成员,例如.connect方法。第二种方法是在 Microsoft 的开发人员文档网站 MSDN 上查找对象的文档。可能是该特定对象的最佳页面。

于 2013-07-08T12:58:49.223 回答
1

谷歌上第一次点击“powershell 创建计划任务”导致这里,其中一个答案是指Schedule.ServiceCOM 对象。该对象的文档为您提供了该对象的所有方法和属性的列表。

您还可以使用get-member来发现会话中任何变量或对象的所有方法和属性。

$schedule = new-object -com Schedule.Service


   TypeName: System.__ComObject#{2faba4c7-4da9-4013-9697-20cc3fd40f85}

Name            MemberType Definition
----            ---------- ----------
Connect         Method     void Connect (Variant, Variant, Variant, Variant)
GetFolder       Method     ITaskFolder GetFolder (string)
GetRunningTasks Method     IRunningTaskCollection GetRunningTasks (int)
NewTask         Method     ITaskDefinition NewTask (uint)
Connected       Property   bool Connected () {get}
ConnectedDomain Property   string ConnectedDomain () {get}
ConnectedUser   Property   string ConnectedUser () {get}
HighestVersion  Property   uint HighestVersion () {get}
TargetServer    Property   string TargetServer () {get}

组件对象模型是 Windows的核心部分,默认 Windows 安装中有数百个甚至数千个 COM 对象,用于与操作系统和其他安装的软件进行交互(软件也可以安装自己的一组对象)。现在可以用 .NET Framework 程序集和 PowerShell 模块、管理单元和 cmdlet 替换其中的很多内容。

您如何发现 COM 对象?通常通过谷歌搜索你想要做的事情,通常你会发现有人已经发布了类似的东西,或者你的搜索会在对象自己的在线文档中关闭单词。

如果您使用的是 PowerShell 3,则根本不需要使用Schedule.Service- 有一组用于处理计划任务的 cmdlet。见New-ScheduledTask首发。

如果您正在寻找通用的 PowerShell 教程,我通常会向人们介绍这个

于 2013-07-08T12:56:19.900 回答
1

您走在正确的轨道上,Get-Command *foo*它将列出所有包含单词 foo 的 Cmdlet,Get-Help New-Object并将向您显示 New-Object cmdlet 的帮助文件。

但是,您随后会直接使用 COM 对象,这远远早于 Powershell。COM 编程很古老,而且可能很陈旧。Powershell 允许您与 COM 交互,但它并不是真正的“Powershell 方式”。

在 Powershell 3 中,我能够找到Register-ScheduledJob

The Register-ScheduledJob cmdlet creates scheduled jobs on the local computer.

如果可能的话,我会说这是使用 COM 接口的首选方法,只是因为它可能更容易且更多 Powershelley。

于 2013-07-08T12:59:00.080 回答