【Powershell】(サーバ保守)タスクスケジューラの特定のタスクの状態を確認する(Get-ScheduledTask)

【ツールの概要】
Powershellで、Windowsタスクスケジューラの特定タスクの、「状態」を確認するスクリプトです。

【環境(使っている環境)】
Windows Server2016
Powershell ver5.1

【ソース(pingcheck.ps1)】

 # ログFunction
 function logwrite($MSG, $INFO, $outputfile) {
    $NOW = Get-Date -Format G
    Write-Output "[ $NOW ][ $MSG ] $INFO" | Out-File -Append $outputfile -encoding Default
}


# メールFunction事前読込(別にここじゃなくても可)
.('D:\bin\SendmailbyPS.ps1')


# プロセスメイン
$TaskName = '~~~~'; ←タスクの名前を入れる
$logfile = 'D:\log\TaskCheck_' + (Get-Date -Format "yyyyMMdd") + '.log';
$mailcfgpath = "D:\etc\mailcfg.xml"
logwrite "INF" "Check Start" $logfile


# タスクの状態を取得
$State = (Get-ScheduledTask -TaskName $TaskName).State


# タスクの状態で条件分岐(Running以外だったらログ書いてメールを送る、失敗したらログ書き込みのみ、Runningだったらログ書き込みのみ)
if ($State -ne "Running") {
    try {
        # Mail sending.
        logwrite "INF" "Task is not Running : $($State)" $logfile

        # メール送信部分
        $NOW = Get-Date -Format G
        $Subject = "[Warning] Server [" + (hostname) + "]'s Task [$($TaskName)] is not Running."
        $Body = "Task [$($TaskName)] is not Runnning : State is $($State). $($NOW)"
        $To = "メールアドレス@sample.jp"
        $Cc = "メールアドレス@sample.jp"
        SendmailbyPS $To $Cc $Subject $Body $mailcfgpath

        logwrite "INF" "Sending Mail Finished : $($TaskName)" $logfile
    }
    catch {
        logwrite "ERR" "Error. SendMailFunction Failed. TaskName : $($TaskName)" $logfile
        $errstring = $error[0] | Out-String
        logwrite "ERR" "$errstring" $logfile
    }
}
else {
    logwrite "INF" "The Task is $($State)" $logfile
}


logwrite "INF" "Check Finished" $logfile


【使用方法】
・上記のスクリプトの$TaskName に、確認対象のタスクの名前を代入するよう記述します。
・メール送信スクリプト(SendmailbyPS.ps1)とその設定ファイル(mailcfg.xml)を引数に注意しながら作ります。
powershellで実行します。

【説明】
・Get-ScheduledTaskコマンドで、Statusを直で取れます。実行中はRunningですね。他は以下の通り。

Running 実行中
Ready 準備完了
Disabled 無効


【総評】
ズバリのタスク名がわかっている場合、非常に簡単に状態などが取れます。
他の設定値がとりたい場合などは参考サイトを参照ください!

【参考サイト】
Get-ScheduledTask (ScheduledTasks) | Microsoft Docs
PowerShell で スケジューラタスク(SchedulerTask) を操作する - tech.guitarrapc.cóm

【bat、Powershell】(PCメンテナンス用)デスクトップにショートカットを作成するスクリプト

【ツールの概要】
・batとPowerShellで共有フォルダへのショートカットを作ります。
・batはほぼPowershellスクリプトを呼び出すだけです。

【環境(使っている環境)】
・Windows10Pro
Powershell ver2.0以降

【ソース(ExecutePSscript.bat)】

@echo off
cd /d %~dp0\bin

SET PSFile=CreateShortCut.ps1

powershell -ExecutionPolicy RemoteSigned .\%PSFile%
pause

 
【ソース(CreateShortCut.ps1)】

$DtFol = [Environment]::GetFolderPath('Desktop')

