0

以下のスクリプトは Outlook のメールを読み取りますが、出力にアクセスするにはどうすればよいですか。私もPowershellは初めてで、まだ特定のことに慣れています。10 件の未読 Outlook メールの本文を取得し、$Body という配列に保存したいだけです。

$olFolderInbox = 6
$outlook = new-object -com outlook.application;
$ns = $outlook.GetNameSpace("MAPI");
$inbox = $ns.GetDefaultFolder($olFolderInbox)

#checks 10 newest messages
$inbox.items | select -first 10 | foreach {
if($_.unread -eq $True) {
$mBody = $_.body

#Splits the line before any previous replies are loaded
$mBodySplit = $mBody -split "From:"

#Assigns only the first message in the chain
$mBodyLeft = $mbodySplit[0]

#build a string using the –f operator
$q = "From: " + $_.SenderName + ("`n") + " Message: " + $mBodyLeft

#create the COM object and invoke the Speak() method 
(New-Object -ComObject SAPI.SPVoice).Speak($q) | Out-Null
} 
}
4

3 に答える 3

1

10 個の要素のみをループしているので、これはここでは要因ではないかもしれませんが、 += を使用して要素を配列に追加するのは非常に遅いです。

もう 1 つの方法は、ループ内の各要素を出力し、ループの結果を $body に割り当てることです。$_.body が必要であると仮定した場合の簡単な例を次に示します。

$body = $inbox.items | select -first 10 | foreach {
  if($_.unread -eq $True) {
    $_.body
  }
}

ループ中に出力されるものはすべて $body に割り当てられるため、これは機能します。+= を使用するよりもはるかに高速ですこれは自分で確認できます。10,000 要素の配列を作成する 2 つの方法を比較します。

Measure-Command {
  $arr = @()
  1..10000 | % { 
    $arr += $_ 
  }
}

私のシステムでは、これに 14 秒強かかります。

Measure-Command {
  $arr = 1..10000 | % { 
    $_
  }
}

私のシステムでは、これに 0.97 秒かかり、14 倍以上速くなります。繰り返しますが、10 個のアイテムをループするだけなら問題にはなりませんが、より大きな配列を作成する必要がある場合は注意が必要です。

于 2013-12-31T21:59:00.447 に答える
1

$body = @();ループの前に定義する

次に+=、要素を追加するために使用します

于 2013-12-31T20:06:06.153 に答える