会社で使うために作ったモノたち

#概要

会社で作って公開できるものを残していこうかなーって
殆どが勤め先でしか使えないDBのスクリプトだったり、社内用のツールのためのバッチだったりする中、他でも使えるかもというものを書いていきます。


#ツール系

##プロセス強制終了

VBのコンソールです。
会社のパソコンってなんか色々はいってるんですよね、、、
なので、スタートアップにこのexeのショートカットを突っ込んで、起動オプションに色々している感じです。

起動オプションは下記のような感じです。

###起動プション

 ![kill.png](https://qiita-image-store.s3.amazonaws.com/0/32577/8abb9aa4-186f-406f-5fba-ed2bc5851000.png)

起動プションの **/\*\*\*=** 以外はすべてプロセス名として認識するので、スペース区切りで不要なものをごっそり入れる感じです。

```vbnet
Imports System.ComponentModel

Module Module1

    Sub Main()
        Dim tasklist As New List(Of Diagnostics.Process)
        Dim waitparamnm As String = "/wait=", '処理開始待ち
        hidewaitparamnm As String = "/hidewait=", '処理完了後の閉じ待ち
        retryparamnm As String = "/retry=",'リトライ回数
        retrywaitparamnm As String = "/retrywait=" 'リトライ開始待ち

        Dim waittime As Integer = 0,
        hidewaittime As Integer = 0,
        retrycount As Integer = 0,
        retrywaittime As Integer = 0

        Try
            'wait
            For Each args As String In My.Application.CommandLineArgs
                Select Case True
                    Case args.ToLower.StartsWith(waitparamnm.ToLower())
                        waittime = Integer.Parse("0" & args.Remove(0, waitparamnm.Length)) * 1000
                End Select
            Next

            Console.WriteLine("Wait " & waittime)
            Threading.Thread.Sleep(waittime)

            'run
            For Each args As String In My.Application.CommandLineArgs
                Select Case True
                    Case args.ToLower.StartsWith(waitparamnm.ToLower())
                        'waittime = Integer.Parse("0" & args.Remove(0, waitparamnm.Length)) * 1000

                    Case args.ToLower.StartsWith(hidewaitparamnm.ToLower())
                        hidewaittime = Integer.Parse("0" & args.Remove(0, hidewaitparamnm.Length)) * 1000

                    Case args.ToLower.StartsWith(retryparamnm.ToLower())
                        retrycount = Integer.Parse("0" & args.Remove(0, retryparamnm.Length))

                    Case args.ToLower.StartsWith(retrywaitparamnm.ToLower())
                        retrywaittime = Integer.Parse("0" & args.Remove(0, retrywaitparamnm.Length)) * 1000

                    Case Else
                        tasklist.AddRange((Diagnostics.Process.GetProcessesByName(args)))
                End Select
            Next

            'kill + retry
            If tasklist.Count > 0 Then
                For i As Integer = 0 To retrycount
                    If i > 0 Then
                        Console.WriteLine("Retry " & i)
                        Console.WriteLine("RetryWait " &
                        retrywaittime)
                        Threading.Thread.Sleep(retrywaittime)
                    End If

                    kill(p_TaskList:=tasklist)
                    If tasklist.Count <= 0 Then Exit For
                Next
            End If

        Catch ex As Exception
            Console.WriteLine(ex.Message)
        End Try

        Console.WriteLine("End.")
        Threading.Thread.Sleep(hidewaittime)

    End Sub

    Private Sub kill(ByRef p_TaskList As List(Of Diagnostics.Process))
        Dim killedtaskidlist As New List(Of Integer)

        For Each task As System.Diagnostics.Process In p_TaskList
            Try
                Dim processno As Integer = 0

                Console.Write(task.MainModule.ModuleName & ":")
                'プロセスを強制的に終了させる
                task.Kill()

                killedtaskidlist.Add(task.Id)

                Console.WriteLine("Killed.")
            Catch ex As Win32Exception
                Console.WriteLine("Dont Killed")
            Catch ex As NotSupportedException
                Console.WriteLine("Non Supported")
            Catch ex As InvalidOperationException
                Console.WriteLine("PS Not Found")
            End Try
        Next

        p_TaskList.RemoveAll(Function(ps As Diagnostics.Process)
                                 Return killedtaskidlist.Contains(ps.Id)
                             End Function)
    End Sub

End Module
```

上記をコンパイルしたものを下記においておきます。（気分次第ｗ）
[SkyDrive](https://1drv.ms/f/s!Ai50VZiXVnDdg_8eCyckAuzrKROATQ)

##サクラエディタのマクロ

基本オラクル・.Net系なので、それらのコーディングなどで使ったサクラエディタ用のマクロが下記です。

###SQL_In

エクセルのデータをInの条件に入れたいときとかは、改行ごとにシングルクォーテーションとおしりにカンマを入れるので、そのマクロです。

```
//キーボードマクロのファイル
S_ReplaceAll('$|^', '\'', 164);	// すべて置換
S_ReplaceAll('$', ',', 164);	// すべて置換
S_ReDraw(0);	// 再描画
```

###Trim

・・・Trimです。

```
//キーボードマクロのファイル
S_ReplaceAll('^\\s+|\\s+$', '', 36);	// すべて置換
S_ReDraw(0);	// 再描画
```

###NULL_DEL

無駄な改行とかを消して行を詰める感じのやつです。

```
//キーボードマクロのファイル
S_ReplaceAll('^[[ \\t][\\r\\n]]+', '', 164);	// すべて置換
S_ReDraw(0);	// 再描画
```

#スクリプト系

##ディスプレイの電源を切る時間調整

会社うるさいんです、、、PCついてるとまだ会社にいると思われるし、省エネどうのこうのと、、、
でも帰宅するとき一々シャットダウンしてると、やりかけのソースすべて閉じないといけないですよね、、、
Visual Studioとか会社の古くて重いし、、、ノートPCだし、、、

ということで。
あたかもシャットダウンしているように見せかけるため、ディスプレイの電源だけ切るような小細工しています。
（スリープや休止状態もありだけど、なんか好きじゃないんです、かと言ってスクリーンセイバーで黒くしても、バックライト生きてるからバレちゃうし）

```bat
@echo off

:LOOP
rem "Monitor Power-off timeout"
set /P OT="Min Num (memo: q -> exit) = "
echo %OT%
if %OT% == q goto :EXIT

powercfg.exe -X /monitor-timeout-ac %OT%
goto :LOOP

:EXIT

exit /b 0
```

このバッチを起動すると下記のようにディスプレイを切る時間を分単位で問い合わせ続けます。
（問い合わせ続けるのは、会社来た時に0を入れて切れないようにしたかったから）

![1.png](https://qiita-image-store.s3.amazonaws.com/0/32577/a07f7807-d457-293f-abb9-4f547f699f02.png)

![60.png](https://qiita-image-store.s3.amazonaws.com/0/32577/6889a278-4f80-9cd0-7aeb-f5f3b919ea71.png)

![0.png](https://qiita-image-store.s3.amazonaws.com/0/32577/19b26f73-7ccd-ca00-7b21-619e5056cae2.png)