собственно суть такая:А зачем знать количество итераций?
есть файл эксель, с кучей данных
например, надо сделать рассылку по пятистам почтовым адресам, которые находятся в первом столбце.
через foreach всё понятно, но как задать последний элемент цикла? тоесть узнать количество итераций?
собственно суть такая:А зачем знать количество итераций?
есть файл эксель, с кучей данных
например, надо сделать рассылку по пятистам почтовым адресам, которые находятся в первом столбце.
через foreach всё понятно, но как задать последний элемент цикла? тоесть узнать количество итераций?
Выполняй до первой пустой ячейки (или ячейки не содержащйе почтовый адрес).
ммм, чот солнце меня совсем растопило... как?help about_while
угу, понял, сейчас попробуюв данном случае можно проверять так: while (!$a) или while ($a match ".+@.+")
Updated: 27 July 2012, 14:40:24
я не догоняю объектную модель экселя
какое должно быть условие?
while ($a -ne $null), где, например,
$objexcel.visible = $true
$fp = "С:\test.xlsx"
$wb = $objexcel.Workbooks.Open($fp)
$ws = $wb.activesheet
$cell = $ws.Cells
$a = $cell.Item(1,1).text
?
У страницы Excel(Worksheet) есть свойство UsedRange, возвращающее все использованные на данный момент ячейки.Used range может указывать на более широкий диапазон, нежели диапазон заполненный нужными данными
Activesheet.UsedRange.Rows.Count - число строк на активной странице;
Activesheet.UsedRange.Columns.Count - число столбцов на активной странице;
Used range может указывать на более широкий диапазон, нежели диапазон заполненный нужными данными
надо сделать рассылку по пятистам почтовым адресам, которые находятся в первом столбцеИменно по этой причине я бы скопировал диапазон из 500 ячеек, размещенных в одном столбце, в новую книгу Excel и именно в ней запустил макрос. Потому что если записать в ячейке Z9999 значение, а потом стереть - Used Range должен остаться излишне большим.
$ex = new-object -com Excel.Application
$wb = $ex.Workbooks.Open("D:\12.xlsx")
$ws = $wb.Worksheets.Item(1)
$ws.Range("A65536").End(-4162).Row
Именно по этой причине я бы скопировал диапазон из 500 ячеек, размещенных в одном столбце, в новую книгу Excel и именно в ней запустил макрос.Можно не копировать, можно просто поименовать нужный диапазон. Но все это лишние действия. Зачем это делать, когда можно просто проверять очередное считанное значение на пустоту или на патерн email-адреса? ;)
$ws.Range("A65536").End(-4162).Row
PS обрати внимание на то, что цикл while проверяет условие до тела цикла, а переменная, которую он проверяет получает своё значение внутри цикла.
$objexcel.visible = $true
$fp = "f:\powershelltest\рассылка\adressbook.xlsx"
$filename = "f:\powershelltest\test.txt"
$wb = $objexcel.Workbooks.Open($fp)
$ws = $wb.activesheet
$cell = $ws.Cells
do
{
$b++;
$a = $cell.Item($b,1).text
$smtpserver = "smtp.gmail.com"
$msg = new-object Net.Mail.MailMessage
$att = new-object Net.Mail.Attachment($filename)
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$smtp.EnableSsl = $True
$smtp.Credentials = New-Object System.Net.NetworkCredential("login", "pass"); # Put username without the @GMAIL.com or – @gmail.com
$msg.From = "email_adress_name"
$msg.To.Add($a)
$msg.Subject = "Monthly Report"
$msg.Body = "Good Morning, Last month’s LOGINS & GROUPCALLS FOR ALL GIDS IN SYSTEM IS ATTACHED"
$msg.Attachments.Add($att)
$smtp.Send($msg)
}
while($a -match ".+@.+")
Исключение при вызове "Add" с "1" аргументами: "Параметр 'addresses' не может быть пустой строкой.
Имя параметра: addresses"
C:\Documents and Settings\xagen\Local Settings\Temp\4784243f-34d8-44d2-a250-60c34892edf5.ps1:19 знак:13
+ $msg.To.Add <<<< ($a)
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
Исключение при вызове "Send" с "1" аргументами: "Необходимо указать получателя."
C:\Documents and Settings\xagen\Local Settings\Temp\4784243f-34d8-44d2-a250-60c34892edf5.ps1:23 знак:12
+ $smtp.Send <<<< ($msg)
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
$objexcel = New-Object -ComObject excel.application
$objexcel.visible = $true
$fp = "f:\powershelltest\рассылка\adressbook.xlsx"
$wb = $objexcel.Workbooks.Open($fp)
$ws = $wb.activesheet
$cell = $ws.Cells
$b = 1
While ($a -match ".+@.+")
{
$b++
foreach ($i in $b)
{
$a = $cell.Item($b,1).text
Write-Host $a
}
}
вдогонкуПотому что перед входом в цикл ты проверяешь содержимое переменной $a на соответствие шаблону, однако к этому моменту переменная $a еще не инициализированна, в результате проверка вернет $false и цикл не выполнится.
почему вот этот код отрабатывается только и исключительно 1 раз (использую PowerGUI)
Код: [Выделить]
$objexcel = New-Object -ComObject excel.application
$objexcel.visible = $true
$fp = "f:\powershelltest\рассылка\adressbook.xlsx"
$wb = $objexcel.Workbooks.Open($fp)
$ws = $wb.activesheet
$cell = $ws.Cells
$b = 1
While ($a -match ".+@.+")
{
$b++
foreach ($i in $b)
{
$a = $cell.Item($b,1).text
Write-Host $a
}
}
всё, ничего не понимаю