USB Type A コネクタの電流カット

USB 電源補助ケーブル Y字ケーブル

USBのバスパワー不足のときに、足りない電源を補助してくれるケーブルが、USB 電源補助ケーブルです。別名、Y字ケーブルとも呼ばれています。どんなものと言うと、↓↓↓ こんな形です見てください。

右側が、USB 電源補助ケーブルです。これは例として載せていますが、片側は、USB3.0 MicroB(右から3番目) のコネクタで、反対側が、USB3,0 TypeA のコネクタで、こちら側がY字に分岐していて、もう一つ TypeA のコネクタが付いています。この例題のケーブルの用途は、USB3.0 の HDDを接続するために私は使っています。この手のケーブルは、長さやメーカー違いで多種多用のものがありますが、1本246円で購入したケーブルは、見事に粗悪品で使い物になりませんでした。ご注意ください。安かろう/悪かろうってこのことです。上の写真は粗悪品のものです。

↓↓↓ これは大丈夫なケーブルでした。

電源補助は、0A にならない。

電源補助とは言っても、やっぱり電流は流れるようです。電流を取られる側(ホスト側)の機器によっては、大きな電流が流れるとその機器を自動的に切り離すものがあります。下の写真は、その例で、あるルータです。

Y字のもう一つのコネクタには、USB 電源をつないで、しっかり電流を供給しているのですが、ホスト側からも電流が流れてしまいます。

電流 0A のケーブルに改造

ここからは、自己責任と言うやつでお願いします。

USBのコネクタは、4本のピンがあります。そのうち2本は通信。1本は接地。残る1本が+5Vです。

この+5Vを取っ払ってやれば 0A になるんじゃないか?

やってみました。下の写真の赤枠で囲ったピンをどうにか取っ払います。

このピンを取っ払うにはピンの一番手前に無いか細い硬いものを入れてピンを起こしてやります。

私はケガキ針を使いました。写真の上のものです。精密ドライバーのマイナスの小さなやつでもいいかもしれませんが、ドライバーが曲がってしまうかもしれませんので、ご注意を。

ケガキ針でピンを起こしたらこんな感じになります。

右端のピンが起き上がっているのが分かりますか?

ここまできたらほぼ成功です。このピンをケガキ針で左右に振ること20回程度で折れました。

右端のピンが折れて、無くなっています。折れた残骸は、右下に写っています。

これで、ホスト側の消費電流が 0A になります。もしならなければ、奥の方にピンの残骸が残っている可能性があります。

ピンの残骸が残っている状態では、ホスト側や機器側に思わぬ故障を引き起こす可能性もあるので、ピンを折った後は、よ~~く、コネクタの内部を見て、折れ残りやピンの残骸が無いことを確認してください。

 

ヤマハのルータ NVR500をファイルサーバに その4 USB電源補助ケーブル

ヤマハのルータ NVR500をファイルサーバに その5 ニューUSB電源補助ケーブル



NTTフレッツ光

 

【送料無料】YAMAHA ブロードバンドVoIPルーター NVR500

価格:39,353円
(2018/5/29 13:40時点)
感想(5件)

PCのハードウェア製造番号をコマンドで確認する

製造番号の確認が必要な場面

まぁ、製造番号を見る必要性はあまり感じませんが、PCが壊れたときなんかは修理の申込で製造番号記入したりしますね。それ以外では、あまりお世話になることはありませんが、仕事でPCを大量に納入した際には保守用情報として全PCの製造番号を取得するなんてこともありました。



製造番号を表示する

製造番号がソフトウェア的に取得できるなんて不思議ですね。Sun の時代の SunOS や Solaris なら hostid なんてコマンドがあり、製造番号じゃないですが、そのハードウェア固有のIDを取得できました。Sun の場合、この hostid は、EEPROM に焼かれていました。

Windows もあまり変わらないだろうと思い調べてみたところ、SMBIOS(System Management BIOS) と言うところに格納することができるそうです。メーカーが販売している PC であれば、そこからsy得できそうです。自作 PC では、マザーボードの情報が入るのかなと思います。

それでは、実際に見てみましょう。コマンド一発で取得できます。管理者権限も不要です。

C:\>wmic csproduct get Identifyingnumber
IdentifyingNumber
YC012345Y


C:\>

wmic は、Windows Management Instrumentation のコマンドです。詳細はここでは説明しません。

そのコマンドのオプション指定 csproduct  は、SMBIOS の情報にアクセスするというものです。

