Tag: powershell

如何在powershell中实现using语句?

如何在power shell中使用? 这是C#中的工作示例 using (var conn = new SqlConnection(connString)) { Console.WriteLine(“InUsing”); } 我在Powershell中需要相同(不工作): Using-Object ($conn = New-Object System.Data.SqlClient.SqlConnection($connString)) { Write-Warning -Message ‘In Using’; } 它没有使用: $conn = New-Object System.Data.SqlClient.SqlConnection($connString) 谢谢你的帮助。

要关闭套接字,请不要关闭()套接字。 Uhmm?

我知道TIME_WAIT是TCP / IP的一个组成部分,但是在SO(和其他地方)有很多问题,每秒创建多个套接字,服务器最终耗尽短暂的端口。 我发现当使用TCPClient (或Socket )时,如果我调用Close()或Dispose()方法,套接字的TCP状态将更改为TIME_WAIT,并将在完全关闭之前遵循超时时间。 但是,如果它只是将变量设置为null则套接字将在下一次GC运行时完全关闭,这当然可以强制执行,而不会经历TIME_WAIT状态。 这对我来说没有多大意义,因为这是一个IDisposable对象,不应该GC也调用对象的Dispose()方法? 这是一些PowerShell代码,演示了(在这台机器上没有安装VS)。 我使用来自Sysinternals的TCPView实时检查套接字状态: $sockets = @() 0..100 | % { $sockets += New-Object System.Net.Sockets.TcpClient $sockets[$_].Connect(‘localhost’, 80) } Start-Sleep -Seconds 10 $sockets = $null [GC]::Collect() 使用此方法,套接字永远不会进入TIME_WAIT状态。 如果我在手动调用Close()或Dispose()之前Close()应用程序,则相同 有人可以解释一下这是否是一个好的做法(我想人们会说这不是)。 编辑 GC已经回答了这个问题,但我仍然有兴趣找出为什么这会对套接字状态产生任何影响,因为这应该由操作系统控制,而不是.NET。 还有兴趣了解使用此方法来防止TIME_WAIT状态并最终是否是某个地方的错误(即,所有套接字是否应该通过TIME_WAIT状态?)是否是一个好习惯?

Powershell模块:动态强制分层参数