# 共有フォルダ
$WsShell = New-Object -ComObject WScript.Shell
$Shortcut = $WsShell.CreateShortcut($DtFol + "\うんたらさーば共有フォルダー.lnk")
$Shortcut.TargetPath = "\\192.168.0.xx\うんたら共有フォルダー"
$Shortcut.IconLocation = "\\192.168.0.xx\うんたら共有フォルダー"
$Shortcut.Save()

【使用方法】
・上記のようにExecutePSscript.batとCreateShortCut.ps1を作成し、後者をbinフォルダに格納します。
 デスクトップ
  └ ExecutePSscript.bat
  └ bin
    └ CreateShortCut.ps1
・ExecutePSscript.batを引数なしで実行します。

【説明】
・実行するとデスクトップにショートカットが作成されます。
・[Environment]::GetFolderPath('特殊フォルダ名')は、便利ですね。。
・オブジェクトでセットアップするのはわかりやすいです。

【総評】
batだけでやろうとすると手間がかかるし、GUIだと何台もやったり何個も共有フォルダ作るのは疲れるので、
そういう仕事があるならぜひ作っておきたいですね。
また、Powershellなら最初に配列に各値を格納してforeachなどで順次作成したり、
xmlから設定として読み取って、引数で分岐して所属を分けて作成したり、なんてのも比較的容易なので、
そういうカスタマイズをするのも楽しいかもしれません。

【参考リンク】
Windowsでディスク使用率等の一覧を出力するバッチファイルを書いた - hogehoge @teramako第14回 WshShellオブジェクトを利用する(3) (2/4):基礎解説 演習方式で身につけるチェック式WSH超入門 - @IT

【PowerShell】特殊フォルダを取得する | ほそぼそプログラミング日記

【PHP】PHPをbatのようにローカルスクリプトとして使う(3)~Curl編(Webアクセス、外部API(HTTP)の利用、JSONデータの活用)~

【ツールの概要】
・世の中に数多あるWebのAPI等にHTTPリクエストを投げることが可能です。
・ここではLinuxではよく使う(?)Curlを、Windows環境上のPHPで実行してデータを取得します。
PHPJSON形式のファイルも簡単に扱えるため、APIを利用した自動化も思いのほか簡単にできます。


【例えばこんな無料APIが】
郵便番号検索API - zipcloud
例:http://zipcloud.ibsnet.co.jp/api/search?zipcode=1600022
都道府県API | 駅データ 無料ダウンロード 『駅データ.jp』
例:http://www.ekidata.jp/api/p/13.json
例:http://www.ekidata.jp/api/l/11301.json
(上記では東京「13」で路線一覧を出して、JR東海道本線(東京~熱海)「11301」で路線の駅名一覧を取得できる。)
他にもGoogleの各種サービス、Yahoo、NHK、路線検索、地図、Twitter、、諸々たくさんサービスがあります。
上記二つは登録不要なので今回サンプルに使います。(他は大体APIキーだったりOAuthだったりの認証がある)


【環境(使っている環境)】
Windows 10 Pro (Serverでも動くはず)
PHP 5.6以降

PHPの設定】
php.iniの以下を変更する。
 ・「;extension=php_curl.dll」→「extension=php_curl.dll」 コメントアウトをなくしてCurlを有効にする。
比較的新しめのPHPならWindowsでも大抵これだけで行けると思います。
コマンドプロンプトで「php -v」と打って、エラーが出なければとりあえずOK。バージョン違う系のエラーが出たらそれを修正。

PHP(実行用PHPファイル(APIkicker.php))】

<?php
require_once(dirname(__FILE__).'./Class_common.php');


// 郵便番号1600022の情報を取得するAPIを叩くURL。参考→http://zipcloud.ibsnet.co.jp/doc/api
$URLString = "http://zipcloud.ibsnet.co.jp/api/search?zipcode=1600022";


