-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMain.ps1
489 lines (442 loc) · 20 KB
/
Main.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
#################################################################################
# 処理名 |CD-DetermineStringTool(メイン処理)
# 機能 |CDドライブ内のファイルをチェックするツール
#--------------------------------------------------------------------------------
# 戻り値 |下記の通り。
# | 0: 正常終了
# |-101: 設定ファイル読込みエラー
# |-201: CDトレイのオープン(くり返し前の初回時)エラー
# |-301: CDの挿入(セット)エラー
# |-401: CDドライブの検証エラー
# |-402: ファイル名の検証エラー
# |-403: ファイル詳細の検証エラー
# |-501: CDトレイのオープン(くり返し中の終了時)エラー
# 引数 |-
#################################################################################
# 定数
[System.String]$c_config_file = "setup.ini"
[System.String]$c_cdlabel = "集計データ"
[System.Int32]$c_retry_count = 3
[System.Int32]$c_interval_sec = 10
[System.Int32]$c_wait_sec = 3
[System.Int32]$c_for_count = 50
# Function
#################################################################################
# 処理名 |ExpandString
# 機能 |文字列を展開(先頭桁と最終桁にあるダブルクォーテーションを削除)
#--------------------------------------------------------------------------------
# 戻り値 |String(展開後の文字列)
# 引数 |target_str: 対象文字列
#################################################################################
Function ExpandString([System.String]$target_str) {
[System.String]$expand_str = $target_str
If ($target_str.Length -ge 2) {
if (($target_str.Substring(0, 1) -eq "`"") -And
($target_str.Substring($target_str.Length - 1, 1) -eq "`"")) {
# ダブルクォーテーション削除
$expand_str = $target_str.Substring(1, $target_str.Length - 2)
}
}
return $expand_str
}
#################################################################################
# 処理名 |OpenCdtray
# 機能 |CDトレイを自動でオープン
#--------------------------------------------------------------------------------
# 戻り値 |Boolean(True: 正常終了, False: 異常終了)
# 引数 |drive_full: 対象ドライブ
#################################################################################
Function OpenCdtray([System.String]$drive_full) {
[System.Boolean]$return = $false
[System.String]$prompt_message = ''
[System.Text.StringBuilder]$sbtemp=New-Object System.Text.StringBuilder
# CDトレイのオープン
try {
(New-Object -com Shell.Application).Namespace(17).ParseName("${drive_full}").InvokeVerb("Eject")
$return = $true
}
catch {
$sbtemp=New-Object System.Text.StringBuilder
@("エラー : CDトレイ オープン処理`r`n",`
" 処理が失敗しました。`r`n")|
ForEach-Object{[void]$sbtemp.Append($_)}
$prompt_message = $sbtemp.ToString()
Write-Host $prompt_message -ForegroundColor DarkRed
}
return $return
}
#################################################################################
# 処理名 |InsertCD
# 機能 |CDトレイにCDメディアを手動で挿入(セット)
#--------------------------------------------------------------------------------
# 戻り値 |Boolean(True: 正常終了, False: 処理中断)
# 引数 |label: 対象CDのラベル名
#################################################################################
Function InsertCD([System.String]$label) {
[System.Boolean]$return = $false
[System.Text.StringBuilder]$sbtemp=New-Object System.Text.StringBuilder
[System.String]$prompt_message = ''
@("捜査依頼 : CDのセット`r`n",`
" 処理を一時停止中。CDトレイに [ ${label} ] をセットしてください。`r`n")|
ForEach-Object{[void]$sbtemp.Append($_)}
$prompt_message = $sbtemp.ToString()
Write-Host $prompt_message -ForegroundColor DarkYellow
$sbtemp=New-Object System.Text.StringBuilder
@("確認 : 処理続行の確認`r`n",`
" CDをトレイに入れた後に応答し再開してください。処理を再開しますか?`r`n",`
" [ y: はい、n: いいえ ]`r`n",`
"`r`n",`
"入力 ")|
ForEach-Object{[void]$sbtemp.Append($_)}
$prompt_message = $sbtemp.ToString()
# YesNo入力
$return = ConfirmYesno $prompt_message
return $return
}
#################################################################################
# 処理名 |ConfirmYesno
# 機能 |YesNo入力
#--------------------------------------------------------------------------------
# 戻り値 |Boolean(True: 正常終了, False: 処理中断)
# 引数 |prompt_message: 入力応答待ち時のメッセージ内容
#################################################################################
Function ConfirmYesno([System.String]$prompt_message) {
[System.Boolean]$return = $false
[System.String]$value = $null
[System.Text.StringBuilder]$sbtemp=New-Object System.Text.StringBuilder
for($i=1; $i -le $c_retry_count; $i++) {
# 入力受付
try {
[ValidateSet("y","Y","n","N")]$value = Read-Host $prompt_message
}
catch {
$value = $null
}
Write-Host ''
# 入力値チェック
if ($value.ToLower() -eq "y") {
$return = $true
break
}
elseif ($value.ToLower() -eq "n") {
$return = $false
$sbtemp=New-Object System.Text.StringBuilder
@("エラー : いいえを選択`r`n", `
" 処理を中断します。`r`n")|
ForEach-Object{[void]$sbtemp.Append($_)}
$prompt_message = $sbtemp.ToString()
Write-Host $prompt_message -ForegroundColor DarkRed
break
}
elseif ($i -eq $c_retry_count) {
$return = $false
$sbtemp=New-Object System.Text.StringBuilder
@("エラー : リトライ回数を超過`r`n", `
" リトライ回数(", `
[System.String]$c_retry_count, `
"回)を超過した為、処理を中断します。`r`n")|
ForEach-Object{[void]$sbtemp.Append($_)}
$prompt_message = $sbtemp.ToString()
Write-Host $prompt_message -ForegroundColor DarkRed
}
}
return $return
}
#################################################################################
# 処理名 |ValidateDrive
# 機能 |CDドライブの検証
#--------------------------------------------------------------------------------
# 戻り値 |Boolean(True: 正常終了, False: 異常終了)
# 引数 |drive: 対象ドライブ(ドライブレターのみ), drive_full: 対象ドライブ
#################################################################################
Function ValidateDrive([System.String]$drive, [System.String]$drive_full) {
[System.Boolean]$return = $false
[System.String]$prompt_message = ''
[System.Text.StringBuilder]$sbtemp=New-Object System.Text.StringBuilder
[System.Boolean]$is_exists = $false
[System.Int32]$now = 1
[System.Int32]$max = $c_wait_sec * $c_interval_sec
[System.Management.Automation.PSDriveInfo]$psdrive = $null
for($i=1; $i -le $c_interval_sec; $i++) {
$psdrive = Get-PSDrive $drive 2> $null
if ($null -ne $psdrive) {
[Object[]]$itemlist = Get-ChildItem "${drive_full}" | Sort-Object -Descending {$_.Name}
# CD内のファイル件数をカウント
if ($itemlist.Count -ge 1) {
$return = $true
$sbtemp=New-Object System.Text.StringBuilder
@("通知 : CDドライブの検証`r`n",`
" 正常にCDドライブを認識しました。`r`n")|
ForEach-Object{[void]$sbtemp.Append($_)}
$prompt_message = $sbtemp.ToString()
Write-Host $prompt_message
break
}
else {
$is_exists = $true
$sbtemp=New-Object System.Text.StringBuilder
@("エラー : CDドライブの検証`r`n",`
" CDドライブ内のデータがありませんでした。`r`n",`
" 処理を中断します。`r`n")|
ForEach-Object{[void]$sbtemp.Append($_)}
$prompt_message = $sbtemp.ToString()
Write-Host $prompt_message -ForegroundColor DarkRed
break
}
}
# スリープで待ち合わせ(読み込みに時間がかかった場合、後続処理が動いてしまう為)
Start-Sleep $c_wait_sec
$now = $c_wait_sec * $i
$sbtemp=New-Object System.Text.StringBuilder
@("通知 : CDドライブの検証`r`n",`
" チェック中。 経過時間 / 待ち時間 [ ${now} / ${max} sec ]`r`n",`
" CDを認識するまで少々、お待ちください。`r`n")|
ForEach-Object{[void]$sbtemp.Append($_)}
$prompt_message = $sbtemp.ToString()
Write-Host $prompt_message
}
# 待ち合わせたが、認識できなかった場合
if ((-Not $return) -And (-Not $is_exists)) {
$sbtemp=New-Object System.Text.StringBuilder
@("エラー : CDドライブの検証`r`n",`
" CDを認識できませんでした。`r`n",`
" 処理を中断します。`r`n")|
ForEach-Object{[void]$sbtemp.Append($_)}
$prompt_message = $sbtemp.ToString()
Write-Host $prompt_message -ForegroundColor DarkRed
}
return $return
}
#################################################################################
# 処理名 |ValidateFileformat
# 機能 |ファイル形式(ファイル名と拡張子)の検証
#--------------------------------------------------------------------------------
# 戻り値 |Boolean(True: 正常終了, False: 異常終了)
# 引数 |drive_full: 対象ドライブ
#################################################################################
Function ValidateFileformat([System.String]$drive_full) {
[System.Boolean]$return = $false
# ファイルの命名規則をチェック
$return = $true
[Object[]]$itemlist = Get-ChildItem "${drive_full}" | Sort-Object {$_.Name}
foreach($item in $itemlist) {
# ファイル名が下記の通りである事を検証
# 1~4桁目 : アルファベット(大文字・小文字を区別しない)
# ファイル種類: csvファイル or テキストファイル
if (-Not(($item.Name -match '^[A-z][A-z][A-z][A-z]') -And `
(($item.Name.ToLower() -match '\.csv$') -Or `
($item.Name.ToLower() -match '\.txt$')))) {
$return = $false
$sbtemp=New-Object System.Text.StringBuilder
@("エラー : ファイル名の検証`r`n",`
" 既定のファイル名ではありません。`r`n",`
" 対象ファイル: [$($item.FullName)]`r`n")|
ForEach-Object{[void]$sbtemp.Append($_)}
$prompt_message = $sbtemp.ToString()
Write-Host $prompt_message -ForegroundColor DarkRed
break
}
}
return $return
}
#################################################################################
# 処理名 |ValidateFiledetail
# 機能 |ファイル内の検証(文字列の有無を判定)
#--------------------------------------------------------------------------------
# 戻り値 |Boolean(True: 正常終了, False: 異常終了)
# 引数 |drive_full: 対象ドライブ, findrange: 検索範囲, findstring: 検索文字列
#################################################################################
Function ValidateFiledetail([System.String]$drive_full, [System.Int32]$findrange, [System.String]$findstring) {
[System.Boolean]$return = $false
[System.String]$without_ext = ''
[System.String]$prompt_message = ''
[System.Text.RegularExpressions.MatchCollection]$compared = $null
[System.Text.StringBuilder]$sbtemp=New-Object System.Text.StringBuilder
# CDドライブ内のファイル名の検証
[Object[]]$itemlist = Get-ChildItem "${drive_full}" | Sort-Object {$_.Name}
foreach($item in $itemlist) {
# 最終行から10行分の文字列を検索
$compared = [regex]::Matches((Get-Content $item.FullName -last $findrange),"${findstring}")
# ファイル名から拡張子を除外した文字列
$without_ext = [System.IO.Path]::GetFileNameWithoutExtension($item.FullName);
if ($compared.Count -ge 1) {
$return = $true
$sbtemp=New-Object System.Text.StringBuilder
@("通知 : ファイルの詳細を検証`r`n",`
" 検証結果: 成功($(($without_ext)))`r`n",`
" 検索の文字列「$(($findstring))」が見つかりました。`r`n",`
" 対象: [$($item.FullName)]`r`n")|
ForEach-Object{[void]$sbtemp.Append($_)}
$prompt_message = $sbtemp.ToString()
Write-Host $prompt_message -ForegroundColor Blue
}
else {
$return = $false
$sbtemp=New-Object System.Text.StringBuilder
@("エラー : ファイルの詳細を検証`r`n",`
" 検証結果: 失敗($(($without_ext)))`r`n",`
" 検索の文字列「$(($findstring))」が見つかりませんでした。`r`n",`
" 対象: [$($item.FullName)]`r`n")|
ForEach-Object{[void]$sbtemp.Append($_)}
$prompt_message = $sbtemp.ToString()
Write-Host $prompt_message -ForegroundColor DarkRed
break
}
}
return $return
}
#################################################################################
# 処理名 |ConfirmLoop
# 機能 |くり返し確認
#--------------------------------------------------------------------------------
# 戻り値 |Boolean(True: 繰り返す, False: 繰り返し終了)
# 引数 |-
#################################################################################
Function ConfirmLoop() {
[System.Boolean]$return = $false
[System.String]$prompt_message = ''
[System.Text.StringBuilder]$sbtemp=New-Object System.Text.StringBuilder
$return = $true
# くり返し有無を確認
@("確認 : くり返し有無の確認`r`n",`
" 処理が終了しました。続けて処理しますか?`r`n",`
" [ y: はい、n: いいえ ]`r`n",`
"`r`n",`
"入力 ")|
ForEach-Object{[void]$sbtemp.Append($_)}
$prompt_message = $sbtemp.ToString()
# YesNo入力
$return = ConfirmYesno $prompt_message
return $return
}
#################################################################################
# 処理名 |メイン処理
# 機能 |同上
#--------------------------------------------------------------------------------
# |-
#################################################################################
# 変数
[System.Int32]$result = 0
[System.Boolean]$return = $false
[System.String]$prompt_message = ''
[System.String]$result_message = ''
[System.Text.StringBuilder]$sbtemp=New-Object System.Text.StringBuilder
# 設定ファイ読み込み
[System.String]$config_path = @(Split-Path $script:MyInvocation.MyCommand.path -parent).Trim()
$sbtemp=New-Object System.Text.StringBuilder
@("$config_path",`
"\",`
"$c_config_file")|
ForEach-Object{[void]$sbtemp.Append($_)}
[System.String]$config_fullpath = $sbtemp.ToString()
try {
[System.Collections.Hashtable]$param = Get-Content $config_fullpath -Raw -Encoding UTF8 | ConvertFrom-StringData
# ドライブパス作成
[System.String]$drive = $param.DriveLatter
[System.String]$drive_full = ''
[System.Text.StringBuilder]$sbtemp=New-Object System.Text.StringBuilder
@("${drive}",":\")|
ForEach-Object{[void]$sbtemp.Append($_)}
$drive_full = $sbtemp.ToString()
# 検索範囲
[System.Int32]$findrange = $param.FindRange
# 検索文字列
# [System.String]$findstring = $param.FindString
[System.String]$findstring = ExpandString($param.FindString)
$sbtemp=New-Object System.Text.StringBuilder
@("通知 : 設定ファイル読み込み`r`n",`
" 設定ファイルの読み込みが正常終了しました。`r`n",`
" 対象: [${config_fullpath}]`r`n")|
ForEach-Object{[void]$sbtemp.Append($_)}
$prompt_message = $sbtemp.ToString()
Write-Host $prompt_message
}
catch {
$result = -101
$sbtemp=New-Object System.Text.StringBuilder
@("エラー : 設定ファイル読み込み`r`n",`
" 設定ファイルの読み込みが異常終了しました。`r`n",`
" エラー内容: [${config_fullpath}",`
"$($_.Exception.Message)]`r`n")|
ForEach-Object{[void]$sbtemp.Append($_)}
$result_message = $sbtemp.ToString()
}
# CDトレイを自動でオープン(くり返し開始前)
if ($result -eq 0) {
$return = $false
$return = OpenCdtray($drive_full)
if (-Not $return) {
$result = -201
}
}
# くり返し開始
[System.Int32]$count = 0
for ($count = 1; $count -le $c_for_count; $count++) {
# CDトレイにCDメディアを手動で挿入(セット)
if ($result -eq 0) {
$return = $false
$return = InsertCD $c_cdlabel
if (-Not $return) {
$result = -301
}
}
# CDドライブの検証
if ($result -eq 0) {
$return = $false
$return = ValidateDrive $drive $drive_full
if (-Not $return) {
$result = -401
}
}
# ファイル形式(ファイル名と拡張子)の検証
if ($result -eq 0) {
$return = $false
$return = ValidateFileformat $drive_full
if (-Not $return) {
$result = -402
}
}
# ファイル内の検証(文字列の有無を判定)
if ($result -eq 0) {
$return = $false
$return = ValidateFiledetail $drive_full $findrange $findstring
if (-Not $return) {
$result = -403
}
}
# CDトレイを自動でオープン(くり返し終了前)
if ($result -ne -201) {
$return = OpenCdtray $drive_full
if (-Not $return) {
$result = -501
}
}
# 処理結果の表示
$sbtemp=New-Object System.Text.StringBuilder
if ($result -eq 0) {
@("処理結果 : 正常終了`r`n",`
" メッセージコード: [${result}]`r`n")|
ForEach-Object{[void]$sbtemp.Append($_)}
$result_message = $sbtemp.ToString()
Write-Host $result_message
}
else {
@("処理結果 : 異常終了`r`n",`
" メッセージコード: [${result}]`r`n")|
ForEach-Object{[void]$sbtemp.Append($_)}
$result_message = $sbtemp.ToString()
Write-Host $result_message -ForegroundColor DarkRed
}
# くり返し確認
$return = $false
# 正常終了時に繰り返すか確認
if ($result -eq 0) {
$return = ConfirmLoop
}
# 異常終了、または処理中断した場合はくり返し終了
if (-Not $return) {
break
}
}
# 終了
exit $result