保存時に実行したければ、"files.trimTrailingWhitespace": true です。自動保存にすると、ソース変更すれば実行されます。
#VSCode#ショートカット
— コンピュータの専門学校 R101(開発担当) (@iseifu) December 28, 2022
行末のスペースを消去する
CTRL + K の後、K を離して X を押す pic.twitter.com/sl2duS8Hom
|
【Microsoftの最新記事】
|
保存時に実行したければ、"files.trimTrailingWhitespace": true です。自動保存にすると、ソース変更すれば実行されます。
#VSCode#ショートカット
— コンピュータの専門学校 R101(開発担当) (@iseifu) December 28, 2022
行末のスペースを消去する
CTRL + K の後、K を離して X を押す pic.twitter.com/sl2duS8Hom
|
▼ VBScript
▼ JScript
コマンドプロンプトから、以下のようにしてテストしています
cscript mail.vbs
cscript mail.js
ssl を使用( ポート 465 )するので、smtpusessl が true になっています。
mail.vbs
' *********************************************************** ' 使用するパラメータ ' *********************************************************** strFrom = "わたしです <ロリポップメールアドレス>" strTo = "あなたです <送り先メールアドレス>" strServer = "smtp.lolipop.jp" nPort = 465 strUser = "ロリポップメールアドレス" strPass = "パスワード" ' *********************************************************** ' オブジェクト ' *********************************************************** Set Cdo = WScript.CreateObject("CDO.Message") ' *********************************************************** ' 自分のアドレスと宛先 ' *********************************************************** Cdo.From = strFrom Cdo.To = strTo ' *********************************************************** ' 件名と本文 ' *********************************************************** Cdo.Subject = "件名の文字列 / " & Now() Cdo.Textbody = "テキスト本文" & vbCrLf & "改行は vbCrLf" ' *********************************************************** ' CC BCC HTMLメール( CC BCC はどちらか片方 ) ' ※ 両方指定すると CC ' *********************************************************** Cdo.Cc = "メールアドレス1,メールアドレス2" 'Cdo.Bcc = "メールアドレス3,メールアドレス4" Cdo.Htmlbody = "<img src=""https://winofsql.jp/image/winofsql.png"">" ' *********************************************************** ' ファイル添付あり ' *********************************************************** Cdo.AddAttachment( "C:\Users\sworc\Pictures\0152-ac.jpg" ) Cdo.AddAttachment( "C:\Users\sworc\Pictures\ai\2022-08-24-1.png" ) ' *********************************************************** ' 設定 ' *********************************************************** Cdo.Configuration.Fields.Item _ ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 Cdo.Configuration.Fields.Item _ ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = strServer Cdo.Configuration.Fields.Item _ ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = nPort Cdo.Configuration.Fields.Item _ ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = true Cdo.Configuration.Fields.Item _ ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1 Cdo.Configuration.Fields.Item _ ("http://schemas.microsoft.com/cdo/configuration/sendusername") = strUser Cdo.Configuration.Fields.Item _ ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = strPass ' *********************************************************** ' 設定の反映 ' *********************************************************** Cdo.Configuration.Fields.Update ' *********************************************************** ' 送信 ' *********************************************************** on error resume next Cdo.Send if Err.Number <> 0 then strMessage = Err.Description else strMessage = "送信が完了しました" end if on error goto 0 Wscript.Echo strMessage
mail.js
// *********************************************************** // 使用するパラメータ // *********************************************************** var strFrom = "わたしです <ロリポップメールアドレス>"; var strTo = "あなたです <送り先メールアドレス>"; var strServer = "smtp.lolipop.jp"; var nPort = 465; var strUser = "ロリポップメールアドレス"; var strPass = "パスワード"; // *********************************************************** // オブジェクト // *********************************************************** var Cdo = WScript.CreateObject("CDO.Message") // *********************************************************** // 自分のアドレスと宛先 // *********************************************************** Cdo.From = strFrom Cdo.To = strTo // *********************************************************** // 件名と本文 // *********************************************************** Cdo.Subject = "件名の文字列 / " + new Date(); Cdo.Textbody = "テキスト本文\r\n改行は \\r\\n"; // *********************************************************** // CC BCC HTMLメール( CC BCC はどちらか片方 ) // ※ 両方指定すると CC // *********************************************************** Cdo.Cc = "メールアドレス1,メールアドレス2" //Cdo.Bcc = "メールアドレス3,メールアドレス4" Cdo.Htmlbody = "<img src=\"http://winofsql.jp/image/winofsql.png\">" // *********************************************************** // ファイル添付あり // *********************************************************** Cdo.AddAttachment( "C:\\Users\\sworc\\Pictures\\0152-ac.jpg" ) Cdo.AddAttachment( "C:\\Users\\sworc\\Pictures\\ai\\2022-08-24-1.png" ) // *********************************************************** // 設定 // *********************************************************** Cdo.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 Cdo.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = strServer Cdo.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = nPort Cdo.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = true Cdo.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1 Cdo.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = strUser Cdo.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = strPass // *********************************************************** // 設定の反映 // *********************************************************** Cdo.Configuration.Fields.Update() // *********************************************************** // 送信 // *********************************************************** var strMessage try { Cdo.Send() strMessage = "送信が完了しました" } catch ( error ) { strMessage = error.message; } WScript.Echo( strMessage );
UrlEncode をキャラクタセットを指定して送れるようになっています。受信データは、Content-Type でキャラクタセットが指定されておれば、自動的に変換されています。
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Net.Http.Headers; using System.Text; using System.Threading.Tasks; namespace winofsql { class Tool { // 戻される文字列は、サーバー側で Content-Type に Charset が // 指定されておれば自動変換されます // ********************************************* // UTF-8 POST // ********************************************* public static async Task<string> Post(string url, Dictionary<string, string> param) { string result = ""; try { HttpClient httpClient = new HttpClient(); httpClient.MaxResponseContentBufferSize = int.MaxValue; HttpContent content = new FormUrlEncodedContent(param); var response = await httpClient.PostAsync(url, content); String text = await response.Content.ReadAsStringAsync(); result = text; } catch (Exception Err) { result = "ERROR: " + Err.Message; } return result; } // ********************************************* // エンコード指定 POST // ********************************************* public static async Task<string> Post(string url, string encoding, Dictionary<string, string> param) { string result = ""; string query_string = ""; byte[] data1 = null; byte[] data2 = null; string data3 = null; foreach (KeyValuePair<string, string> kvp in param) { if (query_string == "") { query_string += ""; } else { query_string += "&"; } data1 = Encoding.GetEncoding(encoding).GetBytes(kvp.Value); data2 = WebUtility.UrlEncodeToBytes(data1, 0, data1.Length); data3 = Encoding.GetEncoding(encoding).GetString(data2, 0, data2.Length); query_string += kvp.Key + "=" + data3; } try { HttpClient httpClient = new HttpClient(); HttpContent content = new StringContent(query_string); content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded"); var response = await httpClient.PostAsync(url, content); String text = await response.Content.ReadAsStringAsync(); result = text; } catch (Exception Err) { result = "ERROR: " + Err.Message; } return result; } // ********************************************* // URL のみ呼び出し GET // ********************************************* public static async Task<string> Get(string url) { string result = ""; HttpClient httpClient = new HttpClient(); HttpResponseMessage response = null; try { response = await httpClient.GetAsync(url); } catch (Exception Err) { result = "ERROR: " + Err.Message; } // 接続に失敗 if (response == null) { return result; } try { response.EnsureSuccessStatusCode(); } catch (Exception Err) { result = "ERROR: " + Err.Message; } // HTTP 応答の失敗 if (!response.IsSuccessStatusCode) { return result; } // 内容を文字列として取得 try { String text = await response.Content.ReadAsStringAsync(); result = text; } catch (Exception Err) { result = "ERROR: " + Err.Message; } return result; } // ********************************************* // データ呼び出し( UTF-8 ) GET // ********************************************* public static async Task<string> Get(string url, Dictionary<string, string> param) { string query_string = ""; foreach (KeyValuePair<string, string> kvp in param) { if (query_string == "") { query_string += "?"; } else { query_string += "&"; } query_string += kvp.Key + "=" + WebUtility.UrlEncode(kvp.Value); } return await Get(url + query_string); } // ********************************************* // データ呼び出し( エンコード指定 ) GET // ********************************************* public static async Task<string> Get(string url, string encoding, Dictionary<string, string> param) { string query_string = ""; byte[] data1 = null; byte[] data2 = null; string data3 = null; foreach (KeyValuePair<string, string> kvp in param) { if (query_string == "") { query_string += "?"; } else { query_string += "&"; } data1 = Encoding.GetEncoding(encoding).GetBytes(kvp.Value); data2 = WebUtility.UrlEncodeToBytes(data1, 0, data1.Length); data3 = Encoding.GetEncoding(encoding).GetString(data2, 0, data2.Length); query_string += kvp.Key + "=" + data3; } return await Get(url + query_string); } } }
呼び出し
string result = await winofsql.Tool.Post( "http://localhost/lightbox/sample/test.php", "shift_jis", new Dictionary<string, string>() { { "field1", "日本語" }, { "field2", "表示" } }); if (result.PadRight(5).Substring(0, 5) == "ERROR") { Debug.WriteLine(result); }
関連する記事 Framework4(C#) : WebClient で Post と Get する汎用 static クラス Framework4(C#) : Windows Phone OS 7.1 : WebClient で Post と Get する汎用 static クラス Android で Post と Get
置き換え
type con > a.txt
追加( Append )
type con >> a.txt
終了時は 改行入力後、CTRL+Z を入力してEnter ですtype nul > ファイル名で、ファイルを空で初期化できます。
✅ Microsoft ドキュメント コマンド リダイレクト演算子を使用する ⭐ 単純な リダイレクト は > です。 コマンドプロンプトに表示されるはずの文字列をファイルに書き込みます。 ⭐ >> を使うと追加書き込みです。このような記号は、リダイレクト演算子と呼ばれます。
STDIN | 0 | キーボード入力 |
STDOUT | 1 | 標準出力 |
STDERR | 2 | Error output to the Command Prompt window |
0、1、2 は ハンドル番号で、既存のハンドルへのリダイレクトを指定するには、アンパサンド(&)文字の後にリダイレクトしたいハンドル番号を使用します。 なので、2>&1 は 標準エラー出力を標準出力にリダイレクトする事を意味します。▼ 解りやすいテストはエラーだけに着目して、以下のように実行します。
C:\temp>dir x ドライブ C のボリューム ラベルは Windows10 です ボリューム シリアル番号は 40B9-7D17 です C:\temp のディレクトリ ファイルが見つかりません( x が存在しないので『ファイルが見つかりません』と言うエラーメッセージが出ます ) この『ファイルが見つかりません』は、dir x > message.txt としても message.txt には書き込まれまれずに、コマンドプロンプトに表示されます。しかし、以下のようにすれば全て書き込む事ができます。
dir x > message.txt 2>&1この方法は解りにくいですが、標準出力と標準エラー出力を同時にリダイレクトしたいときに意味があります。dir x 2> message.txtだと、ファイルが見つかりません だけが書き込まれてしまいます。キーボード入力をファイル化
リダイレクト演算子を使用して、キーボードから入力した文字列をテキストファイルに書き込む事ができます。type con > message.txttype コマンドは、ファイルの内容をコマンドプロンプトに表示するコマンドですが、con と言う特殊な予約文字列を使用すると、キーボードをファイルとみなした動作を行います。 ※ 終了時は 改行入力後、CTRL+Z を入力してEnter です空のファイルを作成する
nul と言う予約文字列を使用して以下のように実行しますtype nul > message.txt実行結果を表示しない
nul は存在しないファイルのようなものなので、標準結果への出力を無かった事にできますdir *.* > nul
以下は、ファイル名を指定して実行からの起動ですが、コマンドプロンプトを表示したままで保持し、必要がなくなればすぐ閉じる事ができます (もちろんコマンドプロンプトからの実行でもかまいませんが、その場合は pause は必要無いです) /c は、/c の後の文字列を新しい cmd.exe で実行した後、cmd.exe を終了するという意味なので、dir を実行した後、pause で一時停止して入力待ちとなり、何かキーを押せば cmd.exe が終了します。最後に pause を使う方法は、コンソールに出力された結果を画面で確認できるようにする為に用いられます。
cmd /c dir & pause
& による一行の複数実行は、複数のアプリケーション(バッチファイル内の行単位の処理)をプログラムから呼び出したい(call コマンドを使用)場合で、外部にバッチファイルを作りたくない場合に使用します。
次のサンプルは、ユーザフォルダの dir の結果をテキストファイルにリダイレクトして dir の結果をメモ帳で開きます。
notepad の起動に start を使用しているので、元の cmd.exe は終了して結果の dir.log を表示したメモ帳のみが Windows 上に残ります( start が無いと、cmd.exe が notepad.exe の終了を待ちます )
cmd /c cd %HOMEPATH% & dir > c:\temp\dir.log & start notepad c:\temp\dir.log
ダウンロードしたファイルをエクスプローラから実行する場合は、『許可する』にチェックして『適用』して下さい。
例えば、C:\Program Files\Common Files へ移動したい場合、他に一致するディレクトリがなければ、以下のタイプで移動可能です。cd \pr*\c*
環境変数にディレクトリがセットされている場合は、cd %temp%
のように使用してそのディレクトリへ移動出来ます。 通常、コマンドプロンプトを実行すると、最初のディレクトリはユーザディレクトリになります。その下には、デスクトップやピクチャなど特別なものがたくさんあるので、以下のように移動可能です。C:\Users\lightbox>cd *top C:\Users\lightbox\Desktop>cd ..\p* C:\Users\lightbox\Pictures>
SHIFT + ALT のショートカットはどちらかといえば『特殊なもの』という印象があるので、ショートカットそのものと、各 settings.json を直接開くようにしています。
S : Settings
W : Workspace
D : Directory
K : Keybord Shortcut
SHIFT + ALT + S でユーザの設定を開いて、先頭の SHIFT_JIS の設定の - ( ハイフン ) を一時的に削除してとにかく SHIFT_JIS で表示してしまう設定にします( 終わったら元に戻す )
言語別に SHIFT_JIS を強制するのは以下のようにしていますが、csv を言語化するには csv をそのように登録してくれる拡張をインスト−ルします。( コマンドパレットから changeLanguageMode でいまある言語の確認 )
"[csv]": { "files.encoding": "shiftjis" }, "[vbs]": { "files.encoding": "shiftjis", "editor.insertSpaces": true }, "[bat]": { "files.encoding": "shiftjis" }, "[powershell]": { "files.encoding": "shiftjis" },
言語で定義したら、拡張子への対応は以下のようにして行っています。
"files.associations": { "*.mnu": "csv", "*.ujis": "perl", "*.932": "csv", "*.jsp": "java", "*.htm": "html", "*.hta": "html", "*.xlsx": "excel" },
GitHub ※コマンドプロンプトの操作 Q : 終了します。 スペースキー : 次ページを表示します。 Enterキー : 次の行を表示します dump.vbs
if WScript.Arguments.Count = 1 then strMessage = "送るから実行して下さい" & vbCrLf & vbCrLf strMessage = strMessage & "※ リンク先の最後の数字はコマンドプロンプトの行数です " & vbCrLf strMessage = strMessage & "※ プロパティよりウインドウを最大化する方法もあります " & vbCrLf Call MsgBox(strMessage,0,"lightbox") Wscript.Quit end if Set WshShell = CreateObject( "WScript.Shell" ) Set Fso = CreateObject( "Scripting.FileSystemObject" ) strCurPath = WScript.ScriptFullName Set obj = Fso.GetFile( strCurPath ) Set obj = obj.ParentFolder strCurPath = obj.Path strCommand = "cmd /k mode CON lines="&WScript.Arguments(0)&" & cscript.exe """ & _ strCurPath & "\dump_c.vbs"" """ & WScript.Arguments(1) & """ | more & pause" Call WshShell.Run( strCommand )
dump_c.vbs
' **************************************************** ' ファイルを16進数でダンプします ' **************************************************** Dim Fs,Stream Dim InFile Dim Kana Dim KjFlg Kana = Array( _ "。","「","」","、","・","ヲ","ァ","ィ","ゥ","ェ","ォ","ャ","ュ","ョ","ッ", _ "ー","ア","イ","ウ","エ","オ","カ","キ","ク","ケ","コ","サ","シ","ス","セ","ソ", _ "タ","チ","ツ","テ","ト","ナ","ニ","ヌ","ネ","ノ","ハ","ヒ","フ","ヘ","ホ","マ", _ "ミ","ム","メ","モ","ヤ","ユ","ヨ","ラ","リ","ル","レ","ロ","ワ","ン","゙","゚" ) Set Fs = CreateObject( "Scripting.FileSystemObject" ) Set Stream = CreateObject("ADODB.Stream") InFile = WScript.Arguments(0) Dim LineBuffer,DispBuffer,CWork,nCnt,strBuff,i,j if not Fs.FileExists( InFile ) then Wscript.Echo "ファイルが存在しません" Wscript.Quit end if ' ------------------------------------------------------ ' Stream のオープン Stream.Open ' ------------------------------------------------------ ' Stream タイプの指定 Stream.Type = 1 ' StreamTypeEnum の adTypeBinary ' ------------------------------------------------------ ' 既存ファイルの内容を Stream に読み込む Stream.LoadFromFile InFile ' ------------------------------------------------------ ' バイナリ型の Stream オブジェクトからを読み取って加工 Bcnt = 0 nCnt = 0 KjFlg = "" Do while not Stream.EOS if ( nCnt MOD 16 ) = 0 then Wscript.Echo " 0 1 2 3 4 5 6 7" _ & " 8 9 A B C D E F" Wscript.Echo "--------------------------------" _ & "------------------------------------------" end if ' 16 バイトの読込 LineBuffer = Stream.Read(16) strBuff = "" For i = 1 to LenB( LineBuffer ) CWork = MidB(LineBuffer,i,1) Cwork = AscB(Cwork) Cwork = Hex(Cwork) Cwork = Ucase(Cwork) Cwork = Right( "0" & Cwork, 2 ) DispBuffer = DispBuffer & Cwork & " " strBuff = strBuff & CharConv( Cwork ) Next Wscript.Echo _ Right( _ "00000000" & Ucase(Hex( nCnt * 16 )), 8 _ ) & " " & _ Left(DispBuffer & String(49," "), 49 ) & strBuff DispBuffer = "" nCnt = nCnt + 1 Loop ' ------------------------------------------------------ ' Stream を閉じる Stream.Close Set Stream = Nothing Stream = Empty Set Fs = Nothing Fs = Empty ' **************************************************** ' 生データのテキスト ' **************************************************** function CharConv( HexCode ) Dim nCode nCode = Cint( "&H" & HexCode ) if KjFlg = "" then if &H81 <= nCode and nCode <= &H84 or _ &H88 <= nCode and nCode <= &H9f or _ &HE0 <= nCode and nCode <= &HEA then KjFlg = HexCode CharConv = "" Exit Function end if else if HexCode <> "00" then KjFlg = KjFlg & HexCode CharConv = Chr( Cint( "&H" & KjFlg ) ) else CharConv = ".." end if KjFlg = "" Exit Function end if if 0 <= nCode and nCode <= &H1F then CharConv = "." end if if &H20 <= nCode and nCode <= &H7E then CharConv = Chr(nCode) end if if &H7F <= nCode and nCode <= &HA0 then CharConv = "." end if if &HA1 <= nCode and nCode <= &HDF then CharConv = Kana(nCode-&HA1) end if if &HE0 <= nCode and nCode <= &HFF then CharConv = "." end if end function
エクスプローラで SendTo フォルダに移動するには、アドレスバーに sendto と直接入力します。
スプレッドシートに出力します
Logger.log がとても使いやすくなりましたが、あくまでデバッグ目的になるのでスプレッドシートに結果を残します。実行前に出力する列単位のクリアを行っていますが、マクロで取得したコードです。Drive API サービスの設定
GAS からは、V2 の利用となるので注意が必要です。V3 ではパラメータが違います。マイドライブのルートフォルダのソート
そのままではソートされないので、一旦配列へセットしてソートしてから出力しています
function listDrive() { // ************************************************** // 選択したシートを対象とします // ************************************************** var spreadsheet = SpreadsheetApp.getActive(); // ************************************************** // 列クリア // ************************************************** spreadsheet.getRange('A:E').activate(); spreadsheet.getActiveRangeList().clear({contentsOnly: true, commentsOnly: true, skipFilteredRows: true}); // ************************************************** // ドライブ一覧 (100件まで:それ以上は nextPageToken を使う) // Drive API v2 // ************************************************** var response = Drive.Drives.list({"maxResults":100}); var drives = response.items; var targetRange; for (i = 0; i < drives.length; i++) { Logger.log('%s (%s)', drives[i].name, drives[i].id); targetRange = spreadsheet.getRange('A' + (i+1)); targetRange.setValue(drives[i].name); targetRange = spreadsheet.getRange('B' + (i+1)); targetRange.setValue(drives[i].id); } // ************************************************** // マイドライブルート内のフォルダの一覧 (Drive API は必要ない) // ************************************************** var folders = DriveApp.getRootFolder().getFolders(); var a = new Array(); while (folders.hasNext()) { var folder = folders.next(); Logger.log(folder.getName()); a.push(folder.getName()); } a.sort() for (i = 0; i < a.length; i++) { targetRange = spreadsheet.getRange('E' + (i+1)); targetRange.setValue(a[i]); } }
GitHub
ドキュメントでは、REST API なので、UrlFetchApp クラスを使うのか? とか思ってしまいますが、そもそも それだと auth が必要なのでまだ試してしません。 で、そんな事をしなくてもそれぞれの REST の クラスのメソッドに引数を渡す形で実行できます。 但し、Classroom Service が拡張なので、スクリプトエディタのサービスの追加より API を実行可能にしておく必要があります。 以下のサンプルでは、Classroom の一覧取得後に目的の id を確認して固定で投稿しています。
function myFunction() { // ************************************************** // Classroom 一覧 // ************************************************** var response = Classroom.Courses.list(); var courses = response.courses; for (i = 0; i < courses.length; i++) { Logger.log('%s (%s)', courses[i].name, courses[i].id); } // ************************************************** // POST する JSON // ************************************************** var target = "35126354603"; var data = { "courseId" : target, "materials": [ { "link": { "url": "https://news.google.com/?hl=ja&tab=rn1&gl=JP&ceid=JP:ja", "title": "Google ニュース", "thumbnailUrl": "" } } ], "text": "Google Apps Script による Classroom への投稿", "assigneeMode": "ALL_STUDENTS", "state": "PUBLISHED" }; Classroom.Courses.Announcements.create(data, target); }
Logger.log の代わりに Gmail で自分のアドレスに送信したほうが良い場合もあります。
// The code below will send an email with the current date and time. var now = new Date(); GmailApp.sendEmail("mike@example.com", "current time", "The time is: " + now.toString());
関連する記事 Google Classroom のテーマ画像のサイズと既存画像をテーマ画像として使用してみた手順 courses.announcements.create リファレンス