// クラスインスタンスの作成。コンストラクト時にURLをインスタンスに格納。
$APIInstance = new GetData($URLString);
$APIResult   = $APIInstance->CurlToZipCode();


// ここからAPIで取得したHTTPリクエストの解析をする。
// Class_Commonで連想配列に格納した値の取得。オブジェクトの要素(address2)へのアクセス時の書き方にも注意。
$code     = json_encode($APIResult["code"]); //echoしたいから文字列にしたい →json_encodeで簡単に
$objBody  = json_decode($APIResult["body"]); //JSON文字列をオブジェクトにしたい →json_decodeで簡単に
$address2 = $objBody->results[0]->address2;


// 出力
echo "\r\n";
echo 'レスポンスコードは '.$code."\r\n";
echo 'address2のなかみは '.$address2."\r\n"."\r\n";
echo "=======var_dump======"."\r\n";
var_dump($objBody);
echo "=======var_dump======"."\r\n";

PHPcurlを実行しAPIからデータを取得するクラスを記載したPHP(Class_common.php))】

<?php
class GetData
{
    // インスタンス変数(url)
    private $url;

    public function __construct($str) {

        // インスタンス化時にインスタンス変数に文字列(URL)を格納。
        $this->url = $str;
    }

    public function CurlToZipCode(){

        // php_curlを利用 参考→https://www.php.net/manual/ja/book.curl.php
        // ここも。https://qiita.com/re-24/items/bfdd533e5dacecd21a7a
        $ch = curl_init();
        // オプション追加の中でAPIのURLを設定。ここでは単純に設定。配列でも可能。→setopt_array
        curl_setopt($ch, CURLOPT_URL, $this->url);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, true);
        $response    = curl_exec($ch);
        // レスポンスのなかでレスポンスコードと、ヘッダの範囲を調べることによりbodyを得る。
        $code        = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
        $body        = substr($response, $header_size);
        curl_close($ch);
        // 返り値は連想配列一つにして戻す。
        $return_arr = array('code' => $code);
        $return_arr = array_merge($return_arr, array('body' => $body));
        return $return_arr;
    } 
}


【使用方法】
・それぞれソースをコピペして拡張子を「.php」にして、一緒に「D:\phptest\」とかに保存します。
phpコマンドプロンプトで実行します。 →例:「php D:\phptest\APIKicker.php

【説明】
APIKicker.phpを実行するとClass_common.phpのクラスGetDataのインスタンスを作成し、
CurlToZipCodeメソッドでcurlを実行します。
後は大体コード中のコメントのとおりです。

 <実行イメージ>
 f:id:hagure_m:20190416135400p:plain

【総評】
クラスの簡単な利用もしてみました。
記述量が少ないとあまりうまみもないですが、慣れるためにはいいのかも?
APIも登録必要とかもありますが、非常に有用なものもあり、プログラミングの楽しさが広がること間違いなしです。
自分は楽しいかって・・・いわれると・・・

【参考サイト】
php configuration error – Call to undefined function curl_init() | Expert BOX
https://www.php.net/manual/ja/book.curl.php
【PHP】クラスの基本 | インスタンス | プロパティとメソッド | オブジェクト指向 - Qiita
PHPの「クラス」と「インスタンス」――「オブジェクト指向」の基礎中の基礎 (1/3):Web業界で働くためのPHP入門(13) - @IT
https://www.php.net/manual/ja/ref.json.php

【PHP】PHPをbatのようにローカルスクリプトとして使う(2)~DBアクセス編~

【ツールの概要】
PHPに慣れている方にとっては当たり前のことですが、batやVBSのようにサーバー内部の処理を行わせます。
・(1)から進んで、DB「MySQL」へアクセスします。
スクリプトの書き方としては、まずは小規模でVBSとかで親しみやすい関数型みたいな感じです。

【環境(使っている環境)】
Windows 10 Pro (Serverでも動くはず)
PHP 5.6以降?
MySQL 8.0(5.6と5.5とかでも動くはず)

