2017-04-02 3 views
0

J'ai donc un programme de base (incroyablement buggé mais nous l'aimons bien) qui utilise un dossier partagé auquel deux personnes à l'école ont accès (les chemins ont été changés pour la facilité d'utilisation). Il est conçu pour fonctionner comme une application de messagerie, chaque utilisateur écrivant dans le même fichier Notepad pour envoyer un message à un script Poweshell en utilisant les paramètres Get-Content et -Wait. J'ai ajouté quelques commandes en utilisant "/", mais je veux un (c'est-à-dire/en ligne) qu'un utilisateur peut taper et voir toutes les autres personnes utilisant actuellement le programme.Comment vérifier les utilisateurs utilisant actuellement un programme PowerShell?

J'ai essayé de mettre en place un fichier texte différent qui est mis à jour toutes les x secondes par chaque utilisateur avec leur propre nom d'utilisateur, tout en essuyant le précédent record:

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 
} 

donc cela peut être appelé plus tard :

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

Mais cela ne fonctionne pas, il ne se synchronise pas entre les utilisateurs, donc un utilisateur essuiera les utilisateurs actuels et seulement apear actif, jusqu'à ce que les autres utilisateurs du cycle des lingettes leur nom. Pour éviter le problème XY, je veux un moyen assez simple (toujours en n'utilisant que deux fichiers maximum) pour déterminer quels utilisateurs utilisent activement (et donc mettent à jour) le script Powershell qu'ils exécutent.

Code entier:

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]} 
+1

Veuillez fournir un [MCVE (exemple minimal, complet et vérifiable)] (http://stackoverflow.com/help/mcve). – mklement0

Répondre

0

Vous pouvez ajouter horodatage avec ajout de contenu et un autre fichier PS1 pour les données de compensation écrites avant 5 secondes (vous pouvez le faire dans le même fichier ps1, mais un autre fichier PS1 est mieux)

utilisateur modifié une partie en ligne updation:

while ($true){ 

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

} 

Un autre script qui veille et efface le contenu avant 5 secondes, le fichier en ligne est toujours mis à jour

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 $_}} 
    } 
    }