我创建了一个PowerShell脚本,它循环遍历大量的XML Schema(.xsd)文件,并为每个文件创建一个.NET XmlSchemaSet对象,调用Add()并向Compile()其添加模式,并打印出所有验证错误.
此脚本可以正常工作,但某处存在内存泄漏,如果在100个文件上运行,则会占用数十亿字节的内存.
我在循环中基本上做的是以下内容:
$schemaSet = new-object -typename System.Xml.Schema.XmlSchemaSet
register-objectevent $schemaSet ValidationEventHandler -Action {
...write-host the event details...
}
$reader = [System.Xml.XmlReader]::Create($schemaFileName)
[void] $schemaSet.Add($null_for_dotnet_string, $reader)
$reader.Close()
$schemaSet.Compile()
Run Code Online (Sandbox Code Playgroud)
(可以在此要点中找到重现此问题的完整脚本:https://gist.github.com/3002649.只需运行它,并在任务管理器或Process Explorer中观察内存使用量的增加.)
受到一些博客帖子的启发,我尝试添加
remove-variable reader, schemaSet
Run Code Online (Sandbox Code Playgroud)
我也尝试过$schema从中Add()做起
[void] $schemaSet.RemoveRecursive($schema)
Run Code Online (Sandbox Code Playgroud)
这似乎有一些影响,但仍有泄漏.我假设旧的实例XmlSchemaSet仍在使用内存而不进行垃圾回收.
问题:我如何正确地教垃圾收集器它可以回收上面代码中使用的所有内存?或者更一般地说:如何通过有限的内存来实现我的目标?
我想用PowerShell用selenium,并从下载硒http://www.java2s.com/Code/Jar/s/Downloadseleniumremotedriver2350jar.htm.当我尝试加载其中一个dll时,我遇到了错误.希望有人可以帮助我.
这是我的系统信息.
OS Name: Microsoft Windows 7 Enterprise
OS Version: 6.1.7601 Service Pack 1 Build 7601
OS Manufacturer: Microsoft Corporation
Run Code Online (Sandbox Code Playgroud)
这是我的PowerShell信息.
PS C:\Users\test\Downloads\selenium-dotnet-2.35.0\net40> $psversiontable
Name Value
---- -----
PSVersion 4.0
WSManStackVersion 3.0
SerializationVersion 1.1.0.1
CLRVersion 4.0.30319.18052
BuildVersion 6.3.9421.0
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion 2.2
PS C:\Users\test\Downloads\selenium-dotnet-2.35.0\net40>
Run Code Online (Sandbox Code Playgroud)
这是我在尝试加载dll时遇到的错误.
PS C:\Users\test\Downloads\selenium-dotnet-2.35.0\net40> Add-Type -Path .\WebDriver.dll
Add-Type : Could not load file or assembly 'file:///C:\Users\test\Downloads\selenium-dotnet-2.35.0\net40\WebDriver.dll' or one of its dependencies. Operation is
not supported. (Exception from HRESULT: …Run Code Online (Sandbox Code Playgroud) 我在尝试在远程服务器上运行我们的一些脚本时遇到了问题.
我们需要所有Powershell会话来加载CLR的v4,因为我们正在使用我们的脚本加载我们自己的自定义二进制文件.
我们已经这样做了一段时间(我们使用类似于这里的修改过的powershell.exe.config这样做:如何使用.NET 4运行时运行PowerShell?),当你进入'Server1'的RDP时一切都很好并开启Powershell会议.变量$ PSVersionTable告诉我们CLR v4已加载.
既然我们正试图通过远程运行这些命令来简化操作,那么我们遇到了问题:当你在同一台服务器上输入一个远程Powershell会话时,$ PSVersionTable只显示v2 ......
所以问题是,如果你在Server1上打开一个本地Powershell会话,它会加载v4,但如果你从Server2远程到Server1它只加载v2.
有谁知道如何告诉Powershell使用CLR v4进行远程会话?任何帮助将非常感激!
我有sqlcmd.exeSQLServer 2008和SQLServer 2012:
PS C:\> Get-Command sqlcmd.exe
Definition
----------
C:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE
C:\Program Files\Microsoft SQL Server\110\Tools\Binn\SQLCMD.EXE
Run Code Online (Sandbox Code Playgroud)
通过修改$env:PATH我强制使用sqlcmd.exeSQL Server 2012:
PS C:\> $env:PATH = ($env:PATH -split ";" | Where-Object { $_ -notlike "*\Microsoft SQL Server\100\*" }) -join ";"
PS C:\> Get-Command sqlcmd.exe
Definition
----------
C:\Program Files\Microsoft SQL Server\110\Tools\Binn\SQLCMD.EXE
Run Code Online (Sandbox Code Playgroud)
LocalDB的默认实例已启动并正在运行,并由当前用户拥有:
PS C:\> sqllocaldb i v11.0
Name: v11.0
Version: 11.0.2318.0
Shared name:
Owner: DOMAIN\me
Auto-create: Yes
State: Running
Last start time: 12/06/13 18:17:57
Instance pipe name: …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个脚本,该脚本将遍历文件夹中的160万个文件,并根据文件名将它们移动到正确的文件夹中.
原因是NTFS无法处理单个文件夹中的大量文件而不会降低性能.
脚本调用"Get-ChildItem"来获取该文件夹中的所有项目,正如您所料,这会消耗大量内存(大约3.8 GB).
我很好奇是否有其他方法可以遍历目录中的所有文件而不占用太多内存.
这适用于PowerShell 4.0或更高版本.但是在PowerShell版本2.0中,这Add-Type是不可能的(类型不存在).
function unzip {
Add-Type -Assembly “system.io.compression.filesystem”
[io.compression.zipfile]::ExtractToDirectory("SOURCEPATH\ZIPNAME", "DESTINATIONPATH")
}
Run Code Online (Sandbox Code Playgroud) 尝试在我的C#代码中执行powershell脚本.在Windows 7上的VS 2010中使用.NET Framework v.4.0.30319 SP1Rel.
我有以下dll文件作为参考:
C:\ Program Files(x86)\ Reference Assemblies\Microsoft\WindowsPowerShell\v1.0\system.management.automation.dll
我包括:
using System.Collections.ObjectModel;
using System.Management.Automation;
using System.Management.Automation.Runspaces;
Run Code Online (Sandbox Code Playgroud)
然后当我运行以下命令时:
RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create(); // here
Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
Run Code Online (Sandbox Code Playgroud)
它在第一行崩溃,但有以下异常:
{"An error occurred when loading the system Windows PowerShell snap-ins. Please contact Microsoft Support Services."}
Run Code Online (Sandbox Code Playgroud)
内部异常:
{"Unable to access Windows PowerShell PowerShellEngine registry information."}
Run Code Online (Sandbox Code Playgroud)
我能够在cmd中运行"Powershell.exe"(版本2或1),它工作正常,我的项目编译应该.我读了这个问题(http://social.msdn.microsoft.com/Forums/eu/biztalkesb/thread/a807bee7-531a-4990-b8da-47a7e6e3e099),在那里他们谈到了一些注册.钥匙,但他忘了提到他做了什么来解决它.非常感谢任何帮助!
我安装了 mysqlconnector [ODBC] 5.1.8 来运行我的 mysqlcommand,但出现此错误:
Cannot find type [MySql.Data.MySqlClient.MySqlConnection]: make sure the assembly containing this type is loaded
Run Code Online (Sandbox Code Playgroud)
我应该从 mysql 连接器站点安装哪个驱动程序才能在 powershell 上运行此命令(或任何 MySql 命令)?
我的系统中安装了最新版本的 MySql,所有项目都可以很好地使用 MySql。
这是我第一次发帖提问。我是 csharp 和 powershell 的新手。如果我的英语一点都不好,请多多包涵。我一直在尝试将我的 csharp 代码转换为 powershell,但没有成功。我试图研究有关 powershell 的文档并尝试每一个,不幸的是,对我来说没有任何作用。我的 csharp 代码在 Visual Studio 2010 中工作,但我无法在 Powershell 中嵌入和工作。下面的代码简单地捕获任务管理器的 PID 并将其写入带有时间和日期戳的记事本。任何帮助将不胜感激。
我的 csharp 代码是:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace GET_TASK
{
class Program
{
static void Main(string[] args)
{
var processList = Process.GetProcessesByName("taskmgr");
foreach (var process in processList)
{
string myPath = "C:/powershell/GET_TASK"; //change data path as needed
FileStream logfile;
//log program process
logfile = new FileStream(myPath + "/logfile.txt", FileMode.Append, FileAccess.Write);
TextWriter oldLog …Run Code Online (Sandbox Code Playgroud) 我正在为Powershell 1和2开发提供程序和cmdlet.
我应该为扩展程序定位哪个版本的框架?
我假设Microsoft.NET 2可以正常工作.3.0和3.5怎么样?Microsoft.NET 4.0?
几年前,我使用Make-shell创建了带有自定义cmdlet的自定义shell.后来我使用了snap-in技术,我忘记了这个选项.
现在我应该为一大批客户部署一组自定义cmdlet,最好提供一个零配置解决方案; 因此,我记得自定义shell解决方案,我想知道它是否仍然是这种情况下的最佳解决方案.它也会有所帮助,因为我的cmdlet使用WF 4.0,因此shell应该在最新的框架版本下运行.无论如何,我对它的支持有点害怕:它是否仍在使用Powershell 2.0功能?
是否有其他方法可以在客户的计算机上轻松部署cmdlet?
谢谢
是否有一个详尽的列表,列出了4.0 .NET Framework中的所有"基础"(在面向对象的意义上没有使用,但在常识中更常用)泛型类型?我找到了这个列表,我经常发送更新/中级开发人员,以便他们可以理解非泛型类型如何映射到泛型类型,但这绝不是详尽无遗的.我在寻找的东西,还包括诸如KeyValuePair<>,Tuple<>以及其他基本的仿制药,可能不是很-众所周知的.这样的接口IObservable<>会很好但不一定是必需的.