MySQL導入】
(1) MySQLのサイトからダウンロードしてインストールします。
 <インストール参考サイト>
  MySQL :: Download MySQL Community Server
  MySQL入門者でもわかる!3ステップのインストール方…|Udemy メディア
(2) PHPと同様に環境変数PATHを通しておく。→コマンドプロンプトで「mysql -uroot -p」と打ってパスワード入力画面が出るようにしておく。
(3) ここでは、「sample」スキーマ(データベース)を作成して、「user」テーブルを以下の画像のように作っておく。
f:id:hagure_m:20190415000857p:plain

PHPの設定】
php.iniの以下を変更する。
 ・「;extension_dir = "ext"」→「extension_dir = "ext"」 コメントアウトをなくしてextフォルダを参照させる。
 ・「;extension=pdo_mysql」→「extension=pdo_mysql」 コメントアウトをなくしてPDO(MySQL)を有効にする。
可能ならログ出力も有効にして、コマンドプロンプトphp -vを起動したときにエラーが出ていないようにする。

PHP(引数にして実行するPHPファイル(test.php))】

<?php
require_once "D:\\phptest\\common1.php" ;

logging('test.php 起動');

$query = 'SELECT * FROM user WHERE id=2;';
$all = mysqlconnect($query);

// 「//」でコメントアウトしているところはデータが複数ある場合にこうしたら取れるよ的なアレ
// i=0;
// foreach ($all as $data){
//    $id[i] = $data['id'];
//    $name[i] = $data['name'];
//    $address[i] = $data['address'];
//    i++;
// }

// echo (int)$id[0].' '.(string)$name[0].' '.(string)$address[0];
echo (int)$all[0]['id']."\r\n"
    .(string)$all[0]['name']."\r\n"
    .(string)$all[0]['address'];

PHP(関数を記載するPHP(common1.php))】

<?php
define("mysql_schema", "mysql:dbname=sample");
define("mysql_user", "root");
define("mysql_password", "root");

function logging($str)
{
    error_log(date("[Y/m/d H:i:s] ") .rtrim($str). "\r\n", 3, "D:\\phptest\\test_log.txt");
}

function mysqlconnect($query)
{
    try {
        $dbh = new PDO(
             mysql_schema
            ,mysql_user
            ,mysql_password
            ,array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)
        );
        $sql = $dbh->prepare($query);
        $stmt = $sql->execute();

        if (!$stmt) {
            logging('結果!とれませんでした!!');
            print_r('MySQLエラー_'.$dbh->errorInfo());
        }
        $all = $sql->fetchAll();
        $sql = null;  
        return $all;
    } catch (PDOException $e) {
        logging('error_'.$e->getMessage());
    }
}


【使用方法】
・それぞれソースをコピペして拡張子を「.php」にして、これは「D:\phptest\」に保存します。
・それぞれのファイルパス、フォルダパスに不備がないようにします。アクセス権も注意!
phpコマンドプロンプトで実行します。 →例:「php D:\phptest\test.php

