質問: メール情報を公開せずにbatファイルを使用してメールアドレスにファイルを送信しますか? batファイルを介してファイルをgmailアカウントに送信し、そのbatファイル内のメール情報を暗号化して、誰かがbatファイルを開いたときにメール情報を取得できないようにしたいと考えています。ロジック:など インターネットが正しく機能しているかどうかを確認します よろしければファイルを送信してからbatファイルを削除してください インターネットが正しく機能しているかどうかを確認します 後で実行するようにスケジュールしないか、スタートアップに追加する場合 完了したら、スケジュールまたはスタートアップから削除してください!
回答: powershellスクリプトを作成して電子メールを送信するロジックを使用して、添付ファイルを含めて電子メールを送信する必要がある場合は、を使用して電子メールを実行できます。機密性の高い値をスクリプトロジックにハードコーディングするのではなく、機密性の高い値を引数として渡すバッチスクリプト。powershellスクリプトロジックは、gmailのローカルメールボックスのユーザー名、メールを送信するために認証するパスワードなどの引数を受け入れることができます。それ以外の場合は、スクリプトにハードコーディングする必要はありません。 powershell args スクリプトまたは関数内では、$ args配列を使用して名前のない引数を参照できます。たとえば、すべての引数をコマンドレットに渡します。特定の引数をその位置で参照することもできます。 "最初の引数は" + $args[0] "です "2番目の引数は" + $args[1] "です また、ロジックをバッチスクリプトに配置して、実行時に機密値を渡すことができる引数を含めることもできます。機密値をハードコーディングするのではなく、引数のプレースホルダーを使用します。 バッチ引数 %を使用して引数の値を取得し、その後にコマンドラインでの数値位置を取得できます。最初に渡される項目は常に%1で、2番目の項目は常に%2です。 バッチスクリプト内の%*はすべての引数を参照します(例:%1 %2 %3 %4 %5 ...%255)%1から%9までの引数のみが番号で参照できます。 このようにして、スクリプトを開いた場合、保護する必要のある機密値は、スクリプトロジックに公開またはハードコードされず、だれでもスクリプトへの読み取りアクセス権を持つユーザーを確認できます。重要な注意:各powershellスクリプトの例の名前の下部にセクションがありますbatch execute script実行するバッチスクリプトから使用するロジック、またはバッチスクリプトへの適切な引数としてユーザー名、パスワード、添付ファイルのフルパスを渡すために使用するロジックがあります ie sendemail.bat "<gmailaccountname>" "<gmailpassword>" "<fullpathattachment>"powershellスクリプト(添付ファイルなし)$username = $args[0] $emailpassword = $args[1] $username = $username $emailto = "emailaddress@domain.com" $emailfrom = "noreply@whatever.notify" $subject = "email subject" $body = "email body" $smtpserver = "smtp.gmail.com" $smtpmessage = new-object system.net.mail.mailmessage($emailfrom, $emailto, $subject, $body) $smtpclient = new-object net.mail.smtpclient($smtpserver, 587) $smtpclient.enablessl = $true $smtpclient.credentials = new-object system.net.networkcredential($username, $emailpassword); $smtpclient.send($smtpmessage) バッチ実行スクリプト set gmailaccount=%~1 set gmailpassword=%~2 set powershelldir=c:\windows\system32\windowspowershell\v1.0 cd /d "%powershelldir%" powershell -executionpolicy bypass -command "& 'c:\scripts\sendemail.ps1' '%gmailaccount%' '%gmailpassword%'" powershellスクリプト(添付ファイル付き)$username = $args[0] $emailpassword = $args[1] $attachment = $args[2] $username = $username $emailto = "emailaddress@domain.com" $emailfrom = "noreply@whatever.notify" $subject = "email subject" $body = "email body" $smtpserver = "smtp.gmail.com" $smtpmessage = new-object system.net.mail.mailmessage($emailfrom, $emailto, $subject, $body) $attachment = new-object system.net.mail.attachment($attachment) $smtpmessage.attachments.add($attachment) $smtpclient = new-object net.mail.smtpclient($smtpserver, 587) $smtpclient.enablessl = $true $smtpclient.credentials = new-object system.net.networkcredential($username, $emailpassword); $smtpclient.send($smtpmessage) バッチ実行スクリプト set gmailaccount=%~1 set gmailpassword=%~2 set attachment=%~3 set powershelldir=c:\windows\system32\windowspowershell\v1.0 cd /d "%powershelldir%" powershell -executionpolicy bypass -command "& 'c:\scripts\sendemail.ps1' '%gmailaccount%' '%gmailpassword%' '%attachment%'" バッチスクリプト(動的)gmailアカウントのユーザー名、gmailアカウントのパスワード、および添付ファイルへの完全なパスを渡すだけのオールインワンの動的バッチスクリプトを次に示します。@echo off set gmailaccount=%~1 set gmailpassword=%~2 set attachment=%~3 call :powershell cd /d "%powershelldir%" powershell -executionpolicy bypass -command "& '%psscript%' '%gmailaccount%' '%gmailpassword%' '%attachment%'" exit :powershell set powershelldir=c:\windows\system32\windowspowershell\v1.0 set psscript=%temp%\~tmpsendemail.ps1 if exist "%psscript%" del /q /f "%psscript%" echo $username = $args[0]>> "%psscript%" echo $emailpassword = $args[1]>> "%psscript%" echo $attachment = $args[2]>> "%psscript%" echo >> "%psscript%" echo $username = $username >> "%psscript%" echo $emailto = "emailaddress@domain.com" >> "%psscript%" echo $emailfrom = "noreply@whatever.notify" >> "%psscript%" echo $subject = "email subject" >> "%psscript%" echo $body = "email body" >> "%psscript%" echo $smtpserver = "smtp.gmail.com" >> "%psscript%" echo $smtpmessage = new-object system.net.mail.mailmessage($emailfrom, $emailto, $subject, $body) >> "%psscript%" echo $attachment = new-object system.net.mail.attachment($attachment) >> "%psscript%" echo $smtpmessage.attachments.add($attachment) >> "%psscript%" echo $smtpclient = new-object net.mail.smtpclient($smtpserver, 587) >> "%psscript%" echo $smtpclient.enablessl = $true >> "%psscript%" echo $smtpclient.credentials = new-object system.net.networkcredential($username, $emailpassword) >> "%psscript%" echo $smtpclient.send($smtpmessage) >> "%psscript%" goto :eof このようにバッチスクリプトを実行します。 。 。 sendemail.bat "<gmailaccountname>" "<gmailpassword>" "<fullpathattachment>" バッチスクリプト(静的および自動削除)このスクリプトでは、gmailaccount=、gmailpassword=、attachment=の変数にハードコードされた値が設定されますが、実行されると、"%~fn0"を介してスクリプトが完全に削除されます。0はスクリプト自体です。つまり、このスクリプトを確実にコピーしてから、この情報を公開したくない場所で実行するマシンからのみコピーを実行する必要があります。@echo off set gmailaccount=<gmailaccountname> set gmailpassword=<gmailpassword> set attachment=<fullattachmentpath> call :powershell cd /d "%powershelldir%" powershell -executionpolicy bypass -command "& '%psscript%' '%gmailaccount%' '%gmailpassword%' '%attachment%'" if exist "%~fn0" del /q /f "%~fn0" exit :powershell set powershelldir=c:\windows\system32\windowspowershell\v1.0 set psscript=%temp%\~tmpsendemail.ps1 if exist "%psscript%" del /q /f "%psscript%" echo $username = $args[0]>> "%psscript%" echo $emailpassword = $args[1]>> "%psscript%" echo $attachment = $args[2]>> "%psscript%" echo >> "%psscript%" echo $username = $username >> "%psscript%" echo $emailto = "emailaddress@domain.com" >> "%psscript%" echo $emailfrom = "noreply@whatever.notify" >> "%psscript%" echo $subject = "email subject" >> "%psscript%" echo $body = "email body" >> "%psscript%" echo $smtpserver = "smtp.gmail.com" >> "%psscript%" echo $smtpmessage = new-object system.net.mail.mailmessage($emailfrom, $emailto, $subject, $body) >> "%psscript%" echo $attachment = new-object system.net.mail.attachment($attachment) >> "%psscript%" echo $smtpmessage.attachments.add($attachment) >> "%psscript%" echo $smtpclient = new-object net.mail.smtpclient($smtpserver, 587) >> "%psscript%" echo $smtpclient.enablessl = $true >> "%psscript%" echo $smtpclient.credentials = new-object system.net.networkcredential($username, $emailpassword) >> "%psscript%" echo $smtpclient.send($smtpmessage) >> "%psscript%" goto :eof その他のリソース mailmessageコンストラクタ アタッチメントコンストラクタ smtpclientコンストラクタ smtpclient.enablesslプロパティ networkcredentialコンストラクタ smtpclient.sendメソッド 変数置換(for /?) さらに、for変数参照の置換が強化されました。これで、次のオプションの構文を使用できます。 %~i - expands %i removing any surrounding quotes (") %~ni - expands %i to a file name only %~fi - expands %i to a fully qualified path name