get Identifyingnumber は、SMBIOS の中の製造番号を取ってこいと言う意味です。

これで製造番号が取得できました。みなさんの PC でも取得できましたでしょうか。

 


200×200 高速大容量レンタルサーバ10G
mixhost

 

 

バッチの中で他のプロセスが起動中か確認する

他のプロセスが起動中か確認が必要な場面

このプロセス/アプリが終わってからじゃないと処理ができないとか、このプロセス/アプリが起動中にバッチを実行すると何かを破壊してしまうとかありますよね。そんなときに、プロセス/アプリが起動中か確認する方法を紹介します。



対象となるプロセスを手動で見てみる

起動中かどうか確認したいコマンドやアプリを起動します。その状態でタスクマネージャを起動します。タスクマネージャは、Windows システムツールの中にあります。ここでは、例題としてメモ帳が起動しているかどうか確認してみましょう。

この例では2つのメモ帳が起動されていることが分かります。

でも、バッチの中で “メモ帳” は通用しません。この ”メモ帳” は通称であり、本名と言うのがあります。その本名を調べるには、メモ帳の行の上で、マウスの左ボタンをクリックし、プロパティを開きます。

プロパティ画面が出てきます。

この中の赤で囲った部分が本名です。ずいぶん通称と違います。

バッチの中で、プロセスが起動中か確認するには、この本名を元に探す方法を採ります。


200×200 高速大容量レンタルサーバ10G
mixhost

プロセスリストを取得してみる

現在起動しているプロセスのリストを取得するには、tasklist と言うコマンドを使います。

C:\>tasklist

イメージ名                     PID セッション名     セッション# メモリ使用量
========================= ======== ================ =========== ============
System Idle Process              0 Services                   0          8 K
System                           4 Services                   0     18,268 K
Registry                       120 Services                   0     19,408 K
smss.exe                       504 Services                   0      1,052 K
csrss.exe                      804 Services                   0      5,024 K
wininit.exe                    876 Services                   0      5,676 K

コマンドプロンプトを起動して、実行すると百行以上出てくると思います。上の例では先頭の数行のみ表示しています。でもこんなにたくさん出てきたら、メモ帳を探すのも苦労します。

メモ帳のプロセスを抜き出す

メモ帳のプロセスのみ抜き出すには、/FI オプションを使い、フィルターを掛けます。フィルターには色々と指定方法がありますが、プロセスのイメージ名を指定する方法でフィルターをかけます。イメージ名は、メモ帳であれば前段で取得した “notepad.exe” のことです。では実行してみましょう

C:\>tasklist /FI "IMAGENAME eq notepad.exe"

イメージ名                     PID セッション名     セッション# メモリ使用量
========================= ======== ================ =========== ============
notepad.exe                  12732 Console                    1     22,360 K
notepad.exe                  10920 Console                    1     20,276 K

狙ったとおり “notepad.exe” が2行出てきました。これで、プロセスを確認するテクニックは揃いました。あとはバッチとしてどう組み込むかです。

バッチの中でプロセスが起動中か判定する

バッチの中では対象のプロセスが起動されていたら、バッチを終了するとか、バッチを一時停止するとか色々と場面によって変わってくりかと思います。この例では、起動中であれば、メッセージを出して一時停止する処理にしています。

set PROCIMAGE=notepad.exe
set APLNAME=メモ帳
tasklist /FI "IMAGENAME eq %PROCIMAGE%" | find "%PROCIMAGE%" > NUL
if %errorlevel% == 0 (
    tasklist /FI "IMAGENAME eq %FILEWATCH%"
    echo.
    echo ■■■■■ %APLNAME% が起動されています ■■■■■
    echo 必要であれば %APLNAME% 停止してください
    echo 何かキーを押してください
    pause > nul
)

汎用的に使えるように、1行目と2行目でプロセスイメージ名(本名)とアプリケーション名(通称)を変数にセットしています。

3行目で、プロセスリストにフィルターをかけてプロセスイメージ名のみ抜き出しています。それをパイプで find に渡しています。

4行目では、3行目の最後のコマンド “find” の終了ステータスを判定しています。この例では、プロセスリストの中に “notepad.exe” があると “errorlevel” が 0 になります。

5~10 行目までは、それぞれの用途に合わせて書き換えてお使いください。

 

バッチの中で管理者権限を確認する

管理者権限が必要な場面

