Как правильно увеличить дату ('гггг-мм-дд') в разные месяцы в Power Shell - PullRequest
0 голосов
/ 29 октября 2018

Позвольте мне спросить, как правильно увеличить дату в PowerShell.Мы хотели бы получить список дат в формате 'гггг-мм-дд' в указанный период, чтобы передать их другим программам.

Например, когда DateStart = '2018-01-05' и DateEnd ='2018-01-08', тогда список дат должен быть;

2018-01-05
2018-01-06
2018-01-07
2018-01-08

В настоящее время мой сценарий может работать столько, сколько назначенный период в том же месяце, как вышеупомянутый случай, но не может работатьв другом месяце.

#Get_DateRange.ps1

param(
  [String] $DateStart,     
  [String] $DateEnd
)

# Variables Set
$StartDT = [Datetime]::ParseExact($DateStart,"yyyy-mm-dd",$null).AddDays(-1)
$EndDT   = [Datetime]::ParseExact($DateEnd,"yyyy-mm-dd",$null)

# Return Date List during designated period 
do
 {
  $StartDT = $StartDT.AddDays(1)
  $StartDT.toString("yyyy-mm-dd")
 } While ($StartDT -lt $EndDT)

Как неправильный случай, когда DateStart = '2018-01-31' и DateEnd = '2018-02-05', он только возвратил '2018-01-31'.

Я, очевидно, что-то не так с моим сценарием, но пока не знаю.Любой совет будет признателен снова.

Спасибо.

Дополнительная информация: Мы хотели бы использовать вышеуказанный скрипт в другой партии, как это;

FOR /F %%d IN ('%PS_EXE%  -ExecutionPolicy ByPass  -File "Get_DateRange.ps1" -DateStart %EXT_START_DT% -DateEnd %EXT_END_DT%') DO (
@ECHO %FILE_ID%,%%d,%TARGET_DB%,%TARGET_SCHEMA%,%TARGET_TABLE%,'%%d',gz,%TARGET_DB%,%TARGET_TABLE%>>%EXT_FILE_NAME%
)

Ответы [ 3 ]

0 голосов
/ 29 октября 2018

Я вижу, что ArcSet указал на ошибку - mm вместо MM.

вот еще один способ сделать это. [ ухмылка ] - это захватывает количество дней между двумя датами и дает дату начала [нулевой элемент] и одну дату для каждого из оставшихся дней.

$DateStart = '2018-01-31'
$DateEnd = '2018-02-05'


# Variables Set
$StartDT = Get-Date -Date $DateStart
$EndDT   = Get-Date -Date $DateEnd
$DayCount = ($EndDT - $StartDT).Days

# Return Date List during designated period 
foreach ($DC_Item in 0..$DayCount)
    {
    $StartDT.AddDays($DC_Item).ToString('yyyy-MM-dd')
    }

вывод ...

2018-01-31
2018-02-01
2018-02-02
2018-02-03
2018-02-04
2018-02-05
0 голосов
/ 29 октября 2018

Этот вопрос имеет тег batch-file, так что здесь это простое решение для пакетного файла, которое просто:

@echo off
setlocal EnableDelayedExpansion

set "DateStart=%1" & set "DateEnd=%2"

for /F "tokens=1-6 delims=-" %%a in ("%DateStart%-%DateEnd%") do (
   set /A "Days=366*(%%d-%%a)+31*(1%%e-1%%b)+(1%%f-1%%c)+10, MM=1%%b-100"
)

set "D=%DateStart:-=%"
for /L %%# in (1,1,%Days%) do if !D! leq %DateEnd:-=% (
   echo !D:~0,4!-!D:~4,2!-!D:~6,2!
   set /A "newMM=^!(1!D:~6!-(130+(MM+MM/8)%%2-2*^!(MM-2)+^!(!D:~0,4!%%4))), lastMM=^!(1!D:~4,2!-112), newYYYY=newMM*lastMM"
   set /A "MM+=newMM*(1-lastMM*12), D+=newYYYY*(20100-1!D:~4!) + ^!newYYYY*newMM*(100*MM+10000-1!D:~4!) + 1"
)

Пример:

C:\Users\Antonio>test 2018-01-31 2018-02-05
2018-01-31
2018-02-01
2018-02-02
2018-02-03
2018-02-04
2018-02-05

Если вы хотите использовать эти результаты в пакетном файле, тогда гораздо проще, чтобы весь код был в одном пакетном файле. Кроме того, этот код работает быстрее, чем комбинация PowerShell-Batch ... ;)

0 голосов
/ 29 октября 2018

ОК, похоже, все, что было на самом деле не так с yyyy-mm-dd, должно было быть yyyy-MM-dd

function Get-Dates(){
    param(
        [String] $DateStart,     
        [String] $DateEnd
    )
    # Variables Set
    $StartDT = [Datetime]::ParseExact($DateStart,"yyyy-MM-dd",$null).AddDays(-1)
    $EndDT   = [Datetime]::ParseExact($DateEnd,"yyyy-MM-dd",$null)
    # Return Date List during designated period 
    While ($StartDT -lt $EndDT){
        $StartDT = $StartDT.AddDays(1)
        $StartDT.toString("yyyy-MM-dd")
    }

}

Get-Dates -DateStart "2018-11-29" -DateEnd "2018-12-03"

возвращает

2018-11-29
2018-11-30
2018-12-01
2018-12-02
2018-12-03
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...