Выражения допускаются только как первый элемент конвейера. - PullRequest
9 голосов
/ 22 августа 2011

Я новичок в написании PowerShell, но это то, что я пытаюсь достичь.

  1. Я хочу сравнить даты двух файлов Excel, чтобы определить, является ли один новее другого.
  2. Я хочу конвертировать файл из csv в xls на компьютере, который не имеет Excel. Только если приведенное выше утверждение верно, исходный файл xls уже скопирован.
  3. Я хочу скопировать недавно преобразованный файл xls в другое место
  4. Если файл уже открыт, его не удастся скопировать, поэтому я хочу отправить уведомление по электронной почте об успешном или неудачном завершении этой операции.

Вот сценарий, с которым у меня возникают проблемы. Ошибка: «Выражения допускаются только в качестве первого элемента конвейера». Я знаю, что это связано с операцией электронной почты, но я не знаю, как написать это вручную, включая все эти переменные. Возможно, ошибок больше, но я их сейчас не вижу. Спасибо за любую помощь, я ценю это!

$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 ]

8 голосов
/ 11 августа 2015

Эта ошибка появляется при попытке выполнить независимый блок кода из цепочки конвейера.

В качестве другого примера представьте этот код, используя jQuery:

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

Каждая точка (.) будет связывать массив в следующую функцию. В приведенной выше функции это разрывается с console, потому что это не означает, что никакие значения не могут быть переданы по каналу. Если мы хотим выйти из цепочки, чтобы выполнить некоторый код (возможно, для объектов в цепочке - мы можем сделать это с each, как это:

$("div").not(".main").each(function() {console.log(this)})

Решение powershell идентично. Если вы хотите запустить скрипт для каждого элемента в вашей цепочке отдельно, вы можете использовать ForEach-Object или его псевдоним (%).

Представьте, что у вас есть следующая функция в Powershell:

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

Последняя строка не может быть выполнена, потому что это скрипт, но мы можем исправить это с помощью ForEach следующим образом:

$settings | ?{$_.Key -eq 'Environment' } | %{ $_.Value = "Prod" }
4 голосов
/ 22 августа 2011

Эта ошибка в основном возникает, когда вы используете выражение на принимающей стороне конвейера, когда он не может получить объекты из конвейера.

Вы получите ошибку, если сделаете что-то вроде этого:

$a="test" | $a

или даже это:

"test" | $a

Я не знаю, почему пытаются везде пудрить.Я бы порекомендовал вам изучить основы работы с конвейерами Powershell.Вы ошибаетесь.Кроме того, я думаю, что вы можете обратиться к ссылке ниже, чтобы увидеть, как отправлять почту, должно быть прямым, без осложнений, которые вы добавили с трубами: http://www.searchmarked.com/windows/how-to-send-an-email-using-a-windows-powershell-script.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...