当前位置: 首页 > 知识库问答 >
问题:

日期时间减法在 PowerShell 中不起作用 - 赋值与相等运算符

锺高翰
2023-03-14

今天(2017-05-29)我在Windows 7企业版上使用PowerShell 5.0.10586.117并运行以下程序(简称:

$dateOfLicense = "2017-04-20"
$dateOfToday = '{0:yyyy-MM-dd}' -f (Get-Date)

$TimeDifference = [DateTime]$dateOfToday - [DateTime]$dateOfLicense 
if (($TimeDifference) = 14)
{
    Write-Host "test"
}

即使两天之间的差异是39,我的代码也会跳转到if子句中,并将“test”发送到屏幕。

我在这里做错了什么?

共有3个答案

司空繁
2023-03-14

不是马丁的更好的解决方案,只是一个简短的代码

$dateOfLicense = [DateTime]"2017-04-20"
$TimeDifferenceDays = ((Get-Date) - $dateOfLicense).Days 

if ($TimeDifferenceDays -lt 14)
{
    Write-Host "test"
}
岳阳飙
2023-03-14

补充Martin Brandl的有用答案:

与许多其他语言一样——但与VBScript不同,例如——PowerShell使用不同的符号:

  • 赋值运算符(=
  • vs。相等测试运算符(-eq

这种区别允许将赋值用作表达式,这是您无意中做的:

if ($TimeDifference = 14) ... # same as: if (($TimeDifference) = 14) ...

14赋值给变量$TimeDifference,正如Martin所解释的,并且,由于赋值(必要时,如果)包含在(…),则作为的条件,返回赋值值(内部(…)$timedifferent周围,这里没有区别,但是,如果,则该值用作的布尔条件。

也就是说,由 if 计算的 (...) 表达式具有值 14 (非零数),因此在此布尔上下文中被解释为$true,而不管$TimeDifference的原始值如何。

注意:

>

  • 要了解有关PowerShell操作符的更多信息,请运行Get-Helpabout_Operators

    若要了解 PowerShell 如何将任意值解释为条件中的布尔值(到布尔强制),请参阅此答案的底部部分。

    要测试已经是布尔值的变量或表达式,只需按原样使用它们,或者在必要时使用-not)否定它们;例如:

    if ($someBoolean) {      # Better than: if ($someBoolean -eq $true)
    if (-not $someBoolean) { # Better than: if ($someBoolean -eq $false)
    

    最后,这里是您的代码的简化版本,它不需要中间变量,使用强制转换将字符串转换为[datetime]实例,并使用[datetime]::现在,更有效的相当于Get-Date(尽管这很少重要)。

    if (([datetime]::now - [datetime] '2017-04-20').Days -eq 14) {
      "test"
    }
    

    注意"test"作为语句本身如何隐式将输出发送到PowerShell的(成功)输出流,默认情况下打印到控制台。
    Write-Host绕过此流,通常应避免。

  • 充阳秋
    2023-03-14

    您正在分配 14$TimeDifference。相反,您不想使用 -le 比较 Days 属性:

    if ($TimeDifference.Days -le 14)
    {
        Write-Host "test"
    }
    
     类似资料:
    • 这是C++程序员常见的错误,包括熟练的C++程序员也会把相等(==)与赋值(=)运算符相  混淆。这种错误的破坏性在于它们通常不会导致语法错误,而是能够顺利编译,程序运行完后,因为运行时的逻辑错误而得到错误结果。 C++有两个方面会导致这些问题。一个是任何产生数值的表达式都可以用于任何控制结构的判断部分。如果数值为0,则当作false,如果数值为非0,则当作true。第二是C++赋值会产生一个值,

    • 1.日期时间的转换及赋值 1.1.date类型转换为字符串 justep.Date.toString(new Date(), justep.Date.STANDART_FORMAT_SHOT) 4种时间格式常量: justep.Date.DEFAULT_FORMAT 时间格式常量 = “yyyy/MM/dd hh:mm:ss” justep.Date.DEFAULT_FORMAT_SHOT 时

    • 问题内容: 我想通过对Sequelize进行简单添加来进行更新。 表: 样品: 此查询后 我知道这是一个简单的问题,但我找不到解决方案。 我可以加减哪个运算符?谢谢 问题答案: 这里是 : 要么 您也可以只替换为。 有关更多详细信息:请 阅读

    • 本文向大家介绍Java对日期Date类进行加减运算、年份加减月份加减、时间差等等,包括了Java对日期Date类进行加减运算、年份加减月份加减、时间差等等的使用技巧和注意事项,需要的朋友参考一下 实现代码一: 注:在Calendar对象的add方法中,第二个参数为正数表示“加”,负数表示“减”。 代码二: java date 日期加减天数 测试类代码: 运行结果: 2014-10-06 2014-

    • 问题内容: 表结构: 总行数: 137967 带有更多表联接的真实查询要更长得多,关键是,我无法使表使用索引。如果要选择特定日期之前的所有数据,这对我来说将很难。但是,我注意到,如果选择较小的数据子集,则可以使MySQL使用索引。 那么,无论我放置什么日期,该如何确保MySQL将使用索引? 问题答案: 一切都按预期进行。:) 有索引可以加快检索速度。他们使用索引查找来完成。 在你第一次查询中不使用

    • 我正在尝试将时间戳值转换为twig文件中的日期格式,但出现以下错误。 错误: 在呈现模板期间引发了异常(“DateTime::\构造():无法分析时间字符串(