1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

スケジューラ用のデータを作成するバッチです。(こんなニーズあるか?)

Last updated at Posted at 2023-11-20

スケジューラに翌営業日の終日予定を登録するためのバッチです。

こんなニーズあるかどうかわからないですが、Teamsの翌日の終日予定に、在宅勤務とか、出社とかを入れるのを補助するバッチです。
普通は、単にスケジューラに入れればよいので、ニーズなさそうですが、スケジューラに不慣れな人が居るので、「とにかく帰る前にこれをカチカチってして明日の予定を入れといて!」というために作りました。
なお、土曜は通常休みなので、金曜に起動すると月曜のスケジュールをセットするようになってます。

簡単なソースですが、重要な注意点が一つあります。

「.icsファイル」という、スケジューラが読み込むためのファイルを作成して、それを起動するだけのバッチなのですが、この「.icsファイル」というのは文字コードが「utf-8」でないと日本語が化けます。
そのため、このバッチファイルは、「utf-8」で保存してください。

バッチの文字コードを「shift-jis」で保存すると文字化けします。

また、utf-8でバッチを作る際は、rem の内容を""でくくるべしと教えていただきました。
ありがとうございました。

※デフォルトの予定を、パラメータでも、バッチファイル名でも好きな方で指定できるように機能追加しました。

明日の予定.bat
@echo off
rem chcp 932 >nul
chcp 65001 > nul
setlocal enabledelayedexpansion >nul
title [終日予定設定バッチ]

rem "このバッチはTeamsに登録するスケジュールを作成します。"
rem "TeamsはUTF-8Nのファイルで入力する必要があるので、バッチ自体をUTF-8で作成しています。"
rem "shift-JISで保存しないでください。"

rem "文字コードの影響で、remの一部がremとして認識されず、途中からコマンドと認識されてしまう現象が起きます。"
rem "utf-8でバッチを作る場合は、コメントをダブルコーテーションでくくるのがトラブルを避けるコツのようです。"

rem option1
rem "パラメータで、予定をセットすることが可能です。"

rem option2
rem "パラメータ指定は、ショートカットを作ったり、別バッチを作成する必要があるので、単体でも簡単に指定できるようにしました。"
rem "簡単にというのは、バッチの中身を変え無くても、バッチファイル名を変更するだけで指定可能という意味です。"
rem "単体での、予定指定は以下の通りです。"
rem "このバッチをコピーして、ファイル名の後ろに@を入れて、予定を書くと、それがデフォルトの予定になります。"
rem "例えば、ファイル名を 明日の予定@本社出社.batとすると、明日の予定が本社出社になります。"
rem "@は全角・半角いずれも反応します。バッチ簡素化のため、予定に@を入力することは出来ない仕様です。"

rem "option1とoption2同時に指定があった場合、option1を優先します。"
rem "また、option1,option2いずれも指定がない場合は、予定入力画面を表示します。"

rem option3
rem "あまり使わないかもしれませんが、パラメータでTODAYと入れると、当日の予定を入力できるようになっています。"
rem "option1と併用する場合は、パラメータを、TODAY 予定の順で書いてください。"
rem "option2とも併用可能です。"

:start
setlocal enabledelayedexpansion >nul
set ics_file=yotei.ics

rem "文字コードの関係で、誤動作防止のため、全角文字は一度ダブルコーテーションで囲みます。"
rem "選択肢を増やした場合は、74行目くらいにある(1,1,X)のXを増やしてください。"
set yotei_1_="在宅勤務"
set yotei_2_="本社出社"
set yotei_3_="終日有休"
set yotei_4_="AM有休"
set yotei_5_="PM有休"
set yotei_6_="不就労日"
set yotei_7_=
set yotei_8_=
set yotei_9_=

rem "パラメータで、本日か明日かの指定を可能にする"
rem "デフォルトは、明日(翌営業日)とする"
set scd_date=TOMORROW
if /i "%1"=="TODAY" (
  set scd_date=TODAY
  shift
)
if /i "%1"=="TOMORROW" (
  set scd_date=TOMORROW
  shift
)

