Скрипт Powershell/Sharepoint для предотвращения флуда
Экстремальный PowerShell новичок здесь. Я ценю любую помощь. Я пытаюсь собрать простой сценарий защиты от переполнения для работы с Sharepoint/Powershell. Нужно, чтобы он посмотрел на дату-время в поле и сравнил его с текущим временем-датой, а затем остановил бы выполнение, если в течение 5 секунд после последней отправки. Метод, который я использую сейчас, всегда кажется верным.
#get system datetime (output format - 06/12/2014 07:57:25)
$a = (Get-Date)
# Get current List Item
$ListItem = $List.GetItemById($ItemID)
$DateToCompare = $ListItem["baseline"].AddMilliseconds(5000)
if ($DateToCompare -gt $a)
{Break}
#set variable to field
$ListItem["baseline"] = $a
#write new item
$ListItem.Update()
Break
2 ответа
У меня нет доступа к Sharepoint, поэтому я не могу полностью протестировать.
Можете ли вы проверить тип данных атрибута "baseline"?
($ListItem["baseline"]).getType().Name
Вы уверены, что 5000 миллисекунд действительно добавляются?
Write-Output "NOW: $($curDate) BASELINE: $($DateToCompare) DIFF: $( ($curDate - $DateToCompare).TotalMilliseconds )"
Зачем использовать перерыв, а не позволить естественному завершению оценки? Ниже представлен альтернативный способ реструктуризации вашего кода.
#The difference in Milliseconds acceptable
$threshold = 5000
#Get current date, the formatting depends on what you have defined for output.
$curDate = Get-Date
#Get current list item from SP
$listItem = $List.GetItemById($ItemID)
# Get current List Item's baseline
$DateToCompare = $listItem["baseline"]
Write-Output "NOW: $($curDate) BASELINE: $($DateToCompare) DIFF: $( ($curDate - $DateToCompare).TotalMilliseconds )"
if ( ($curDate - $DateToCompare).TotalMilliseconds -le $threshold ){
#set variable to field
$ListItem["baseline"] = $curDate
#write new item
$ListItem.Update()
} else {
#Outside of threshold
}
Так что получается, что сценарий, который я дал выше, был функциональным. Проблема заключалась в том, что время, которое я выполнял в функции (Get-Date), касалось времени сервера (центральное), а не местного времени (восточное).
#bring server time up to eastern time
$a = (Get-Date).AddMilliseconds(7200000)
# Get current List Item
$ListItem = $List.GetItemById($ItemID)
#take baseline time and add 5 seconds
$DateToCompare = $ListItem["baseline"].AddMilliseconds(5000)
#stop if script has run in the last 5 sec (loop prevention)
if ($DateToCompare -gt $a)
{Break}
#stop if the status hasnt changed
if ($ListItem["baselinestatus"] -eq $ListItem["Status"])
{Break}
#get current activity status
$currentstatus = $ListItem["Status"]
#get current contents of log
$log = $ListItem["Log"]
#append new entry to existing and write it to the log
$newentry = $log + "<br>" + $a + " - " + $currentstatus
#set variable to field
$ListItem["Log"] = $newentry
$ListItem["baseline"] = $a
$ListItem["baselinestatus"] = $currentstatus
#write new item
$ListItem.Update()