【问题标题】:Advice for Windows system scripting+programmingWindows系统脚本+编程的建议
【发布时间】:2010-10-24 21:48:40
【问题描述】:

我刚拿到一个项目,我必须在 Windows 操作系统上执行以下操作:

  1. 检测有多少驱动器(C:D:E: ..etc)连接到电流 系统
  2. 系统标签是什么 每卷
  3. 多少存储空间 (使用和免费)为每个 驱动器
  4. 每个驱动器的格式是什么 (NTFS/FAT32)
  5. 有多少个文件 在其中任何一个的给定目录中 驱动器
  6. 每个文件有多大
  7. 文件处理(每个文件都是 大约 2GB)我必须做很多事情的地方 类 C 的 fseek() 和二进制数据 解析,大端到小端 转换。必须写一些逻辑 代码。

我是一名经验丰富的 C\C++ 程序员,但我认为这是我开始学习脚本的最佳时机。

我想到的候选人是:( Python || Ruby ) && PowerShell。

我可以用 IronPython+Powershell 来完成这些事情吗?还是有更好的工具/语言?

PS:PowerShell 是要取代 VBScript 吗?此外,既然存在 C#、WPF 和 Powershell,VB.net 有什么用处?

【问题讨论】:

    标签: .net ruby powershell scripting ironpython


    【解决方案1】:

    除了您列表中的第七项之外,使用 Powershell 和 WMI 应该是相当简单的,因为这可能是 Powershell 的自然域。由于前六个列表项不需要另一种语言,因此最后一个使用什么并不重要。你可能可以使用 PS(不过我从来没有用它做过 IO)或任何适合你的东西。

    至于您的第二个问题:VBScript 可能不会在不久的将来消失,因为在编写用于部署的小脚本时,Windows Script Host 仍然是一个更安全的选择,因为它自 98 年以来就预装在每个 Windows 上。Powershell 是仅包含在 Windows 7 及更高版本中。话虽如此,Powershell 的目标肯定是为了自动化目的而淘汰 WSH 和 CMD,因为它提供了与上述功能相同的功能以及更多功能(例如简单的 .NET 和 WMI 访问)。

    另一方面,VB.NET 是 Microsoft 销售的主要 .NET 语言之一。它与 VBScript 几乎没有关系,也不是 Powershell 或 WPF 的竞争对手(见鬼,它们是完全不同的技术)。您可能会看到与 C# 的一些融合,因为这两种语言似乎仍然很难找到它们的目标市场。尽管如此,当您是 VB 程序员时,VB.NET 是切换到 .NET 的最简单选择,并且有很多 MS 不想因为他们创建了 .NET 而失去。

    【讨论】:

      【解决方案2】:

      您可以在 IronPython|IronRuby 或 Powershell 中执行此操作。我推荐 IronPython,因为它是一种真正的语言(比 C# 甚至 Java 更早),具有大量支持和对您需要的 .NET API(甚至是 COM API)的完全访问权限。

      我建议您阅读这篇回答您确切问题的文章:http://pythonconquerstheuniverse.blogspot.com/2009/04/ironpython-windows-scripting-language.html

      【讨论】:

      • Python 是一种比 C# 或 Java 更古老的语言,但 IronPython 肯定不是。即使它较旧,它也不会自动使它变得更好(我也不是说它会使它变得更糟)。另外,不确定您所说的“真实”语言是什么意思。
      • 是的,PowerShell 也是真实的。这当然不是虚构的。 :)
      【解决方案3】:

      PowerShell 可以轻松处理 1-6。 7 号可能可以在 PowerShell 中完成,但根据细节可能会有更好的选择。

      请参阅What tutorial do you recommend for learning PowerShell?,了解有关学习 PowerShell 的一些有用信息。

      【讨论】:

        【解决方案4】:

        我会给你一个不受欢迎的答案,因为没有其他人添加它:Perl。

        如果您作为 C/C++ 程序员对 Win32 API 感到满意,那么 Perl 可能是更简单的方法。它有用于访问 Win32 API 的模块,Perl 对 C/C++ 程序员来说很容易上手。Perl 过去一直为我完成这项工作。

        【讨论】:

          【解决方案5】:

          对于 Perl,Ruby 也可以访问所有 Win32 API 和 WMI 函数。

          【讨论】:

            【解决方案6】:

            Powershell 被设计为 Windows 的自动化平台。当然,Ruby、Python、Perl、VBScript 等都可以完成这项工作,为什么不选择最适合这项工作的工具呢。 以下是获取一些基本驱动器信息的方法:

            $drives = Get-WmiObject -Class  Win32_LogicalDisk | ? {$_.DriveType -eq 3 }
            $drives | select DeviceId,VolumeName,FileSystem,FreeSpace, Size
            

            目录中的文件数

            Get-ChildItem c:\path -Recurse | Measure-Object
            Get-ChildItem c:\path | Measure-Object
            

            文件大小信息

            Get-ChildItem c:\path -Recurse |  Measure-Object -Average -Sum 
                                             -Maximum -Property Length
            

            对于文件处理,您可以使用本地 cmdlet,例如 get-content 或调用和实例化 .Net 类型。

            【讨论】:

              【解决方案7】:

              我认为 PowerShell 是此任务的理想,因为它针对此类系统信息检索进行了优化。与 C# IMO 相比,WMI 在 PowerShell 中非常易于使用(我是一名 C# 开发人员)。哎呀,让我们看看这在 PowerShell 中有多么简单:

              #1,2, 3 and 4
              PS> Get-WmiObject Win32_LogicalDisk | 
              >>  Format-Table Name, VolumeName, FileSystem, Size, FreeSpace -auto
              
              Name VolumeName FileSystem         Size    FreeSpace
              ---- ---------- ----------         ----    ---------
              C:              NTFS       160038907904 100353536000
              D:
              E:
              F:   PDC2008    NTFS       160039239680  40155922432
              V:   Vista      NTFS       250056704000  33944559616
              
              #5
              PS> dir <path> -r | where {!$_.PSIsContainer} | Measure-Object
              
              #6
              PS> dir <path> -r | where {!$_.PSIsContainer} | 
              >>  Format-Table Fullname, Length -auto
              

              PowerShell 可以通过使用 .NET Framework 的能力轻松处理 #7。有关 PowerShell 中 fseek 样式编程的示例,请查看从第 139 行开始的 tail-content script

              【讨论】:

                猜你喜欢
                • 2023-03-08
                • 2017-04-28
                • 2010-10-17
                • 1970-01-01
                • 1970-01-01
                • 2011-11-16
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多