Найдите следующий рабочий день из цикла JSON while в PowerShell

#json #powershell

#json #powershell

Вопрос:

Я нашел симпатичный маленький JSON API от Kayaposoft, который выдаст значение true / false, если данный день является рабочим днем или нет (например, воскресенье, 14 апреля; isWorkDay: false ). Этот API также может отмечать наши местные праздники, такие как Ваппу в Финляндии и т. Д.

Итак, когда я пытаюсь написать сценарий этого в PowerShell (будучи новичком, которым я являюсь), я быстро понял проблему с приведенным ниже кодом. Хотя код работает, он не очень практичен и зависит от каждой переменной дважды (один раз для ее настройки и один раз в цикле).

Есть ли какой-нибудь способ украсить этот код? Можно ли сделать это более практичным и / или не использовать каждую переменную дважды?

 $date = (Get-Date).AddDays(11)
$jsonDate = $date.ToString('dd-MM-yyyy')

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$jsonRequest = Invoke-WebRequest "https://kayaposoft.com/enrico/json/v2.0/?action=isWorkDayamp;date=$jsonDateamp;country=fin" | ConvertFrom-Json

while ($jsonRequest.isWorkDay -ne $true) {

    $date = $date.AddDays(1)
    $jsonDate = $date.ToString('dd-MM-yyyy')

    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    $jsonRequest = Invoke-WebRequest "https://kayaposoft.com/enrico/json/v2.0/?action=isWorkDayamp;date=$jsonDateamp;country=fin" | ConvertFrom-Json

    Write-Host $jsonDate
    Write-Host $jsonRequest

}

Results:
22-04-2019
@{isWorkDay=False}
23-04-2019
@{isWorkDay=True}
  

Комментарии:

1. Оберните его в функцию Get-WorkingDay и верните только конечную дату.

Ответ №1:

Что-то вроде этого:

 $date = (Get-Date)
# not sure if you really need this ?!?
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

# do { ... } while (...) - execute at least once
do {

    $jsonDate = $date.ToString('dd-MM-yyyy')    
    $jsonRequest = Invoke-WebRequest "https://kayaposoft.com/enrico/json/v2.0/?action=isWorkDayamp;date=$jsonDateamp;country=fin" | ConvertFrom-Json
    $date = $date.AddDays(1)

    Write-Host $jsonRequest
    Write-Host $jsonDate
}
while ($jsonRequest.isWorkDay -ne $true)
  

Комментарии:

1. Я никогда не знал, что в PowerShell существуют циклы do-while. У меня сложилось впечатление, что вам нужны только циклы while, но, наверное, я, должно быть, неправильно прочитал! Спасибо! И да, $date = (Get-Date).AddDays(11) это было только для того, чтобы протестировать его, чтобы я мог приземлиться в нерабочий день.

2. @tobulos1 Powershell построен поверх .NET — он действительно близок к C # и имеет те же конструкции