所以我真正想要的是在PS模块中有些可用的标签完成。 ValidateSet似乎是这里的方式。 不幸的是我的数据是动态的,所以我不能预先用所有有效值注释参数。 DynamicParameters / IDynamicParameters似乎是该问题的解决方案。 把这些东西放在一起(并将我的失败减少到一个简单的测试用例)我们最终得到: using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Management.Automation; using System.Text; using System.Threading.Tasks; namespace PSDummy { [Cmdlet(VerbsCommon.Get, “BookDetails”)] public class GetBookDetails : Cmdlet, IDynamicParameters { IDictionary m_dummyData = new Dictionary { {“Terry Pratchett”, new [] {“Small Gods”, “Mort”, “Eric”}}, {“Douglas Adams”, new [] {“Hitchhiker’s Guide”, “The Meaning […]

自定义PowerShell提示 – 相当于CMD的$ M $ P $ _ $ + $ G?

我已经开始使用PowerShell“玩”了,并试图让它“行为”。 我想做的其中一件事就是将PROMPT自定义为与“$ M $ P $ _ $ + $ G”在MS-Dos上做的“相似”: 快速了解这些做法: 人物 | 描述 $ m如果当前驱动器不是网络驱动器,则与当前驱动器号关联的远程名称或空字符串。 $ p当前驱动器和路径 $ _ ENTER-LINEFEED $ +零个或多个加号(+)字符,具体取决于pushd目录堆栈的深度,每个级别推送一个字符 $ g >(大于号) 所以最终输出是这样的: \\spma1fp1\JARAVJ$ H:\temp ++> 我已经能够在我的提示中添加$M和$_function(以及一个漂亮的历史记录function),如下所示: function prompt { ## Get the history. Since the history may be either empty, ## a single item or an array, the @() […]

通过C#Powershell变量设置

我必须通过C#在PowerShell中设置一个变量,并且必须再次通过Powershell中的C#使用该变量,我的代码到目前为止: var command = string.Format(“$item = Invoke-RestMethod {0} “, “http://services.odata.org/OData/OData.svc/?`$format=json”); var command2 = string.Format(“$item.value[0].name”); InvokeCommand.InvokeScript(command); object namesOne= InvokeCommand.InvokeScript(command2); 在这种情况下,输出应为:产品 但这个C#不起作用,我也累了: Runspace runSpace = RunspaceFactory.CreateRunspace(); runSpace.Open(); Pipeline pipeline = runSpace.CreatePipeline(); Command invoke = new Command(“Invoke-RestMethod”); invoke.Parameters.Add(“Uri”, “http://services.odata.org/OData/OData.svc/?`$format=json”); pipeline.Commands.Add(invoke); runSpace.SessionStateProxy.SetVariable(“item”, pipeline.Invoke()); var a = runSpace.SessionStateProxy.PSVariable.GetValue(“item”); Command variable = new Command(“Write-Host $item”); pipeline.Commands.Add(variable); var output = pipeline.Invoke(); 但它既不起作用。 […]

凭证存储最佳实践

我正在编写Windows服务,需要进行经过身份validation的Web请求。 该服务不会在用于发出请求的凭据的所有权下运行; 这意味着我需要以某种方式存储请求的凭据。 这里的最佳做法是什么? 凭证需要存储在App.config(或模拟)中; 我宁愿没有用明文挂掉密码。 由于密码经常更改,因此无法在密码中构建或以其他方式烘焙二进制文件。 同样的问题适用于Powershell。 我需要进行经过身份validation的请求,但我不希望脚本以纯文本格式包含用于请求的凭据。

如何启用Windows 10“容器”function?

使用最新的Windows 10 Fast Ring build 14316(在VMware虚拟机内),我正在努力使桌面应用转换器function正常工作。 按照建议运行PowerShell脚本时: PS C:\> .\DesktopAppConverter.ps1 -Setup -BaseImage .\BaseImage-14316.wim 我收到一个错误: Assert-RequiredFeatureEnabled:致命错误1000:未安装或启用所需function。 请参阅机器设置说明。 在C:\ MyPath \ DesktopAppConverter \ converter_util \ EnvironmentAssertions.ps1:40 Zeichen:9 在查看上述源代码时,似乎此行失败: $feature = Get-WindowsOptionalFeature -Online -FeatureName “Containers” 我已经尝试启用各种Windowsfunction但没有成功。 我的问题: 什么是“容器”function以及如何启用它?

如何从C#以编程方式调用CmdLet时捕获Powershell CmdLet的详细输出

背景 我在Windows 7上使用Powershell 2.0。 我在Powershell模块中编写了一个cmdlet(“模块”是Powershell 2.0的新增function)。 为了测试cmdlet,我在Visual Studio 2008中编写unit testing,以编程方式调用cmdlet。 参考 MSDN上的这篇文章名为“如何从Cmdlet中调用Cmdlet”,展示了如何从C#调用cmdlet。 来源代码 这是我的实际代码的简化版本 – 我已尽可能小,以便您可以清楚地看到我遇到的问题: using System; using System.Management.Automation; namespace DemoCmdLet1 { class Program { static void Main(string[] args) { var cmd = new GetColorsCommand(); foreach ( var i in cmd.Invoke()) { Console.WriteLine(“- ” + i ); } } } [Cmdlet(“Get”, “Colors”)] public class […]

.NET枚举类型实际上是可变的值类型吗?

通过反思,在枚举类型的字段中查看,我惊讶地发现,保留枚举的特定实例的实际值的“支持”实例字段不是private ,正如我所想的那样,但是public 。 它也不是readonly 。 ( IsPublic true, IsInitOnly false。) 许多人认为.NET类型系统中的“可变”值类型是“邪恶的”,那么为什么枚举类型 (例如从C#代码创建) 就是这样? 现在,事实certificate,C#编译器有某种神奇的东西否认公共实例字段的存在(但见下文),但在例如PowerShell中你可以这样做: prompt> $d = [DayOfWeek]::Thursday prompt> $d Thursday prompt> $d.value__ = 6 prompt> $d Saturday 字段值value__可以写入。 现在,要在C#中执行此操作,我必须使用dynamic因为看起来使用正常的编译时成员绑定,C#假装public实例字段不存在。 当然要使用dynamic ,我们将不得不使用枚举值的装箱 。 这是一个C#代码示例: // create a single box for all of this example Enum box = DayOfWeek.Thursday; // add box to a hash set […]

如何在PowerShell cmdlet中获取当前目录?

我正在使用Visual Studio 2010中的C#/ .Net 4.0开发PowerShell 3.0 cmdlet 。我想在PowerShell中获取用户执行cmdlet的当前目录。 但Directory.GetCurrentDirectory()无法按预期工作。 在下面的代码中,结果是C:\ Users \ Administrator。 问题:使用哪些cmdlet代码获取PowerShell的当前目录? [System.Management.Automation.Cmdlet(System.Management.Automation.VerbsCommon.Get, “StatusBar”)] public class GetStatusBarCommand : System.Management.Automation.PSCmdlet { /// /// Provides a record-by-record processing functionality for the cmdlet. /// protected override void ProcessRecord() { this.WriteObject(Directory.GetCurrentDirectory()); return; } }