0

所以我有一个基本程序(令人难以置信的错误,但我们非常喜欢它),它使用一个共享文件夹,学校里的几个人都可以访问(为了便于使用,路径已更改)。它被设计用作消息传递应用程序,每个用户写入同一个记事本文件以使用 Get-Content 和 -Wait 参数将消息发送到 Poweshell 脚本。我添加了几个使用“/”的命令,但我想要一个(即/online)用户可以键入并查看当前使用该程序的所有其他人。

我试图设置一个不同的文本文件,每个用户使用自己的用户名每 x 秒更新一次,同时擦除以前的记录:

while (1){
    Clear-Content -Path C:\users\Freddie\Desktop\ConvoOnline.txt
    Start-Sleep -Milliseconds 5000
    Add-Content -Path C:\users\Freddie\Desktop\ConvoOnline.txt $env:UserName
}

所以这可以稍后调用:

elseif($_ -match "/online"){Get-Content -Path C:\users\Freddie\Desktop\ConvoOnline.txt}

但这不起作用,它不会在用户之间同步,因此一个用户将擦除当前用户,只有那个会显示为活动用户,直到其他用户的循环擦除他们的名字。

为了避免 XY 问题,我想要一种相当简单的方法(仍然最多只使用两个文件)来确定哪些用户正在积极使用(因此更新)他们正在运行的 Powershell 脚本。

整个代码:

Add-Type -AssemblyName System.speech
$speak = New-Object System.Speech.Synthesis.SpeechSynthesizer
$speak.Volume = 100
Write-Host "Type /helpp, save it, then hit backspace and save it again     for a guide and list of commands!"
Get-Content -Path C:\users\Freddie\Desktop\Convo.txt -Wait |
 %{$_ -replace "^", "$env:UserName  "} |
 %{if($_ -match "/cls"){cls} `
 elseif($_ -match "/online"){Get-Content -Path C:\users\Freddie\Desktop    \ConvoOnline.txt} `
 elseif(($_ -match "/afk") -and ($env:UserName -eq "Freddie")){Write-Host     "$env:UserName has gone afk"} `
 elseif(($_ -match "/say") -and ($env:UserName -eq "Freddie"))    {$speak.Speak($_.Substring(($_.length)-10))} `
elseif($_ -match "/whisper"){
 $array = @($_ -split "\s+")
 if($array[2] -eq "$env:UserName"){
 Write-Host $array[2]
 } `
 } `
 elseif($_ -match "/help"){
 Write-Host "Help: `
 1. Press Ctrl+S in Notepad to send your message `
 2. Make sure you delete it after it's been sent `
 3. If your message doesn't send properly, just hit backspace and all but     the last letter will be sent `
  `
 COMMANDS: `
  `
 /online - Lists all users currently in the chat `
 /cls - Clears you screen of all current and previous messages `
 /whisper [USERNAME] [MESSAGE] - This allows you to send a message     privately to a user"
 }
 else{Write-Host "$_"}}
#
#
#
#
#Add a command: elseif($_ -match "/[COMMAND]"){[FUNCTION]}
#
#Make it user-specific: elseif($_ -match "/[COMMAND]" -and $envUserName     -eq "[USERNAME]"){[FUNCTION]}
4

1 回答 1

0

您可以使用 add-content 和另一个 ps1 文件添加时间戳以清除 5 秒之前写入的数据(您可以在同一个 ps1 文件中执行此操作,但另一个 ps1 文件更好)

修改用户在线更新部分:

while ($true){

    Add-Content -Path d:\ConvoOnline.txt "$($env:UserName);$(get-date)"
    Start-Sleep -Milliseconds 5000

}

另一个脚本在 5 秒前监视和清除内容,所以在线文件总是更新

 while($true){
    Start-Sleep -Milliseconds 5000
    $data = get-content -Path D:\ConvoOnline.txt 
    clear-content -Path D:\ConvoOnline.txt
    if($data){
    $data | %{if(!([datetime]($_.split(";")[1]) -lt (get-date).addmilliseconds(-4500))){Add-Content -Path d:\ConvoOnline.txt $_}}
    }
    }
于 2017-04-03T04:34:17.007 回答