在文本文件中查找随机文本,然后在显示后删除它 - PowerShell

时间:2017-08-11 11:45:53

标签: powershell automation powershell-v4.0

我正在尝试创建一个自动脚本,其中powershell脚本从文本文件中选择一个名称,然后删除它选择的名称,以便在发送给用户时不会重复。我承认我在PowerShell上没有很多经验,目前只有一行代码,但它将成为其余代码所围绕的,我似乎无法在堆栈或谷歌的任何地方找到它以获得具体的答案。以下是我到目前为止的情况:

Get-Random -InputObject (Get-Content "F:\PowerShell\Name Library.txt")

有没有办法让它暂时保存名称几秒钟然后从列表中删除名称然后删除保存的名称,以便第二天它可以从列表中选择新的东西?

2 个答案:

答案 0 :(得分:1)

我建议采用以下方法:

  1. 将文件读入内存
  2. 选择随机行
  3. 发送电子邮件
  4. 使用剩余行列表覆盖文件
  5. 看起来像:

    # Read in the list:
    $ListOfNames = Get-Content "F:\PowerShell\Name Library.txt"
    
    # Split into two lists, one with a random line, one with the rest
    $Random,$Rest = $ListOfNames.Where({$_.ReadCount -eq ($ListOfNames.ReadCount |Get-Random)},'Split')
    
    # Send mail to $Random here
    # ...
    
    # Write remaining names back to file
    $Rest |Set-Content "F:\PowerShell\Name Library.txt" -Force
    

答案 1 :(得分:0)

只是为了补充上述内容,我从不喜欢永久删除任何东西。因此,如果我正在处理您正在做的事情,我会创建一个对象并将其存储在一个文件中

#You will only have to do this top section once, after that you will import the xml file created below to import the object
#region Initial Import
$ListOfNames = Get-Content C:\TEMP\test.txt

$nameTracking = @()
foreach($name in $ListOfNames)
{
    $trackingObj = New-Object -TypeName psobject
    $trackingObj | Add-Member -MemberType NoteProperty -Name Name -Value $name
    $trackingObj | Add-Member -MemberType NoteProperty -Name EmailSent -Value $false
    $trackingObj | Add-Member -MemberType NoteProperty -Name DateSent -Value $null
    $nameTracking += $trackingObj
}
#endregion

#After the xml file is created the first time you will execute the following to import the names: 
#$nameTracking = Import-Clixml -Path C:\temp\trackingSet.xml

$Random = $nameTracking | where {$_.EmailSent -eq $false} | Get-Random

# Send mail to $Random here, remember to access the name you'll have to use the property of $Random.Name
Send-MailMessage <your parameters here>

#Now set to the EmailSent/DateSent on the object
($nameTracking | where {$_.name -eq $Random.Name}).EmailSent = $true
($nameTracking | where {$_.name -eq $Random.Name}).DateSent = Get-Date

$nameTracking | Export-Clixml -Path C:\temp\trackingSet.xml

这也是一件好事,你总是可以在屏幕上打印出一个很好的对象内容表。只需在导入XML后输入$ nameTracking即可获得包含每个用户详细信息的表格,如果他们已收到电子邮件及其发送日期。

您可以通过添加更多成员来进一步改进此对象,以包含您可能希望的信息,甚至可以存储包含人名的电子邮件地址,以便更轻松地发送电子邮件。