5

我是 powershell 新手,但编写了一些在 windows2003 服务器上运行的脚本。它绝对比 cmd 脚本更强大(可能是因为我有编程背景)。然而,当我进一步深入研究时,我注意到:

  1. 启动的每个脚本都将在 1 个 powershell 进程下运行,即。您会看到每个脚本都有一个新的 powershell 进程。
  2. 我测试内存的脚本非常简单,例如,构建一个字符串或查询一个环境变量,然后开始睡眠 60 秒,所以没有必要(至于内存使用)。但是每个过程大约需要> 30MB。叫我小气,但是由于每天都安排运行内存密集型应用程序,并且如果我需要安排一些 powershell 脚本定期运行,并且可能一些脚本作为服务连续运行,我当然会尽量保持内存消耗为尽可能低。<-- 这是因为我们最近遇到了由于内存不足而导致的大型应用程序故障。

我还没有接触过 C#,但有人会认为有时用 C# 编写任务可能会更好吗?

同时,我看到了有关 powershell 内存泄漏的帖子。我是否认为脚本创建的内存将占用powershell的进程空间,因此当脚本终止因此powershell终止时,创建的内存会被清除?

4

3 回答 3

5

我的 PowerShell.exe 2.0 本身(不运行脚本)在 XP 上约为 30MB。这些天来,您不必担心每台机器的平均内存。关于内存泄漏,在某些情况下,人们使用 3rd 方库时会在对象未正确处理时发生内存泄漏。要解决这些问题,您必须使用手动调用垃圾收集器[gc]::Collect(),但这很少见。其他时候,我看到人们习惯于Get-Content读取一个非常大的文件并在使用它之前将其分配给一个变量。这也将占用大量内存。在这种情况下,您可以使用管道一次读取文件部分以减少内存占用。

于 2012-09-05T20:39:00.617 回答
5

1 - 是的,创建了一个新进程。运行 cmd 脚本、vb 脚本或 C# 编译的可执行文件时也是如此。

2 - 加载 powershell 主机和运行时将占用一些重要的内存量,这会因系统和版本而异。它通常是一个比 cmd shell 或专用 C# exe 更重的进程。对于那些 MB,您将获得使 Powershell 如此强大的丰富运行时和库支持。

普通的留言:

  • 操作系统为每个进程分配内存。一旦一个进程终止,它的所有内存都会被回收。这是任何现代操作系统的一般设计,并不特定于 Powershell 甚至 Windows。
  • 如果您的团队在硬件上运行业务关键型应用程序,以至于少数 30MB 进程可能导致灾难性故障,那么您将遇到更大的问题。打开浏览器并访问 Facebook 会消耗更多的内存。
  • 在您想出一些神秘的批处理脚本解决方案的时间里,您可能会在 Powershell 中创建一个更好的解决方案,并且您的公司可以负担得起新的专用硬件,并节省计费时间 :-)
  • 您应该使用最适合该工作的工具。Powershell通常是正确的工具,但并非总是如此。它非常适合在 Windows 环境中自动执行管理任务(文件处理、使用 AD、计划任务、设置权限等)。对于高性能、大量算法任务或针对原始 .NET API 的复杂编码,它不太适用。对于这些任务,C# 会更有意义。
  • Powershell 得到了微软(以及一个庞大的用户社区!)的大力支持/支持,而且很明显,它是 Windows 未来的首选脚本环境。适用于 Windows 的所有新服务器端技术都支持 powershell。如果您在 admin/IT 工作,那么在 Powershell 中培养一些技能将是一项明智的投资。我永远不会阻止某人学习 C#,但如果您的角色更多是 IT 而不是开发人员,那么 Powershell 将更经常成为正确的工具,并且您的同事也更有可能理解它。
于 2012-09-05T20:55:50.303 回答
1

Powershell 比 cmd 需要(更多)资源 (RAM),因此如果您只需要快速简单的东西,那么使用 cmd 更有意义。

CMD 使用本机 Win32 调用,Powershell 使用 .Net 框架。Powershell 需要更长的时间来加载,并且会比 CMD 消耗更多的 RAM。

“我监视了一个执行 Get-ChildItem 的 Powershell 会话。几分钟后它增长到 2.5GB(全部为私有内存),而且几乎没有完成。带有小回滚缓冲区的 CMD“dir /od”在大约 2 分钟内完成,并且从不占用超过 300MB 的内存。”

https://qr.ae/pGmwoe

于 2021-11-20T18:08:18.280 回答