色々とシステムを構築していると、えー、このコマンド管理者権限必要なんだと言ったことに出くわします。私の場合は、リモートデスクトップの有効/無効を切り替えたくてバッチを作ったのですが、レジストリを触る “reg” コマンドが管理者権限が必要でした。他にもたくさんあるかと思います。



管理者権限があるか確認する方法

管理者権限があるかどうかは、管理者権限が必要なコマンドを実行して、そのエラーレベルを確認すると言う回りくどいやりかたで実現できます。↓↓↓ これがサンプルコードです。

openfiles > nul 2>&1
if not %errorlevel% equ 0 (
    echo このバッチは管理者権限で実行してください
    echo 終了します。何かキーを押してください。
    pause > nul
    exit 1
)


200×200 高速大容量レンタルサーバ10G
mixhost

1行目で管理者権限が必要な “openfiles” と言うコマンドを実行しています。実行結果は、nul デバイスに標準出力/標準エラー共にリダイレクトしているので、一切画面には出てきません。終了ステータスが、errorlevel 変数にセットされます。正常に終了した場合は、0。異常終了した場合は “0以外” がセットされます。ここが管理者権限の有無の肝です。

2行目は、openfiles の終了ステータスが 0 以外か確認しています。0 以外であれば 3行目 ~ 6行目が処理されます。

このコードをバッチファイルの先頭に入れておくと、管理者権限の有無が最初に確認され、管理者権限が無ければ echo でメッセージを出して、キー入力待ちにし、キー入力があれば終了ステータス “1” で終了します。

いかがでしょうか、簡単ではありますが、バッチの中で管理者権限を確認する方法でした。

 

 

 

 

バッチで今月末/前月末/翌月末などを取得する

どこでも使う日付取得を汎用バッチ化する

日付を取得して、その前月とか翌月とかが欲しいときありあすよね。会社で会計処理するようなときには、前月末締めで前月末って具体的に何月何日? なんてことです。



どこでも欲しくなるような機能ですよね。それなら、汎用バッチ化して、それを呼べばすっきりするし、共通化もできます。

汎用バッチと言っているのは、Windows や DOS にそのような「汎用バッチ」と言うものがあるのではないのですが、バッチから汎用バッチを呼んで、各変数に日付をセットしてもらおうというものです。この考え方は、日付以外の他の機能にもあてはまります。例えば曜日を月~日で欲しいなんて場合も汎用化しておけば、それを呼べばいいだけになります。

百聞は一見に如かず、まずは見てみましょう。

サンプルコード  dategettest.bat

@echo off


call dateget.bat

echo       年   月 0付月  日  0付日 末日
echo 前月 %Lyyyy%   %Lmm%    %LZmm%  %Ldd%     %LZdd%   %LddL%
echo 当月 %yyyy%   %mm%    %Zmm%  %dd%     %Zdd%   %ddL%
echo 翌月 %Nyyyy%   %Nmm%    %NZmm%  %Ndd%     %NZdd%   %NddL%

pause

4行目にかいてある “dateget.bat” と言うのが今回説明する汎用バッチです。このサンプルコードは、その汎用バッチを使う側のものです。汎用バッチを使う側は、”call dateget.bat” と1行書くだけで、次の値が得られます。

  • 現在の年、月、月が1桁の場合に0を先頭に付けたもの、日、日が1桁の場合に0を先頭に付けたもの、末日
  • 翌月の年、月、月が1桁の場合に0を先頭に付けたもの、日、日が1桁の場合に0を先頭に付けたもの、末日
  • 前月の年、月、月が1桁の場合に0を先頭に付けたもの、日、日が1桁の場合に0を先頭に付けたもの、末日

全部で 18個の値を取得できます。実際に実行してみましょう。

実行結果(実行日:2016/2/4)

      年   月 0付月  日  0付日 末日
前月 2016   1    01  4     04   31
当月 2016   2    02  4     04   29
翌月 2016   3    03  4     04   31

うるう年の処理も入っています。実行日が2016年2月4日で、その年はうるう年なので、2月は29日まであります。それで、当月の末日は29となっています。

実行結果(実行日:2018/1/21)

      年   月 0付月  日  0付日 末日
前月 2017   12    12  21     21   31
当月 2018   1    01  21     21   31
翌月 2018   2    02  21     21   28

年跨りの処理も入っています。実行日が2018年1月21日だと、その前月は、2018年12月になります。

実行結果(実行日:2018/5/31)

      年   月 0付月  日  0付日 末日
