我正在编写一个脚本,从另一个平台获取输出文件(遗憾的是不会产生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变量中时,在不再需要时从内存中删除变量内容的最有效方法是什么?
我已经使用了两者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开关,可以简单地用另一个加密脚本替换显示此应用已被禁用的消息)
我正在使用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) 我正在编写一个脚本,它接受非结构化输入,重新格式化它并输出 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)