Powershell 表达式仅允许作为管道的第一个元素

Powershell 表达式仅允许作为管道的第一个元素,powershell,Powershell,我不擅长在powershell中写作,但这正是我努力实现的目标 我想比较两个excel文件的日期,以确定其中一个是否比另一个更新 我想在没有excel的计算机上将文件从csv转换为xls。仅当上述语句为真时,初始xls文件已被复制 我想将新转换的xls文件复制到其他位置 如果文件已经打开,它将无法复制,因此我想发送一封电子邮件,提醒您此操作成功或失败 这是我遇到问题的脚本。错误是“表达式只允许作为管道的第一个元素。”我知道这与电子邮件操作有关,但我不知道如何在包含所有这些变量的情况下手动写出。可

我不擅长在powershell中写作,但这正是我努力实现的目标

  • 我想比较两个excel文件的日期,以确定其中一个是否比另一个更新
  • 我想在没有excel的计算机上将文件从csv转换为xls。仅当上述语句为真时,初始xls文件已被复制
  • 我想将新转换的xls文件复制到其他位置
  • 如果文件已经打开,它将无法复制,因此我想发送一封电子邮件,提醒您此操作成功或失败
  • 这是我遇到问题的脚本。错误是“表达式只允许作为管道的第一个元素。”我知道这与电子邮件操作有关,但我不知道如何在包含所有这些变量的情况下手动写出。可能有更多的错误,但我现在没有看到。谢谢你的帮助,我很感激

    $CSV = "C:filename.csv"
    $LocalXLS = "C:\filename.xls"
    $RemoteXLS = "D:\filename.xls"
    $LocalDate = (Get-Item $LocalXLS).LASTWRITETIME
    $RemoteDate = (Get-Item $RemoteXLS).LASTWRITETIME
    $convert = "D:\CSV Converter\csvcnv.exe"
    if ($LocalDate -eq $RemoteDate) {break}
    else { 
    & $convert $CSV $LocalXLS
    $FromAddress = "email@address.com"
    $ToAddress = "email@address.com"
    $MessageSubject = "vague subject"
    $SendingServer = "mail.mail.com"
    $SMTPMessage = New-Object System.Net.Mail.MailMessage $FromAddress, $ToAddress, $MessageSubject, $MessageBody
    $SMTPClient = New-Object System.Net.Mail.SMTPClient $SendingServer
    $SendEmailSuccess = $MessageBody = "The copy completed successfully!" | New-Object System.Net.Mail.SMTPClient mail.mail.com $SMTPMessage
    $RenamedXLS = {$_.BaseName+(Get-Date -f yyyy-MM-dd)+$_.Extension}
    
    Rename-Item -path $RemoteXLS -newname $RenamedXLS -force -erroraction silentlycontinue
    If (!$error)
        { $SendEmailSuccess | copy-item $LocalXLS -destination $RemoteXLS -force }
    Else
        {$MessageBody = "The copy failed, please make sure the file is closed." | $SMTPClient.Send($SMTPMessage)}
    }   
    

    当无法从管道接收对象时,在管道的接收端使用表达式时,基本上会发生此错误

    如果执行以下操作,则会出现错误:

    $a="test" | $a
    
    $("div").not(".main").each(function() {console.log(this)})
    
    $settings | ?{$_.Key -eq 'Environment' } | %{ $_.Value = "Prod" }
    
    甚至这个:

    "test" | $a
    

    我不知道你为什么要到处吹管。我建议您学习有关Powershell管道的基础知识。你走错路了。另外,我认为您可以参考下面的链接来了解如何发送邮件,应该是直截了当的,而不会像您在管道中添加的那样复杂:

    当您试图从管道链中执行独立的代码块时,会出现此错误

    作为另一个示例,想象一下使用jQuery的代码:

    $("div").not(".main").console.log(this)
    
    每个点(
    )将把数组链接到下一个函数中。在上面的函数中,这与
    console
    中断,因为它并不意味着要引入任何值。如果我们想中断链接以执行一些代码(可能是在链中的对象上-我们可以使用
    每个
    这样做:

    $a="test" | $a
    
    $("div").not(".main").each(function() {console.log(this)})
    
    $settings | ?{$_.Key -eq 'Environment' } | %{ $_.Value = "Prod" }
    
    解决方案是powershell完全相同。如果要针对链中的每个项目单独运行脚本,可以使用或其别名(
    %

    假设您在Powershell中具有以下功能:

    $settings | ?{$_.Key -eq 'Environment' } | $_.Value = "Prod" 
    
    无法执行最后一行,因为它是脚本,但如下所示:

    $a="test" | $a
    
    $("div").not(".main").each(function() {console.log(this)})
    
    $settings | ?{$_.Key -eq 'Environment' } | %{ $_.Value = "Prod" }
    

    我不确定您在这一行中到底想完成什么:$sendmailsuccess=$MessageBody=“复制成功完成!”| New Object System.Net.Mail.SMTPClient Mail.Mail.com$SMTPMessage,但我认为这是错误的罪魁祸首。@meep-不要编辑内容。那就没有任何问题了。这对未来的访问者很有用,即使你已经弄明白了。附加你的编辑。我喜欢管道,但我发现它已经结束了ed.尤其是在脚本内部。我总是在命令提示符下使用管道,但我很少在脚本中使用它。@EBGreen-我认为真正的问题是只有当你不真正理解发生了什么时。例如,你可以使用
    $a | write host
    而不是
    write host$a
    。是的,有时它被过度使用了。写起来很好一行一行,但很难维护其他人必须阅读和维护的脚本。是的,即使在脚本中完全正确地使用它们,我只是把它看作是一个好习惯的问题(对我自己来说)继续并在脚本中尽可能显式。这意味着更少的管道和显式cmdlet名称,而不是别名。我试图让它根据错误结果发送不同的消息。您在该脚本中向我显示的内容是我已经尝试过的。当我将其用于发送电子邮件时,结果是相同的。请解释我如何让它根据不同的响应发送不同的消息。