PowerShell ForEach删除前导零

PowerShell ForEach删除前导零,powershell,Powershell,我对PowerShell和编程基本上是新手,所以我希望您在阅读本文时有一些耐心。在我解释我的问题之前,我觉得我必须先告诉你一些背景信息: 我的所有交易都保存在$transactions中。每笔交易都有接收人、日期和金额 我已按以下方式将年度交易分为$TransactionsPerYear: $TransactionsPerYear = $Transactions | Group-Object { [int]($_.date -replace '.*\.') } [String[]]$Month

我对PowerShell和编程基本上是新手,所以我希望您在阅读本文时有一些耐心。在我解释我的问题之前,我觉得我必须先告诉你一些背景信息:

我的所有交易都保存在$transactions中。每笔交易都有接收人、日期和金额

我已按以下方式将年度交易分为$TransactionsPerYear:

$TransactionsPerYear = $Transactions | Group-Object { [int]($_.date -replace '.*\.') }
[String[]]$Months = "01","02","03","04","05","06","07","08","09","10","11","12"
(顺便说一句,谁能给我解释一下最后的正则表达式,每个字符都做了什么?)

接下来我要做的是将年度收入和支出分为不同的变量。在此之后,我试图从每年提取月份,并将其保存为$month。日期采用以下格式dd.MM.yyyy

问题1:

下面是我如何获取所有日期的方法,但是如何提取月份呢

$TransactionsPerYear | Select -ExpandProperty Group | Select -ExpandProperty date | Select -Unique
问题2:

因为我不知道如何提取月份,我尝试了以下方法:

$TransactionsPerYear = $Transactions | Group-Object { [int]($_.date -replace '.*\.') }
[String[]]$Months = "01","02","03","04","05","06","07","08","09","10","11","12"
当我在$Months中有每个月时,我尝试获取每月交易并将其保存到新变量中:

ForEach($Month in $Months){

New-Variable -Name "Transactions_$Month$Year" -Value ($Transactions | Where {$_.Date -like "*.$Month.$Year"} | Group-Object 'Receiver' | Select-Object Count, Name, @{L="Total";E={$_ | Select -ExpandProperty Group | Measure-Object Amount -Sum | Select -ExpandProperty Sum}} | Sort-Object {[double]$_.Total})

}
我在这里面临的问题是ForEach从每个月删除前导零,当这种情况发生时,ForEach中的这部分与任何内容都不匹配,新变量为null:

Where {$_.Date -like "*.$Month.$Year"}
如果你需要更多信息,请告诉我。如果有人能帮助我,我将非常感激


日期看起来是:2016年2月25日。从你的帖子上看,你似乎跳得太远了

不要每次需要与
Date
属性交互时都尝试进行字符串操作,只需将其转换为对象即可

DateTime.ParseExact()
方法允许我们指定格式(例如
dd.MM.yyyy
),并解析日期的字符串表示形式

现在,您可以通过以下方式按年份分组:

$TransactionsPerYear = $Transactions |Group-Object { $_.DateParsed.Year }

要按年份和月份进行分组,我将创建一个嵌套哈希表,如下所示:

# Create a hashtable, containing one key per year
$MonthlyTransactions = @{}

foreach($Year in $Transactions |Group {$_.DateParsed.Year})
{
    # Create another hashtable, containing a key for each month in that year
    $MonthlyTransactions[$Year.Name] = @{}

    foreach($Month in $Year.Group |Group {$_.DateParsed.Month})
    {
        # Add the transactions to the Monthly hashtable
        $MonthlyTransactions[$Year.Name][$Month.Name] = $Month.Group
    }
}
现在,您可以通过执行以下操作来计算特定月份的交易价值:

$TotalValueMay2010 = ($MonthlyTransactions[2010][5] |Measure-Object Amount -Sum).Sum

(顺便说一句,谁能给我解释一下最后的正则表达式,每个字符都做了什么?)

当然可以:


以您自己的示例输入字符串
25.02.2016
,第一组(
*
)将在
25.02
上匹配,
\。
将在之后的
上匹配,因此剩下的唯一一件事就是
2016

从你的帖子上看,你似乎跳得太远了