前月 2018   4    04  30     30   30
当月 2018   5    05  31     31   31
翌月 2018   6    06  30     30   30

前月同日、翌月同日が存在しない場合は、一番近い日:末日が設定されます。実行日が2018年5月31日の場合、前月4月と翌月6月はそれぞれ30日までしかないので、同日も末日も同じ30日が設定されます。


200×200 高速大容量レンタルサーバ10G
mixhost

汎用バッチ  dateget.bat

では、汎用バッチの方をみ見てみましょう。

@echo off
rem 現在の日付けを取得し、各種日付けを求め変数に入れる


rem 求める変数一覧
rem				年		0無月	0付月	0無日	0付日	末日
rem 前月	 Lyyyy		Lmm		LZmm	Ldd		LZdd	LddL
rem 当月	  yyyy		 mm		 Zmm	 dd		 Zdd	 ddL
rem 翌月	 Nyyyy		Nmm		NZmm	Ndd		NZdd	NddL

rem Z を含む変数で数値が1桁の場合、先頭に 0 が付く



rem ************* 現在の日付を取得 ****************************************
rem 日付をYYYY/MM/DD 形式で結果は環境変数 orgdate へ返す。
for /F "tokens=1" %%a in ('date /t') do set orgdate=%%a

rem ■ デバッグ用
rem set orgdate=2018/01/21



rem ***********************************************************************
rem ************* 当月の変数生成 ******************************************
rem ***********************************************************************
rem ***** 現在年月日(yyyy mm dd)を orgdate(YYYY/MM/DD) から求める
rem 年月日の分割
set yyyy=%orgdate:~0,4%
set mm=%orgdate:~5,2%
set dd=%orgdate:~8,2%


rem ***** 月日の数値化(8進数対策)
set /a mm=1%mm%-100
set /a dd=1%dd%-100


rem ***** うるう年判定
set UYYYY=%yyyy%

rem うるう年であれば2月に足す日数
set Udd=0

rem 年が4で割り切れるか
set /a U1=%UYYYY% %% 4

rem 年が100で割り切れるか
set /a U2=%UYYYY% %% 100

rem 年が400で割り切れるか
set /a U3=%UYYYY% %% 400

if %U1%==0 (
	rem 年が4で割り切れると一応うるう年である
	set Udd=1
	
	rem 4で割り切れても、100で割り切れて、400で割り切れないとうるう年ではない
	if %U2%==0 if not %U3%==0 (
		set Udd=0
	)
)


rem ***** 末日を求める
set ddL=
if %mm%==1  (set ddL=31)
if %mm%==2  (set ddL=28)
if %mm%==2  (set /a ddL=%ddL% + %Udd%)
if %mm%==3  (set ddL=31)
if %mm%==4  (set ddL=30)
if %mm%==5  (set ddL=31)
if %mm%==6  (set ddL=30)
if %mm%==7  (set ddL=31)
if %mm%==8  (set ddL=31)
if %mm%==9  (set ddL=30)
if %mm%==10 (set ddL=31)
if %mm%==11 (set ddL=30)
if %mm%==12 (set ddL=31)



rem ***** Z 付き変数の処理  一桁の月、日の先頭に0を付ける
set Zmm=0%mm%
set Zmm=%Zmm:~-2%
set Zdd=0%dd%
set Zdd=%Zdd:~-2%





rem ***********************************************************************
rem ************* 前月の変数生成 ******************************************
rem ***********************************************************************
rem 前月	 Lyyyy		Lmm		LZmm	Ldd		LZdd	LddL

rem ***** 前月の年月(Lyyyy Lmm)を求める
set Lyyyy=%yyyy%
set /a Lmm=%mm%-1

rem 年跨り処理    現在1月 → 前月は12月
if %Lmm% EQU 0 set Lmm=12&&set /a Lyyyy=%yyyy%-1


rem ***** うるう年判定
set UYYYY=%Lyyyy%

rem うるう年であれば2月に足す日数
set Udd=0

rem 年が4で割り切れるか
set /a U1=%UYYYY% %% 4

rem 年が100で割り切れるか
set /a U2=%UYYYY% %% 100

rem 年が400で割り切れるか
set /a U3=%UYYYY% %% 400
	

if %U1%==0 (
	rem 年が4で割り切れると一応うるう年である
	set Udd=1
	
	rem 4で割り切れても、100で割り切れて、400で割り切れないとうるう年ではない
	if %U2%==0 if not %U3%==0 (
		set Udd=0
	)
)


