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

时间:2011-08-22 17:54:42

标签: powershell

我刚开始写PowerShell,但这正是我想要完成的。

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

    $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)}
    }   
    

2 个答案:

答案 0 :(得分:7)

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

就像一个不同的例子,想象使用jQuery的代码:

$("div").not(".main").console.log(this)

每个点(.)将数组链接到下一个函数。在上面的函数中,这打破了console,因为它并不意味着有任何值传入。如果我们想要从链接中断出来执行某些代码(可能在链中的对象上 - 我们可以使用{{ 1}}像这样:

each

解决方案是powershell是完全相同的。如果您想单独针对链中的每个项目运行脚本,可以使用ForEach-Object或别名($("div").not(".main").each(function() {console.log(this)}) )。

想象一下,你在Powershell中有以下功能:

%

最后一行无法执行,因为它是一个脚本,但we can fix that with ForEach是这样的:

$settings | ?{$_.Key -eq 'Environment' } | $_.Value = "Prod" 

答案 1 :(得分:4)

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

如果你这样做,你会得到错误:

$a="test" | $a

甚至是这样:

"test" | $a

我不知道为什么要到处管道。我建议你学习关于Powershell流水线的基础知识。你接近错了。此外,我认为你可以参考下面的链接看看如何发送邮件,应该是直接的,没有你添加管道的复杂性:http://www.searchmarked.com/windows/how-to-send-an-email-using-a-windows-powershell-script.php