【説明】
PHPファイルを実行すると、require_onceで「common1.php」をrequireします(え。
requireしたことで、「logging」関数を呼び出せるので、そこでログ処理をします。これで「[2019/04/14 14:44:48] test.php 起動」な感じでロギングが簡単にできます。
requireしたことで、「mysqlconnect」関数も呼び出せるので、クエリ文字列を渡すことで、SQLを実行してfetchしたデータを返す関数を実行します。
「'SELECT * FROM user WHERE id=2;'」はざっくり「userテーブルから*(全部)のカラムのデータをセレクトしゃがれ、あ、行はid=2のデータをな!」的な感じです。(こういうところで使う場合は*は良くないけど)
PDOはPHP標準の拡張機能の一つでデータベースとの接続を容易に行えるクラスのことです(参考文献参照)。
ここでは「define」でユーザ名とか対象スキーマ(DB)とかを定義しています。(defineは定数として定義するので、使用するときは「$」が要りません)
DB接続の方法は初心者にはなかなか難しいところですが、オプションとかをキチンと調べるとPDOを利用した接続に落ち着くので理解を頑張ってください(え
結果的に、mysqlconnect関数は二次元配列を呼び出し元へ返します。
そして最後にechoで標準出力に各値を出力します。

 <実行イメージ>
 f:id:hagure_m:20190415004742p:plain


【総評】
正直これだけの説明だとつまずくことも多いと思います。
PHPの設定は「php.ini」、MySQLの設定は「my.ini」をいじって、MySQLはとにかくDBやテーブルをいじってコマンドになれることしかないとおもわれます。
エラー内容からネットを検索すればなんとかなるはず。。だと思います。
これが上手くできるようになれば、会社のMySQLサーバからバッチで定期的にデータを好きなように取得して加工して、、とかが現実的になってきます。


【参考サイト】
PHP: エラーおよびエラー処理 - Manual

PHP: PDO - Manual

PHPでデータベースに接続するときのまとめ - Qiita

【bat、PHP】PHPをbatのようにローカルスクリプトとして使う(1)~設定・呼び出し編~

【コマンド、ツールの概要】
PHPに慣れている方にとっては当たり前のことですが、batやVBSのようにサーバー内部の処理を行わせます。
・メリットとしてはこんな感じ?
 〇 batやVBSよりDBMSへの接続が簡単。
 〇 ライブラリが豊富、Webの情報も豊富。
 〇 OSよりもPHP.iniの設定に環境として依存する。
 〇 エラーがbatとかwindows謹製のものよりわかりやすい←個人差あり
・デメリットとしては、、こんな感じ?
 × あえてPHPでやる必要があるのかは常に考える必要がある。
 × コンパイルされたプログラム(JavaとかC#とか)より遅い。インタプリタ式の中では不明。
 × 少なくともPHP.exeと設定が必要。

【環境(使っている環境)】
Windows Server 2008R2
PHP 5.6

PHP導入】
(1) PHPプログラムファイルの解凍、設置
  PHPのサイトからZipをダウンロードして、問題なさそうな場所に置く。(自分はよく「D:\php\php5.6\」とかに展開します)
   (64bit(x64)か32bit(x86)、将来的にIISを使ってサイトを作るとかならNon Thread Safeを選ぶといいっぽい)
   http://www.php.net/
   https://windows.php.net/download
  <インストール参考サイト>
   https://weblabo.oscasierra.net/php-72-windows-install/
(2) 環境変数PATHを通す。
  「ファイル名を指定して実行(Win+R)」
  →「システムのプロパティ(sysdm.cpl)」
  →「詳細設定タブ」→「環境変数ボタン」
  →「システム環境変数Pathをクリックして編集」
  →「新規ボタンを押して、「php.exe」のあるフォルダ(たぶんbin)を入力」
  →「全部OKで閉じる」
  これで、コマンドプロンプトで「php」と打つだけでPATHを通した場所にある「php.exe」を呼べるようになる。
(3) コマンドプロンプトを起動して(ちゃんと開き直さないとPATHを読み込み直さない)、「php -v」と打ってバージョンが出ることを確認する。


【bat(colled_phpを呼ぶbat(php_call.bat))】

php D:\Project\phptest\colled_php.php

ECHO %ERRORLEVEL%

PHP(batに呼ばれて文字を出力してbatに「1」を返すPHP(colled_php.php))】

<?php
$word = "呼ばれちゃった";
echo $word;

exit (1);


【使用方法】
・それぞれソースをコピペして拡張子を「.bat」「.php」にして保存します。
・それぞれのファイルパス、フォルダパスに不備がないようにします。
・batを実行します。

【説明】
batを実行すると、1行目でphpのプログラムを引数にphpファイル(colled_php.php)を設定して実行します。
phpスクリプト部はで記述されます。(閉じる方のかっこは不要派が多い?なんか理由あった気がする)
変数$wordに文字を代入し、echoで標準出力に出力(Webだとブラウザの表示部とか)。
PHPはexit()でカッコ内を呼出し元へ返り値(終了ステータス)として返します。(batは数字でしか受け取れないためここでは「1」)
batは返り値を特殊環境変数ERRORLEVELに格納するので、それをECHOして標準出力へ出力して、コードおわり。
 <実行イメージ>
 f:id:hagure_m:20190413162833p:plain

また、こんなコマンドでもコマンドプロンプトphpは実行できます。
 php D:\Project\phptest\colled_php.php
この場合、「呼ばれちゃった」だけがコマンドプロンプトに表示されますね。

【総評】
phpを少しかじった人だと「exit(die)」「return」「echo」とかどれで戻り値を返すのか悩んだりしたことがあったはず←
また、「exit」コマンドは文字列と数字を指定した場合の挙動が微妙に異なります(→参照
サーバーローカルスクリプトとしてbat的にphpを使う人は少ないと思うので、
たまにはこんな記事もいいんじゃないかな、ということで、ちょっと続きます。(なぜかは次の記事あたりで)


【参考サイト】
PHPのダウンロードとインストール | PHPインストールと初期設定

【初心者向け】PHPによるバッチ処理プログラム開発 - Qiita

【bat】(ある程度)セキュアなファイル転送を自動で行うbat ~WinSCP公開鍵転送の自動化~

【コマンド、ツールの概要】
・インストール済みのWinSCPを利用して公開鍵を使ったファイル転送を行うbat。
WinSCPのインストールは簡単ですが、セッティングは以下につまずいたりしました。
 1 公開鍵は接続先のログインユーザのフォルダに「.ssh」フォルダを作ってそこに入れる。
 2 秘密鍵は接続時にローカルのものを指定する。
 3 WinSCPで(接続後に行いたい処理の)スクリプトを書いたtxtを「/script」オプションで呼び出す。
 4 秘密鍵パスフレーズは実は直で指定可能(←頑張ったほめて。でもこの方法がセキュアかどうかは疑問)
 5 文字化け(特にプロンプト表示)はある程度はあきらめる()

【環境(使っている環境)】
Windows Server 2008R2 to Windows Server 2016
WinSCP 5.13.4(ビルド8731)

【bat(WinSCPの呼び出し、「D:\WinSCP_SEND\TempTSV_Send\」にあるファイルを転送(同期)する)】

REM 日時設定(出力ファイル名に設定)
SET Date_Tmp=%date:/=%
SET Time_Tmp=%time:~0,2%%time:~3,2%
SET Time_Tmp=%Time_Tmp: =0%

REM フォルダ設定
SET BATFOL=D:\WinSCP_SEND\bat\
SET LOGFOL=D:\WinSCP_SEND\log\
SET SENDFOL=D:\WinSCP_SEND\TempTSV_Send\

REM WinSCP設定
SET WINSCPPRG="C:\Program Files (x86)\WinSCP\winscp.com"
SET SCRIPTTXT=%BATFOL%syncFileswithWinSCP.txt
SET XMLLOG=%LOGFOL%Up_log%Date_Tmp%_%Time_Tmp%.xml

REM winSCP送信(D:\GSMS\TempTSV_Send\内に「.tsv」があれば同フォルダのファイルを全部転送したい)
If exist %SENDFOL%*.tsv (
	%WINSCPPRG% /console /script=%SCRIPTTXT% /xmllog=%XMLLOG%
)

If %ERRORLEVEL% equ 0 (
	REM エラーがなければoldフォルダへ退避処理。ここはよしなに。robocopy /?でコマンド詳細を確認してね
	robocopy %SENDFOL% %SENDFOL%old\ *.tsv /Z /MOV /V /is
) else (
	REM <ここにエラー処理、WinSCPはエラったら0以外を返す>
)

exit

【syncFileswithWinSCP.txt(WinSCPスクリプト)】

option batch on
option confirm off
open sftp://リモートユーザID:リモートログインパスワード@XXX.XXX.XXX.XXX/ -rawsettings FSProtocol=2 -privatekey="秘密鍵パス\himityu.ppk" -passphrase=himityu.ppkのパスフレーズ
cd ..\..\temp\Uploaded
lcd D:\WinSCP_SEND\TempTSV_Send\
synchronize remote
close
exit


【使用方法】
・それぞれソースをコピペして拡張子を「.bat」「.txt」にして保存します。
・それぞれのファイルパス、フォルダパスに不備がないようにします。(フォルダがない場合の処理などは入れてません)
・batを実行します。

【説明】
いきなりこれを使う前に作成した秘密鍵と公開鍵が実際に使えるかを、WinSCPGUIで設定して確認したほうが良いと思います。
WinSCPのコマンドについてはリファレンス参照で。
ざっくり、[openで接続を開く] → [cdでリモートディレクトリを指定] → [lcdでローカルディレクトリを指定] → [synchronize remoteでリモートをローカルに合わせる]
ていう処理の流れです。

【総評】
とにかく文字化けに苛まれるので起きている問題の把握が難しいです。
秘密鍵パスフレーズの自動入力はPageantPuTTYの認証エージェント)が使えるなら素直にそれ使ってもいいかもしれません(常時起動が必須?)。
スクリプト直書きは企業での要件に耐えるかは保証できませんね。
VPN環境の構築が難しい場合はこういう仕組みも一考する必要がありますね。

【参考サイト】
WinSCP日本語Wiki - WinSCP Wiki - WinSCP - OSDN

WinSCP の使い方から設定まで全てが分かる記事まとめ

ネットワーク関連/WinSCP利用時の文字化け対策 - Windowsと暮らす

コマンドプロンプトの文字コードを変える方法 - [コマンドプロンプト・バッチ/Windows] ぺんたん info

【bat】ユーザに実行させて、ユーザ名とIPアドレスを確認させるbat

【コマンド、ツールの概要】
・実行するとユーザ名とIPアドレスが表示される
・環境に応じて事前に調整が必要←


【環境(使っている環境)】
Windows10。7とかでも動くと思います。


【コマンド例】

@ECHO OFF

ECHO.
ECHO ●ユーザ名とIPアドレスを教えてください
ECHO.
FOR /F %%i IN ('whoami') DO SET wai=%%i
ECHO   ユーザ名	%wai%
ECHO.
FOR /F "delims=" %%a IN ('arp -a ^| findstr "インターフェイス:"') DO (
	ECHO %%a | FIND "192" >NUL
	IF NOT ERRORLEVEL 1 (SET ipa=%%a)
)
SET ipa=%ipa:インターフェイス: =%

ECHO   IPアドレス	%ipa%
ECHO.
PAUSE

【使用方法】
・ソースをコピペして拡張子を「.bat」にして保存します。
・「FIND "192"」のところを、ネットワーク環境に応じてひっかけやすそうな数字にします←
・自分かユーザに実行させます。ユーザ名とIPアドレスが表示されてポーズされるはずです。(IPアドレスには後ろにおまけがついてます)


【説明】
ユーザ名をwhoamiで取るのはまあbatコマンドの結果を変数で入れる常套手段なのでいいとして。
IPアドレスを取得するのは意外と骨が折れます。
ipconfigとか選択肢もあるのでが、一番取りやすそうなarpを選択。


【総評】
ガバガバなbatですが、急遽必要になったため作成。
ユーザにIPアドレスとユーザ名を聞く際、送り付けて実行してもらうのが早い。
いちいち「コマンドプロンプトだしてー・・」とかめんどうなので・・・。