天道酬勤,学无止境

powershell

从 WiX 安装程序运行 PowerShell 脚本(Run PowerShell script from WiX installer)

问题 我找到了几个示例,展示了如何从 WiX 运行 PowerShell 脚本,但都没有成功运行其中任何一个。 所以,我想发布我所拥有的,希望有人能指出我做错了什么。 <!--Install the PowerShell script--> <DirectoryRef Id="INSTALLFOLDER"> <Component Id="cmp_ShutdownIExplore" Guid="{4AFAACBC-97BB-416f-9946-68E2A795EA20}" KeyPath="yes"> <File Id="ShutdownIExplore" Name="ShutdownIExplore.ps1" Source="$(var.ProjectDir)Source\PowerShell\ShutdownIExplore.ps1" Vital="yes" /> </Component> </DirectoryRef> <!--Define the CustomAction for running the PowerShell script--> <CustomAction Id="RunPowerShellScript" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="check"

2021-12-09 08:15:52    分类:技术分享    powershell   wix   windows-installer

ImportPSModule 故障检测(ImportPSModule Failure Detection)

问题 我正在尝试使用InitialSessionState.ImportPSModule来导入 Powershell 模块。 我很想知道模块的导入是否由于任何原因(例如找不到文件等)而失败。 将此类代码放在 try 块中不会在失败的情况下引发异常,并且该函数似乎会静默失败并在无法导入模块时继续。 如果导入失败,有没有办法在代码中收到警报? 我正在尝试执行以下操作。 在下面的代码中,模块“TestModule1234”不存在。 catch 块不捕获异常。 注意:这只是原型测试代码,因此请忽略任何与生产代码相关的违规行为。 try { //Initializing the PowerShell runspace InitialSessionState psSessionInitialState = InitialSessionState.CreateDefault(); LogFile.Log("Importing Module TestModule1234"); psSessionInitialState.ImportPSModule(new[] { "TestModule1234" }); LogFile.Log("Creating Powershell Runspace"); m_PoshRunspace = RunspaceFactory.CreateRunspace

2021-12-09 07:57:11    分类:技术分享    c#   .net   powershell   pssnapin   runspace

Powershell - “清除项目变量:”与“删除变量”(Powershell - "Clear-Item variable:" vs "Remove-Variable")

问题 在运行时将文本临时存储在 powershell 变量中时,从内存中删除不再需要的变量内容的最有效方法是什么? 我已经使用了Clear-Item variable:和Remove-Variable但是使用后者从内存中删除某些东西与使用前者将内存内容Clear-Item variable:速度有多快? 编辑:我应该更清楚地说明我为什么要问。 我正在为一堆应用程序虚拟机自动化 RDP 登录(应用程序不作为服务运行,外包开发人员,长话短说)。 因此,我正在开发(基本完成)一个脚本来对每个 VM 的启动会话进行分组。 想法是存储凭据的脚本函数使用read-host提示输入主机名,然后get-credentials来get-credentials域/用户/密码。 然后使用 256 位密钥(存储凭证并运行组启动的机器/用户唯一的运行时密钥)从安全字符串转换通行证。 VM 名称、域、用户和加密通行证存储在一个文件中。 启动会话时,读取详细信息,解密密码,将详细信息传递给cmdkey.exe以存储该 VM 的\generic:TERMSRV凭据,清除明文传递变量,将 mstsc 启动到该主机,几秒钟后从Windows 凭据存储。 (如果我将密码作为明文以外的任何内容传递给 cmdkey.exe,则 RDP 会话将收到不正确的凭据或没有凭据)。 因此,因此问题是

2021-12-09 06:55:17    分类:技术分享    powershell   resource-cleanup

get-childItem 的新 -file 参数是像 -filter 一样快还是像 -include 一样慢?(is get-childItem's new -file parameter fast like -filter or slow like -include?)

问题 编辑希望在这里澄清我令人费解和误导性的问题......基于我错误的假设 -file 接受输入。 感谢您让我直截了当地指出它只是一个开关参数; 我的例子中的输入实际上被传递到-path。 听起来这可能是搜索多种文件类型的最快的纯 powershell 方式,因为 -filter 只接受单个输入,而 -include 速度较慢。 get-childItem 文档说“筛选器比其他参数更有效,因为提供程序在检索对象时应用它们,而不是让 Windows PowerShell 在检索对象后对其进行筛选。” v3 有一个带有 -file 参数的新参数集,可能用于排除目录,以匹配 cmd.exe 的dir /a:-d 与 -include 和 -filter 不同,-file 接受多个,如gci -file "*.ldf","*.bak" 所以我想知道,并且迄今为止未能可靠地测试,从性能角度来看 -file 是否类似于 -filter,即“更有效”,或者更像 -include 等“其他参数”。 如果 -file 是一个过滤器,那很好,因为 afaict -filter 一次只处理一个过滤器,所以如果你想要多个过滤器(比如 *.ldf 和 *.bak),那么你需要运行gci -filter两次或使用 -包括代替。 所以我想知道 -file 是否让我们从多个过滤器中获得过滤器的效率优势。

2021-12-09 06:49:33    分类:技术分享    powershell   filter   powershell-3.0   get-childitem

使用 Powershell 在非常大的日志文件的最后 x 行中搜索特定字符串(Using Powershell to search for specific strings in the last x lines of very large log files)

问题 我有一个要求,到目前为止我还没有在论坛上找到解决方案或帮助... 问题:我监控实时系统,这些文件每天都会生成许多非常大的日志文件,1GB 并不少见,我所做的是查看(尾部)日志以了解已知错误情况或我想监视的其他字符串,我可能需要对其采取措施。 由于这种工作既费时又乏味,并且容易因人为错误而错过日志中的问题,因此我一直在自动化此日志文件监控。 我使用名为 Servers Alive 的产品执行计划检查,并编写脚本来监视日志文件中出现的日志条目,我有兴趣查找这些条目可能表明服务存在问题,如果需要,我可以调用其他脚本来重新启动服务来解决遇到的问题。 我以前使用 Perl 为这些日志监控任务编写了脚本,这些脚本非常快,但不一定是最干净的方法,我是管理员而不是程序员,所以我没有开发人员的方法或经验依靠。 下面的 Perl 代码片段显示,我“打开”了一个日志文件$logfile ,然后从文件末尾向后“寻找”给定数量的数据,然后我从这一点搜索数据到最后我有兴趣监控的日志条目的文件,在这个例子中,日志条目是“ No packet received from EISEC Client ” 在此示例中,我们正在监视的日志条目表明 EISEC 服务存在问题,并且该服务的简单重启通常可以解决该问题,所有这些都是我使用 Servers Alive 作为计划检查和警报机制自动执行的。 Perl 脚本函数

2021-12-09 06:31:45    分类:技术分享    perl   powershell

CreateProcessAsUser - 错误 5(CreateProcessAsUser - Error 5)

问题 我正在尝试使用 CreateProcessAsUser 方法。 但我收到错误代码 - 5 这就是我所做的。 加载用户配置文件重复令牌模拟用户 CreateProcessAsUser - 使用duplicateToken 有人可以帮我吗 问候 代码 # Start-of C# section $createPocess = @' using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using Microsoft.Win32; using System.IO; using System.Security.Principal; namespace CreateProcessUtility { class Win32 { #region "CONTS" const UInt32 INFINITE = 0xFFFFFFFF; const UInt32 WAIT_FAILED = 0xFFFFFFFF; #endregion #region "ENUMS" [Flags] public enum LogonType { LOGON32_LOGON_INTERACTIVE = 2, LOGON32_LOGON_NETWORK = 3

2021-12-09 04:50:28    分类:技术分享    c#   powershell

使用 PowerShell 将输出通过管道传输到剪贴板(Pipe output to the clipboard using PowerShell)

问题 编辑:2020 年 10 月 23 日 请参阅 postanote 的回答。 编辑:2015 年 5 月 14 日 3 年后,我想我会分享我的ClipboardModule (我希望我被允许): Add-Type -AssemblyName System.Windows.Forms Function Get-Clipboard { param([switch]$SplitLines) $text = [Windows.Forms.Clipboard]::GetText(); if ($SplitLines) { $xs = $text -split [Environment]::NewLine if ($xs.Length -gt 1 -and -not($xs[-1])) { $xs[0..($xs.Length - 2)] } else { $xs } } else { $text } } function Set-Clipboard { $in = @($input) $out = if ($in.Length -eq 1 -and $in[0] -is [string]) { $in[0] } else { $in | Out-String } if ($out) { [Windows.Forms.Clipboard]::SetText($out); } else {

2021-12-09 04:26:09    分类:技术分享    powershell   clipboard

将正则表达式选项传递给 PowerShell [regex] 类型(Pass regex options to PowerShell [regex] type)

问题 我使用下面的正则表达式代码捕获匹配的两个组: [regex]$regex = "^([0-9]{1,20})(b|kb|mb|gb|tb)$" $matches = $regex.match($minSize) $size=[int64]$matches.Groups[1].Value $unit=$matches.Groups[2].Value 我的问题是我想让它不区分大小写,而且我不想使用正则表达式修饰符。 我知道您可以在 .NET 中传递正则表达式选项,但我不知道如何使用 PowerShell 执行相同的操作。 回答1 静态 [Regex]::Match() 方法的重载允许以编程方式提供所需的[RegexOptions] : # You can combine several options by doing a bitwise or: $options = [Text.RegularExpressions.RegexOptions]::IgnoreCase -bor [Text.RegularExpressions.RegexOptions]::CultureInvariant # or by letting casting do the magic: $options = [Text.RegularExpressions.RegexOptions]

2021-12-09 04:00:08    分类:技术分享    regex   powershell   case-insensitive

按值“名称”合并 2 个 CSV 并合并计数(Powershell)(Merge 2 CSV by Value "Name" and merge Count (Powershell))

问题 因此,目前我正在寻找一种合并 2 个 CSV 文件的方法。 这是我的意思的一个例子: CSV1 "Name","Count" "Klaus","3" "Hans","2" "Gerhard","1" "Nina","6" "Julia","10" "Caro","19" CSV2 "Name","Count" "Klaus","2" "Hans","1" "Gerhard","1" "Nina","1" 现在,如果我合并两者,输出/结果应该是: "Name","Count" "Klaus","5" "Hans","3" "Gerhard","2" "Nina","7" "Julia","10" "Caro","19" 我尝试了很多,但从来没有成功过; 我总是得到错误的结果。 有谁知道如何做到这一点? 回答1 您可以使用Group-Object (别名group )按Name属性对所有内容进行分组。 然后你只需要总结组中每个人的Count属性即可。 Measure-Object (别名measure )将为您计算总和。 $grouped = Import-Csv .\csv1.csv, .\csv2.csv | group Name $combined = $grouped |%{ New-Object PsObject -Prop @{ Name = $_.Name

2021-12-09 02:52:27    分类:技术分享    powershell   csv   merge   count

为什么 PowerShell(使用 Perl)在简单的打印语句中删除双引号?(Why is PowerShell (with Perl) removing double quotes in a simple print statement?)

问题 我是 Linux 的长期用户,但对 Windows 和 PowerShell 不熟悉。 我第一次安装了 Windows7 和 Strawberry Perl 5。 我现在想用 Windows PowerShell 做一个简单的命令行打印。 看起来 Perl 安装正确: PS C:\Users\Me> perl -v This is perl, v5.10.0 built for MSWin32-x86-multi-thread Copyright 1987-2007, Larry Wall ... 命令行的东西有效: PS C:\Users\Me> perl -e 'die' Died at -e line 1. PS C:\Users\Me> echo 'print "Hello, World\n"' | perl Hello, World 但是当我自己尝试这一切时,它会打印一个文件处理程序警告: PS C:\Users\Me> perl -e 'print "Hello, World\n"' No comma allowed after filehandle at -e line 1. 所以看起来它删除了双引号。 PS C:\Users\Me> perl -e 'print \"Hello, World\n\"' Hello, World 这有效,但它丑陋!

2021-12-09 02:48:00    分类:技术分享    perl   powershell