5

希望这不会太难,但我正在编写一个脚本,从域中查询用户信息并导出到 CSV。

该脚本由我们的管理人员运行,他们只需输入用户名即可。

棘手的部分是我需要根据即将到来的星期五命名 CSV。

Note: I am in Australia so my date format is DD-MM-YYYY

我目前正在考虑的方式如下:

# Grab the Script Run Timestamp
$ScriptRuntime = Get-Date -Day 4 -Month 5 -Year 2013

# Grab the next Friday (including today)
$NextFriday = $ScriptRuntime.AddDays(0 + $(0,1,2,3,4,5,6 -eq 5 - [int]$ScriptRuntime.dayofweek))

Write-Host "Script Run:  "$ScriptRuntime
Write-Host "Next Friday: "$NextFriday

这适用于除星期六以外的所有日子。

  • 如果我将这一天作为 2013 年第 5 个月第 26 天运行,它将返回 2013 年 5 月 31 日
  • 如果我将这一天作为 2013 年第 5 个月第 27 天运行,它将返回 2013 年 5 月 31 日
  • 如果我将这一天作为 2013 年第 5 个月第 28 天运行,它将返回 2013 年 5 月 31 日
  • 如果我将这一天作为 2013 年第 5 个月第 29 天,它将返回 2013 年 5 月 31 日
  • 如果我将这一天作为 2013 年第 5 个月第 30 天运行,它将返回 2013 年 5 月 31 日
  • 如果我将这一天作为 2013 年第 5 个月第 31 天,它将返回 2013 年 5 月 31 日
  • 如果我将这一天作为 2013 年第 6 个月第 1 天运行,它将返回 2013 年 5 月 31 日(这应该是 2013 年 7 月 6 日)
  • 如果我将这一天作为 2013 年第 6 个月第 2 天运行,它将返回 07/06/2013

我究竟做错了什么?

4

9 回答 9

10

这找到下一个星期五:

$date = Get-Date
while ($Date.DayOfWeek -ne "Friday") {$date = $date.AddDays(1)}
于 2016-01-07T12:15:30.637 回答
6

我不确定我是否在关注你,但这是我下周五会得到的:

$date = Get-Date

for($i=1; $i -le 7; $i++)
{        
    if($date.AddDays($i).DayOfWeek -eq 'Friday')
    {
        $date.AddDays($i)
        break
    }
}
于 2013-05-28T07:26:09.807 回答
4

这是一个也可以解决问题的单线:

$Date = @(@(0..7) | % {$(Get-Date).AddDays($_)} | ? {$_.DayOfWeek -ieq "Friday"})[0]

如果您需要特定时间:

$Date = @(@(0..7) | % {$(Get-Date "12:00").AddDays($_)} | ? {($_ -gt $(Get-Date)) -and ($_.DayOfWeek -ieq "Friday")})[0]
于 2014-05-29T17:22:15.300 回答
3

派对有点晚了,但这是我的看法(没有循环,没有条件):

    [datetime] $MyDate =  get-date
    [DayOfWeek] $NextDayOfWeek = 'Friday'

    $MyDate.AddDays( (7 - [int] $MyDate.DayOfWeek + [int] $NextDayOfWeek )%7 )

如果您想验证更多日期:

    [datetime] $MyDate =  get-date
    [DayOfWeek] $NextDayOfWeek = 'Friday'

    1..30 | ForEach-Object {
                            [PSCustomObject]@{ 
                                DayOfWeek = $MyDate.DayOfWeek ;
                                Date = $MyDate; 
                                $("Next$NextDayOfWeek") = $MyDate.AddDays((7 - [int] $MyDate.DayOfWeek + [int] $NextDayOfWeek )%7)   
                            }; 
                            $MyDate = $MyDate.AddDays(1)  
                        } 
于 2019-10-16T14:58:05.640 回答
3

无论您运行代码的日期如何,您都可以使用以下命令获取本周星期五的日期:

$today = (Get-Date).Date    
$nextfriday = $today.AddDays([int][dayofweek]::Friday - $today.DayOfWeek)    

如果您想始终获得下一个星期五(因此,如果您在星期六跑步,则为下周的星期五),您只需要在最后一个额外的修饰符:

if ($today -ge $nextfriday) {$nextfriday = $nextfriday.AddDays(7)}
于 2018-05-14T08:14:36.127 回答
1

试试这个找到下周五:

$ScriptRuntime = Get-Date -Day 4 -Month 5 -Year 2013
$i= switch ( [int][dayofweek]::Friday - [int] $ScriptRuntime.dayofweek )
    { 
       -1 { 6 }
       default { $_ }
    } 
$ScriptRuntime.adddays($i)
于 2013-05-28T07:34:01.857 回答
0

我会这样做:

$Date = Get-Date
$targetDay = [int][dayofweek]::Friday
# I use this logic to figure out the next Friday
# else we would get Friday of this week
$intToday = if([int]$Date.DayOfWeek -le [int][dayofweek]::Friday ){
                [int]$Date.DayOfWeek 
            } else { 
                [int]$Date.DayOfWeek - 7
            }
$nextFriday = $date.AddDays($targetDay - $intToday)

我遇到了同样的问题,但我认为使用循环有点太多了。我发现一篇关于PowerShell Find Date of a previous day in any week but the values where hardcoded for days and取决于你的windows环境,周日可能不是索引0(零)的文章。因此,我以逻辑为灵感,并想出了上面的逻辑。

希望对下一个人有帮助。

于 2016-01-04T23:20:53.410 回答
0

我将 Shay 的示例放入扩展函数中,因此您还可以定位您要查找的日期的确切时间。

Function Find-NextDate {
[CmdletBinding()]
param (
    # Parameter help description
    [Parameter(Mandatory=$true,
    Position=1)]
    [validatenotnullorempty()]
    [ValidateSet("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday")]
    [string]$Day,
    [Parameter(Mandatory=$false,
    Position=2)]
    [validatenotnullorempty()]
    [string]$Time
)
process {
    if ($Time) {
        $Date = (Get-Date $Time)
        for($i=1; $i -le 7; $i++) {        
            if ($Date.AddDays($i).DayOfWeek -eq "$Day") {
                $Date.AddDays($i)
                break
            }
        }
    }
    else {
        $Date = (Get-Date)
        for($i=1; $i -le 7; $i++) {        
            if ($Date.AddDays($i).DayOfWeek -eq "$Day") {
                $Date.AddDays($i)
                break
            }
        }
    }
}

}

于 2019-04-11T09:08:05.253 回答
-1

您可以从 PowerShell Gallery安装ProductivityTools.PSGetDayInGivenWeek模块

Install-Module -Name ProductivityTools.PSGetDayInGivenWeek

它公开了Get-RequestedDayOfWeek方法,该方法允许定义您要查找的星期几以及您是在给定日期之前还是之后查找它。所以下周一找

Get-RequestedDayOfWeek '2018.03.03' -Monday -After

可以在此处找到 PowerShell 库中的模块,并在此处找到它的代码。

在此处输入图像描述

于 2018-09-18T15:09:25.927 回答