使用環境
- OS:Window10 home
- PSVersion:5.1.19041.610
投稿したきっかけ
最近、教本を参考にしてpowershellのお勉強しているときに記載されているソースを自分でタイピングするとしょうもないところで時間を食ってしまったので備忘録かつ自分への戒めとして投稿しました。
やろうとしたこと
下記のA.batから現在の時刻を判定し、午前ならB.ps1、午後ならC.ps1をよびだす。
・A.bat
・B.ps1
・C.ps1
@echo off
rem 現在の「時刻」の取得
set now_hour = %time:~,2%
if %now_hour% lss 12(powershell C:\work_ps\temp\am.ps1
) else (powershell C:\work_ps\temp\pm.ps1
)
pause
exit
echo "午前です"
echo "午後です"
手こずってしまった原因
- batで変数を代入する際に半角スペースを入れてしまい値が代入されてなかった
- batのソースの一行を複数行に跨いで記載する場合は改行する場合は「^」(キャレット)が必要と思ったが
ただ自分のif文のお作法を無視した書き方をしただけだった→if文の条件式と実行部分でスペースを空けていなかった
経緯
やったこと①
実行しようとしてもコマンドプロンプトが起動せず。A.batのソースを一行ずつ流したところ、午後の時間帯なのにB.ps1がテキストとして開かれる。
やったこと②
確かbatのソースの一行を複数行に改行する場合、しかるべき記述が必要だったと思い、if文を修正
「^」(キャレット)を追加したものに修正A.batを実行
@echo off
rem 現在の「時間」の取得
set now_hour = %time:~,2%
if %now_hour% lss 12(powershell C:\work_ps\temp\am.ps1 ^
) else (powershell C:\work_ps\temp\pm.ps1 ^
)
pause
exit
コマンドプロンプトが起動せず、また、一行ずつ流すと午後の時間帯なのにB.ps1がテキストとして開かれる。
やったこと③
「^」(キャレット)を使わず、にif文を一行にしてみて実行するがコマンドプロンプトが起動しない
やったこと④
elseと処理の()のスペースを消してみる
やったこと⑤
式またはステートメントのトークン ')' を使用できません。とエラー発生
やったこと⑥
elseと処理の()のスペースを元に戻して、lss 12と処理の()のスペースを空けてみる
やったこと⑦
一行ずつ実行すると「午前です」とB.ps1の結果が表示(実施時間は夜)。なぜ、時間帯が正しく判定できていないのか考えてみると
set now_hour = %time:~,2%←ここのnow_hourに正しく時間が入っていないことに気づき、
echo %now_hour%を実行すると%now_hour%と表示されていること確認
やったこと⑧
set now_hour = %time:~,2%のスペースを消してみる
やったこと⑧
set now_hour = %time:~,2%の「=」の左右の半角スペースを消してみる
やったこと⑨
set now_hour=%time:~,2%
echo %now_hour%を実行すると今の時間帯の23が表示
やったこと⑩
if文を最初の改行をいれた状態に戻してみる
やったこと⑪
午後ですと表示され、B.ps1が正しく実行された
まとめ
変数を代入する際に半角スペースを入れてはいけないとか、batに長らくふれていなかったことで初歩的なお作法を忘れてました。
ほんとに記憶の忘却は怖い。。
ただ、学習する中で教本に記載されているソースを自分の手でタイピングすることでいろんなことの発見や思い出すきっかけに
なるのは事実だとおもうのでこれからも極力コピペせずにやっていきます。
参考文献
この記事は以下の情報を参考にして執筆しました。
- Windows PowerShellでキーボード操作を自動化しよう: Windows10/PowerShell5.0対応(https://www.amazon.co.jp/dp/B07JCK5JW8?tag=note0e2a-22&linkCode=ogi&th=1&psc=1)