2017-11-12 29 views
0

Powershellスクリプトをコマンドラインから実行すると失敗しますが、行ごとにコピーしPowershellコンソールで実行するとうまく動作します。Powershellのps1ファイルは失敗しますがコードは正常です

powershell -ExecutionPolicy Bypass -File "F:\email.ps1" -FFFeatureOff 

利回り:Fで

:\ email.ps1:16文字:126 + ... ential( "ユーザ名"、 "パスワード"); + ~~~文字列はターミネータが欠落しています。」Fで

:\ email.ps1:9文字:1 +文ブロックまたは型定義で{ +〜欠落閉じる '}'

その本当に奇妙な、私はPowerShellのウィンドウを開き、中にスクリプトを貼り付け、それは動作しますが、PS1ファイルを実行している場合、私はエラーを取得し、でもエディタで、私は同じ問題

全スクリプトを取得:

$EmailTo = "xxxxx" 
$EmailFrom = "xxxxxx" 
$Subject = "LicenceKey & Instructions" 
$Body = "This is an automated email" 
$SMTPServer = "smtp.gmail.com" 
$SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$EmailTo,$Subject,$Body) 
$files=Get-ChildItem "C:\Users\alber\Desktop\LicenceKey\newuser" 
Foreach($file in $files) 
{ 
    Write-Host “Attaching File :- ” $file 
    $attachment = New-Object System.Net.Mail.Attachment –ArgumentList "C:\Users\alber\Desktop\LicenceKey\newuser\$file" 
    $SMTPMessage.Attachments.Add($attachment) 
} 
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587) 
$SMTPClient.EnableSsl = $true 
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("username", "password"); 
$SMTPClient.Send($SMTPMessage) 
+0

'の取り付けFile'に沿ってあなたが異なる持っているように見えるので、これは、[この](https://stackoverflow.com/questions/20706869/powershell-is-missing-the-terminator)の重複であるかもしれません引用符。他の可能性は、たとえばパスワードに二重引用符が含まれていることです。それらは ' – JustMe

+1

を使ってエスケープする必要があります。他のほとんどの言語とは異なり、Powershellはスマート引用符で' '' 'できます。個人的に私はそれらを使用しませんが、それはPSの前の日からの習慣です。 –

+0

あなたが投稿したスクリプトはあなたの症状を説明していません。脇に:コマンドレットを呼び出すときにメソッドの構文を避ける方が良い。例えば、New-Object System.Net.NetworkCredential( "username"、 "password")の代わりに 'New-Object System.Net.NetworkCredential -ArgumentList" username "、" password "'を呼び出す。 – mklement0

答えて

2

James C.'s answerはOPに受け入れられたという事実は、それが一般的に役立つが、非特定のためのOPの感謝によって動機づけられたことを示唆しています。

残念ながら、それは将来の読者に一般的な関心の答えとして下回ると混乱を引き起こす可能性です。それはあからさまに間違った主張が含まれ

  • :これを書いているよう

をここでの問題は、引用符がそれを修正する移動、$ファイルは、メッセージのためのparamの外にあるということです。Write-Host “Attaching File :- $file”書き込みホストは、単にスペースで複数の引数を連結しているため

しかし、は、Write-Host “Attaching File :- ” $fileとは問題ありません - 厳密な単一の引数が必要です。
は( - 下記を参照に述べたように、PowerShellは、それらが適切に
をコード化していると仮定し、「スマート引用符」(非ASCII引用符)を認識する)。

  • 掲示ように、それははOPの症状を説明していません。

  • それはほとんどそれがリテラル"埋め込むことができなかったかのように聞こえる - そのことについて、または$を - もちろん、」にISN、PowerShellの制限によるもの、二重引用符で囲まれた文字列に本当ですか?バックチックでエスケープすることはすべて必要です:"Pa`$`$`"w0rd"。実際の答えに


代わりに、PetSerAlの質問上の有益なコメントは、おそらくポイント:

  • ことを考えると文字エンコーディング問題、あるかもしれません誤ってエンコードされたスクリプトファイルの表面に現れる「スマート引用符」(非ASCII引用符文字)が使用されています。 PetSerAlのanswer here

  • はUTF-8でエンコードされたスクリプトの内容は、PowerShellはエンコーディングを認識するためにはBOMでファイルに保存されなければならないことを示唆しています。

  • 更新は:PetSerAlは ":
    –ArgumentList、不適切にデコードし、:実際のトラブルはここのEN DASHである。[Text.Encoding]::GetEncoding(1250).GetString([Text.Encoding]‌​::UTF8.GetBytes('–')‌​)、利回り–、不対の二重引用符" という推測し

+1

すべての情報をお寄せいただきありがとうございます。私はその問題を発見した。それは問題を引き起こしていた私のパスワードのものだった。私はそれを変更し、今それは動作しない、私はそれを逃したと信じていない。また、このすべてが、私が持っていた別の質問を見て答えを見つけました。参考:Bodyの複数行の場合、$ mail.BodyFormat = MailFormat.Html次に$ Body = @ "で終わり、" @ –

1

F:\ email.ps1:9 char:1 + {+〜ステートメントブロックまたは型定義内の '}'を閉じることができません。

Write-Host “Attaching File :- $file” 

(スマートPowerShellのに受け入れられ“ ”を引用

が、他のほとんどのではありません。

ここでの問題$fileは、メッセージのPARAMの外にあるということですが、引用符を移動すると、その問題を解決します言語は、私は個人的に確認するためにそれらを避けるため)Fで


:\ email.ps1:16文字:126 + ... ential( "ユーザ名"、 "パスワード"); + ~~~文字列はターミネータが欠落している:」

あなたがここに使用している二重引用符:("username", "password")は、それが特定の特殊文字が含まれている場合、パスワードが終わるところPowerShellが間違って解釈する可能性があります

。例えばなぜなら内に二重引用符のスクリプトで使用された場合、パスワードPa$$"w0rdは、問題が発生します。

これは、単一のquoteationマークが含まれていると正しくように終了されていない(残り残りw0rd""Pa$$"と解釈されます文字列) は、彼らが評価されていないと、リテラルとして解釈され、これはあなたの代わりに単一引用符を使用することができないようにするには:

$SMTPClient.Credentials = New-Object System.Net.NetworkCredential('username', 'password') 

は、単一引用符と二重引用符に関する詳しい情報は、およそabout_quoting_rulesを参照してください。そして最終的に混乱を招く可能性 - - それに含まれるポインタ

関連する問題