echo スケジュール作成をします。
echo.

for /f "tokens=2 delims=@@" %%m in ("%~n0") do set yotei=%%m
if not "%1"=="" set yotei=%1
if not "%yotei%"=="" goto :yotei_set

rem "予定指定がない場合は、入力画面を表示します。"
rem "白黒は色気が無いので、ちょっと色を変えてみました。"
color e8

rem "文字コードの関係で一度ダブルコーテーションで囲んだのを取りながら表示します"
rem "選択肢を増やした場合は、以下の(1,1,X)のXを増やしてください。"
for /l %%i in (1,1,6) do (
  set yotei_%%i_=!yotei_%%i_:"=!
  echo  %%i = !yotei_%%i_!
)
echo.
echo  0 = 上記以外
echo.
echo  C = Cancel
echo.

choice /c:1234567890C /n /m 上記より予定を選んでください:
if errorlevel 11 goto :end

set yotei=!yotei_%errorlevel%_!
if "%yotei%"=="" set /p yotei=予定を入力してください:
if "%yotei%"=="" (
  set _msg="その他の予定が入力されなかったため、何もせずに終了します。"
  set _msg=!_msg:"=!
  echo.
  echo !_msg!
  pause
  goto :end
)
echo.
echo ======================================================================
set _msg="了解しました。[%yotei%]の終日予定を作成します。"
set _msg=!_msg:"=!
echo !_msg!
echo ======================================================================
echo.

:yotei_set
rem "金曜日の翌営業日は来週の月曜とするので、4日後まで求めておきます。"
for /F %%i in ('powershell (Get-Date '%date%'^).ToString('yyyyMMdd'^)') do (Set _date0=%%i)
for /F %%i in ('powershell (Get-Date '%date%'^).Adddays(1^).ToString('yyyyMMdd'^)') do (Set _date1=%%i)
for /F %%i in ('powershell (Get-Date '%date%'^).Adddays(2^).ToString('yyyyMMdd'^)') do (Set _date2=%%i)
for /F %%i in ('powershell (Get-Date '%date%'^).Adddays(3^).ToString('yyyyMMdd'^)') do (Set _date3=%%i)
for /F %%i in ('powershell (Get-Date '%date%'^).Adddays(4^).ToString('yyyyMMdd'^)') do (Set _date4=%%i)
rem "曜日判定用に、本日の曜日を取得します。"
for /f %%d in ('"powershell (Get-Date '%date%').DayOfWeek"') do set _dow=%%d

rem ”金曜は翌月曜日の予定を入れます。”
if "%scd_date%"=="TOMORROW" (
  if not "%_dow%"=="Friday" (
  set _date0=%_date1%
  set _date1=%_date2%
  ) else (
  set _date0=%_date3%
  set _date1=%_date4%
  )
)

echo BEGIN:VCALENDAR>%ics_file%
echo VERSION:2.0>>%ics_file%
echo PRODID:made by %0>>%ics_file%
echo BEGIN:VEVENT>>%ics_file%
echo DTSTART;VALUE=DATE:%_date0%>>%ics_file%
echo DTEND;VALUE=DATE:%_date1%>>%ics_file%
echo SUMMARY;LANGUAGE=ja:%yotei%>>%ics_file%
echo DESCRIPTION:①翌営業日の予定設定ですが、出の土曜、祝日などは、考慮していないので、必要に応じて日付を修正してください。\n②「保存して閉じる(S)」で保存ください。\n③保存後の削除・修正は、スケジューラで行ってください。\n\n(このスケジュールは、バッチを使って %date% %time%に作成しました。)\n>>%ics_file%
echo END:VEVENT>>%ics_file%
echo END:VCALENDAR>>%ics_file%

rem "一度シフトJISで作成し、UTF-8に変換することも考えたが、バッチ自体をUTFとしたため不要になった。"
rem "powershell -command "(Get-Content -Path "%ics_file%" -Encoding oem | Set-Content -Path "%ics_file_utf%" -Encoding UTF8)""

start %ics_file%

:end
endlocal

exit /b
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?