rem ***** 前月の末日(LddL)を求める
if %Lmm%==1  (set LddL=31)
if %Lmm%==2  (set LddL=28)
if %Lmm%==2  (set /a LddL=%LddL% + %Udd%)
if %Lmm%==3  (set LddL=31)
if %Lmm%==4  (set LddL=30)
if %Lmm%==5  (set LddL=31)
if %Lmm%==6  (set LddL=30)
if %Lmm%==7  (set LddL=31)
if %Lmm%==8  (set LddL=31)
if %Lmm%==9  (set LddL=30)
if %Lmm%==10 (set LddL=31)
if %Lmm%==11 (set LddL=30)
if %Lmm%==12 (set LddL=31)



rem ***** 前月の同日(Ldd)を求める
set Ldd=%dd%

rem 前月同日が、末日を超える場合は末日に修正
if %LddL% lss %Ldd% (set Ldd=%LddL%)


rem ***** Z 付き変数の処理  一桁の月、日の先頭に0を付ける
set LZmm=0%Lmm%
set LZmm=%LZmm:~-2%
set LZdd=0%Ldd%
set LZdd=%LZdd:~-2%





rem ***********************************************************************
rem ************* 翌月の変数生成 ******************************************
rem ***********************************************************************
rem 翌月	 Nyyyy		Nmm		NZmm	Ndd		NZdd	NddL

rem ***** 翌月の年月(Nyyyy Nmm)を求める
set Nyyyy=%yyyy%
set /a Nmm=%mm%+1

rem 年跨り処理    現在1月 → 翌月は12月
if %Nmm% EQU 13 set Nmm=1&&set /a Nyyyy=%yyyy%+1


rem ***** うるう年判定
set UYYYY=%Nyyyy%

rem うるう年であれば2月に足す日数
set Udd=0

rem 年が4で割り切れるか
set /a U1=%UYYYY% %% 4

rem 年が100で割り切れるか
set /a U2=%UYYYY% %% 100

rem 年が400で割り切れるか
set /a U3=%UYYYY% %% 400
	

if %U1%==0 (
	rem 年が4で割り切れると一応うるう年である
	set Udd=1
	
	rem 4で割り切れても、100で割り切れて、400で割り切れないとうるう年ではない
	if %U2%==0 if not %U3%==0 (
		set Udd=0
	)
)


rem ***** 翌月の末日(NddL)を求める
if %Nmm%==1  (set NddL=31)
if %Nmm%==2  (set NddL=28)
if %Nmm%==2  (set /a NddL=%NddL% + %Udd%)
if %Nmm%==3  (set NddL=31)
if %Nmm%==4  (set NddL=30)
if %Nmm%==5  (set NddL=31)
if %Nmm%==6  (set NddL=30)
if %Nmm%==7  (set NddL=31)
if %Nmm%==8  (set NddL=31)
if %Nmm%==9  (set NddL=30)
if %Nmm%==10 (set NddL=31)
if %Nmm%==11 (set NddL=30)
if %Nmm%==12 (set NddL=31)



rem ***** 翌月の同日(Ndd)を求める
set Ndd=%dd%

rem 翌月同日が、末日を超える場合は末日に修正
if %NddL% lss %Ndd% (set Ndd=%NddL%)


rem ***** Z 付き変数の処理  一桁の月、日の先頭に0を付ける
set NZmm=0%Nmm%
set NZmm=%NZmm:~-2%
set NZdd=0%Ndd%
set NZdd=%NZdd:~-2%





rem echo ■前月 %Lyyyy% %Lmm% %LZmm% %Ldd% %LZdd% %LddL%
rem echo ■当月 %yyyy% %mm% %Zmm% %dd% %Zdd% %ddL%
rem echo ■翌月 %Nyyyy% %Nmm% %NZmm% %Ndd% %NZdd% %NddL%


 

中身はよく読んでもらえばコメントも書いてあるので、理解していただけるかなと思いますが、汎用バッチなので、そのままコピってまずは使ってください。

使い方は、最初の dategettest.bat にあるように、18種類の変数に各値を入れてくれるので、それを参照するだけです。呼ぶ側で他の変数を使う場合は、この18種類の変数名と被らないようにコーディングしてください。

この汎用バッチの中身について勉強したくなるのは、翌日が欲しいとか、前日が欲しいとか言う場面が出てきたときではないかなと思います。そうときはこのソースをじっくり読んでいただいて改造するといいかもしれません。