小编Gra*_*old的帖子

如何提高Write-Progress的性能?

我正在编写一个脚本,从另一个平台获取输出文件(遗憾的是不会产生CSV输出,而是每条记录大约7行),抓住具有我感兴趣的值(使用select-string)的行然后扫描MatchInfo数组,提取确切文本并构建数组,完成时导出为CSV.

我的问题是原始文件有大约94000行文本,而matchinfo对象仍然有大约23500条记录,所以它需要一段时间,特别是构建数组,所以我想我会投入Write-Progress但是开销很大这样做是非常可怕的,它增加了经过的时间x8与没有进度条.

这是原始文件中的示例条目:

CREATE   TRANCODE   MPF               OF TXOLID
AGENDA                   = T4XCLCSHINAG
,ANY_SC_LIST              = NONE    ,EVERY_SC_LIST            = NONE
,SECURITY_CATEGORY        = NONE    ,FUNCTION                 = 14
,TRANCODE_VALUE           = "MPF"
,TRANCODE_FUNCTION_MNEMONIC = NONE
,INSTALLATION_DATA        = NONE
;
Run Code Online (Sandbox Code Playgroud)

现在,对于其中的每一个,我只关心AGENDA和的值TRANCODE_VALUE,所以在使用中读取文件后Get-Content,我使用Select-String我知道的最有效的方法来过滤掉文件中的其余行:

rv Start,Filtered,count,CSV
Write-Host "Reading Mainframe Extract File"
$Start = gc K:\TRANCODES.txt
Write-Host ("Read Complete : " + $Start.Count + " records found")

Write-Host "Filtering records for AGENDA/TRANCODE information"
$Filtered = $Start|Select-String -Pattern …
Run Code Online (Sandbox Code Playgroud)

powershell progress-bar

8
推荐指数
2
解决办法
2847
查看次数

Powershell - "Clear-Item变量:"vs"Remove-Variable"

在运行时临时将文本存储在powershell变量中时,在不再需要时从内存中删除变量内容的最有效方法是什么?

我已经使用了两者Clear-Item variable:,Remove-Variable但是后者用内容将内存内容与前者置零,从内存中删除的内容有多快?

编辑:我应该让我更清楚为什么要问.

我正在为一堆应用程序虚拟机自动执行RDP登录(应用程序不作为服务运行,外包开发人员,长篇故事).

因此,我正在开发(主要完成)一个脚本,以便将启动会话分组到每个VM.

想法是存储凭据的脚本函数read-host用于提示主机名然后get-credentials获取域/用户/密码.

然后使用256位密钥从安全字符串转换传递(对于存储信用卡并运行组启动的机器/用户唯一的运行时密钥).

VM名称,域,用户和加密的传递存储在文件中.启动会话时,将读入详细信息,密码解密,传递给该VM的cmdkey.exe存储\generic:TERMSRV凭据的详细信息,清除明文传递变量,向该主机启动mstsc,几秒钟后从Windows凭证存储中删除凭据.(如果我将密码作为明文以外的其他任何内容传递给cmdkey.exe,则RDP会话将收到错误或无凭据).

因此,问题是,我需要密码以明文存储在内存中尽可能短的时间.

为了让安全人员满意,脚本本身是aes256加密和ac#包装器,它有自己的ps主机读取,解密和运行脚本,因此运行它的机器上没有明文源.(文件共享上的加密源如此有效,我有一个kill开关,可以简单地用另一个加密脚本替换显示此应用已被禁用的消息)

powershell resource-cleanup

6
推荐指数
3
解决办法
5万
查看次数

当数组为空时,是否可以让度量对象为 Sum 返回 0 而不是 null/nothing?

我正在使用measure-object为单个属性生成数组中项目数的计数,以及该属性的值的总和。

该数组来自导入的 CSV,通过该 CSV 传递where-object以进行过滤,因此有时该数组可能为空。

在我构建具有用于创建输出 CSV 的属性的对象数组的代码中,我访问了几个不同输入数组的cmdlet 输出的.count.sum属性measure-object

如果测量的数组为空,则计数仍将具有我可以使用的 0 值(我猜是因为即使是空数组也有计数(0),但 sum 属性不存在/没有值。因此,Add-Member添加属性的cmdlet 失败,并显示“试图除以零”。

失败的行计算出一个百分比以放入属性值(使用来自两个数组的总和),但除数从不为零,只是股息有时可能为零,所以我不明白为什么我得到除数零误差。

任何人都能够解释measure-object如果测量的数组中没有项目,如何强制返回零之和,或者避免除以零错误?

示例代码如下:

$report = @()
$obj = New-Object System.Object
$obj | Add-Member -MemberType NoteProperty -Name Date -Value $Table[0].ENDDATE
$obj | Add-Member -MemberType NoteProperty -Name Environment -Value "PRODUCTION"
$obj | Add-Member -MemberType NoteProperty -Name Total_CPU_Seconds -Value ($ProdAllStats | Measure-Object -Property CPUTIME -Sum).Sum
$obj | Add-Member -MemberType NoteProperty -Name CompanyA_CPU_Seconds -Value ($CompAProdStats …
Run Code Online (Sandbox Code Playgroud)

arrays powershell measure

2
推荐指数
1
解决办法
1634
查看次数

Powershell添加成员计算值

我正在编写一个脚本,它接受非结构化输入,重新格式化它并输出 CSV。

在其中一个成员中,我想对另一个成员执行 NSLOOKUP 以获取与 IP 关联的 DNS 条目。然而,许多条目的 IP 为 0.0.0.0,例如,它是一个侦听端口,还没有客户端连接。

这些从 NSLOOKUP 中抛出错误,这是完全正确的,因为没有它的 DNS 条目。

因此,我修改了代码,仅在 IP 不是 0.0.0.0 时才执行 NSLOOKUP,否则返回空字符串。

但我无法让它发挥作用。

以下内容不会引发任何错误:

$srcdata -split "`r`n"|foreach {
                    $obj = New-Object System.Object
                    $obj|Add-Member -MemberType NoteProperty -Name Connection_ID  -Value $_.Split(",")[0]
                    $obj|Add-Member -MemberType NoteProperty -Name Filename       -Value $_.Split(",")[1]
                    $obj|Add-Member -MemberType NoteProperty -Name MCP_Port       -Value $_.Split(",")[2]
                    $obj|Add-Member -MemberType NoteProperty -Name Client_Port    -Value $_.Split(",")[3]
                    $obj|Add-Member -MemberType NoteProperty -Name Port_State     -Value $_.Split(",")[4]
                    $obj|Add-Member -MemberType NoteProperty -Name Client_IP      -Value $_.Split(",")[5]
                    $obj|Add-Member -MemberType NoteProperty -Name Client_DNS …
Run Code Online (Sandbox Code Playgroud)

arrays powershell

2
推荐指数
1
解决办法
3712
查看次数