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

在文本文件中查找随机文本,然后在显示后将其删除-PowerShell,powershell,automation,powershell-4.0,Powershell,Automation,Powershell 4.0,我正在尝试制作一个自动化脚本,其中powershell脚本从文本文件中选择一个名称,然后删除它选择的名称,以便在发送给用户时不会重复。我承认我对PowerShell没有太多的经验,目前只有一行代码,但它将是其余代码的核心,我似乎无法在stack或google上找到它来获得具体的答案。以下是我到目前为止的情况: Get-Random -InputObject (Get-Content "F:\PowerShell\Name Library.txt") 有没有办法让它暂时保存名称几秒钟,然后从列表

我正在尝试制作一个自动化脚本,其中powershell脚本从文本文件中选择一个名称,然后删除它选择的名称,以便在发送给用户时不会重复。我承认我对PowerShell没有太多的经验,目前只有一行代码,但它将是其余代码的核心,我似乎无法在stack或google上找到它来获得具体的答案。以下是我到目前为止的情况:

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

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

我建议采用以下方法:

  • 将文件读入内存
  • 随机选线
  • 发送电子邮件
  • 用剩余行列表覆盖文件
  • 可能看起来像:

    # 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
    

    更重要的是,我从不喜欢永久性地移除任何东西。所以如果我在做你正在做的事情,我会创建一个对象并将其存储在一个文件中

    #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文件以导入对象
    #区域初始导入
    $ListOfNames=获取内容C:\TEMP\test.txt
    $nameTracking=@()
    foreach($ListOfNames中的名称)
    {
    $trackingObj=新对象-类型名称psobject
    $trackingObj |添加成员-成员类型NoteProperty-名称-值$Name
    $trackingObj |添加成员-成员类型NoteProperty-名称EmailSent-值$false
    $trackingObj |添加成员-成员类型NoteProperty-名称DateSent-值$null
    $nameTracking+=$trackingObj
    }
    #端区
    #第一次创建xml文件后,将执行以下操作以导入名称:
    #$nameTracking=Import Clixml-路径C:\temp\trackingSet.xml
    $Random=$nameTracking |其中{$\.EmailSent-eq$false}随机获取
    #在此处将邮件发送到$Random,记住要访问名称,您必须使用$Random.name属性
    发送邮件
    #现在设置为对象上的EmailSent/DateSent
    ($nameTracking |其中{$\.name-eq$Random.name})。EmailSent=$true
    ($nameTracking |其中{$\.name-eq$Random.name}).DateSent=Get Date
    $nameTracking | Export Clixml-路径C:\temp\trackingSet.xml
    
    这也有一个好处,就是你们可以在屏幕上打印出一个漂亮的对象目录。导入XML后只需键入$nameTracking,您将得到一个包含每个用户详细信息的表,如果他们收到了电子邮件以及发送日期


    您可以通过添加更多成员来包含您可能需要的信息,从而进一步改进此对象。您甚至可以将带有姓名的电子邮件地址存储在其中,以便于发送电子邮件。

    “几秒钟”-为什么?为什么不一下子删除一条随机的线呢?那可能行得通。我只是想可能需要几秒钟的时间来获取名称并通过电子邮件发送给用户?谢谢您的帮助:)