不要每次需要与
Date
属性交互时都尝试进行字符串操作,只需将其转换为对象即可

DateTime.ParseExact()
方法允许我们指定格式(例如
dd.MM.yyyy
),并解析日期的字符串表示形式

现在,您可以通过以下方式按年份分组:

$TransactionsPerYear = $Transactions |Group-Object { $_.DateParsed.Year }

要按年份和月份进行分组,我将创建一个嵌套哈希表,如下所示:

# Create a hashtable, containing one key per year
$MonthlyTransactions = @{}

foreach($Year in $Transactions |Group {$_.DateParsed.Year})
{
    # Create another hashtable, containing a key for each month in that year
    $MonthlyTransactions[$Year.Name] = @{}

    foreach($Month in $Year.Group |Group {$_.DateParsed.Month})
    {
        # Add the transactions to the Monthly hashtable
        $MonthlyTransactions[$Year.Name][$Month.Name] = $Month.Group
    }
}
现在,您可以通过执行以下操作来计算特定月份的交易价值:

$TotalValueMay2010 = ($MonthlyTransactions[2010][5] |Measure-Object Amount -Sum).Sum

(顺便说一句,谁能给我解释一下最后的正则表达式,每个字符都做了什么?)

当然可以:

以您自己的示例输入字符串
25.02.2016
,第一组(
*
)将在
25.02
上匹配,
\。
将在之后的
上匹配,因此剩下的唯一一件事就是
2016

你是这个意思吗

$dates = ([DateTime] "1/1/2016"),([DateTime] "1/2/2016"),
  ([DateTime] "2/1/2016"),([DateTime] "3/1/2016")
$uniqueMonths = $dates | ForEach-Object { $_.Month } | Sort-Object -Unique
# $uniqueMonths contains 1,2,3
你是说这个吗

$dates = ([DateTime] "1/1/2016"),([DateTime] "1/2/2016"),
  ([DateTime] "2/1/2016"),([DateTime] "3/1/2016")
$uniqueMonths = $dates | ForEach-Object { $_.Month } | Sort-Object -Unique
# $uniqueMonths contains 1,2,3

你能和我们分享一下这个日期吗?“dd.MM.yyyy”或“MM/dd/yyyy”等。我现在已经将其添加到文章的末尾。我已经测试了您的代码及其工作性能。您是否指定了变量
$Year
?有时它有效,有时它删除前导零,这似乎就是问题所在。我不知道这是否是PowerShell ISE中的一个“功能”,或者是什么导致了它,但无论如何,当前的方法是不可靠的。你能和我们分享一下日期的样子吗?“dd.MM.yyyy”或“MM/dd/yyyy”等。我现在已经将其添加到文章的末尾。我已经测试了您的代码及其工作性能。您是否指定了变量
$Year
?有时它有效,有时它删除前导零,这似乎就是问题所在。我不知道这是否是PowerShell ISE中的一个“功能”,或者是什么导致了它,但无论如何,当前的方法是不可靠的。我真的在尝试解决这个问题。所以$MonthlyTransactions哈希表的键为2015、2016,值为7、11、12。但这并没有给我任何$MonthlyTransactions[2015][7]的回报,即使它存在。应该吗?它只是说“不能索引到一个空数组”,我试图实现的是从每个月获得费用、收入和总额(收入减去费用)。我还试图获得每个月的所有交易,并按“接收者”分组,计算我在每个“接收者”上花了多少钱。好的,我想我知道了,你应该这样做:$MonthlyTransactions['2015']['7']谢谢你的帮助Mathias!我真的想弄明白这一点。所以$MonthlyTransactions哈希表的键为2015、2016,值为7、11、12。但这并没有给我任何$MonthlyTransactions[2015][7]的回报,即使它存在。应该吗?它只是说“不能索引到一个空数组”,我试图实现的是从每个月获得费用、收入和总额(收入减去费用)。我还试图获得每个月的所有交易,并按“接收者”分组,计算我在每个“接收者”上花了多少钱。好的,我想我知道了,你应该这样做:$MonthlyTransactions['2015']['7']谢谢你的帮助Mathias!