質問編集履歴

4

問題の再現が出来ました。

2018/12/04 01:06

投稿

kamikazelight
kamikazelight

スコア305

test CHANGED
File without changes
test CHANGED
@@ -58,7 +58,7 @@
58
58
 
59
59
 
60
60
 
61
- ### 該当のソースコードに近いコード(問題再現できない....)
61
+ ### 該当のソースコードに近いコード(二台以上のPCで問題再現が出来ました)
62
62
 
63
63
 
64
64
 
@@ -288,111 +288,267 @@
288
288
 
289
289
  $NewBook = {
290
290
 
291
- Param($Path)
291
+ #Param($Path)
292
292
 
293
293
  $App = New-Object -ComObject "Excel.Application"
294
294
 
295
295
 
296
296
 
297
- if($Path -eq "")
297
+ #if($Path -eq "")
298
+
299
+ #{
300
+
301
+ $null = $App.WorkBooks.Add()
302
+
303
+ Write-host "新規ブック"
304
+
305
+ #}
306
+
307
+ #else
308
+
309
+ #{
310
+
311
+ # $null = $App.WorkBooks.Add("$Path")
312
+
313
+ # Write-host "既存ブックをテンプレートとして立ち上げ"
314
+
315
+ #}
316
+
317
+
318
+
319
+ $App
320
+
321
+ }
322
+
323
+
324
+
325
+ clear-host
326
+
327
+ $Error.Clear()
328
+
329
+ try
330
+
331
+ {
332
+
333
+
334
+
335
+
336
+
337
+
338
+
339
+ 1..2 | foreach { $Thread.AddThread($NewBook<#,$Add_Args#>) }
340
+
341
+
342
+
343
+ while(!($Thread.AllCompleted)) {Start-Sleep -Milliseconds 5}
344
+
345
+
346
+
347
+ if ($OpenPath -ne "")
298
348
 
299
349
  {
300
350
 
301
- $null = $App.WorkBooks.Add()
302
-
303
- Write-host "新規ブック"
351
+ Remove-Item -Path $OpenPath
304
352
 
305
353
  }
306
354
 
355
+
356
+
357
+ $Apps = $($Thread.GetResult())
358
+
359
+
360
+
361
+ $Apps | foreach { $_.Caption = "Test_Apps" }
362
+
363
+
364
+
365
+ $App = $Apps[0]
366
+
367
+
368
+
369
+ $BK = $App.ActiveWorkbook
370
+
371
+
372
+
373
+ $BK2 = $Apps[1].ActiveWorkbook
374
+
375
+
376
+
377
+ $Sh = $App.ActiveSheet
378
+
379
+
380
+
307
- else
381
+ $i = 0
382
+
383
+
384
+
385
+ $Tmp = "$PSScriptRoot\tmp2.xlsx"
386
+
387
+
388
+
389
+ if (Test-Path -Path $Tmp)
308
390
 
309
391
  {
310
392
 
311
- $null = $App.WorkBooks.Add($Path)
393
+ Remove-Item -Path $Tmp
312
-
313
- Write-host "既存ブックをテンプレートとして立ち上げ"
314
394
 
315
395
  }
316
396
 
397
+
398
+
399
+ $Bk2.saveAs("$Tmp")
400
+
401
+
402
+
403
+ $Bk2.close($false)
404
+
405
+
406
+
407
+ $Bk2 = $Apps[0].Workbooks.Open($Tmp)
408
+
317
409
 
318
410
 
411
+ 1..10 | foreach { $Bk2.Sheets(1).Copy($Sh) }
412
+
413
+
414
+
415
+
416
+
417
+ $BK.Sheets(1).Activate()
418
+
419
+
420
+
421
+ $App.DisplayAlerts = $false
422
+
423
+
424
+
425
+
426
+
427
+ Write-host "残りシートが5になるまで削除"
428
+
429
+ while($BK.sheets.Count -gt 5){
430
+
431
+ $Try = $true
432
+
433
+ while ($Try)
434
+
435
+ {
436
+
437
+
438
+
439
+ try
440
+
441
+ {
442
+
443
+ $BK.Sheets(6).Delete()
444
+
445
+ $Try = $false
446
+
447
+ }
448
+
319
- $App
449
+ catch
450
+
451
+ {
452
+
453
+ Write-host "Delete Retry"
454
+
455
+ }
456
+
457
+
458
+
459
+ }
460
+
461
+ }
462
+
463
+
464
+
465
+ Write-host "$ExcelPath`に保存"
466
+
467
+ $Try = $true
468
+
469
+ while ($Try)
470
+
471
+ {
472
+
473
+
474
+
475
+ try
476
+
477
+ {
478
+
479
+ $null = $BK.SaveAs("$ExcelPath")
480
+
481
+ $Try = $false
482
+
483
+ }
484
+
485
+ catch
486
+
487
+ {
488
+
489
+ Write-host "Save Retry"
490
+
491
+ }
492
+
493
+
494
+
495
+ }
496
+
497
+
498
+
499
+ $Apps | foreach { $_.WorkBooks | foreach {$_.close($false) } }
500
+
501
+
320
502
 
321
503
  }
322
504
 
323
-
324
-
325
- try
505
+ catch
326
506
 
327
507
  {
328
508
 
329
-
330
-
331
- $Add_Args = @{
332
-
333
- Path = $OpenPath
509
+ Write-Host "$Error"
334
-
510
+
335
- }
511
+ }
512
+
513
+ finally
514
+
515
+ {
516
+
517
+ Write-Host "クリーンアップしています..."
336
518
 
337
519
 
338
520
 
339
- 1..5 | foreach { $Thread.AddThread($NewBook,$Add_Args) }
340
-
341
-
342
-
343
- while(!($Thread.AllCompleted)) {Start-Sleep -Milliseconds 5}
344
-
345
-
346
-
347
- $Apps = $($Thread.GetResult())
521
+ $null = [Marshal]::FinalReleaseComObject($Sh)
522
+
348
-
523
+ $null = [Marshal]::FinalReleaseComObject($Bk)
349
-
350
-
524
+
351
- $Apps | foreach { $_.Caption = "Test_Apps" }
525
+ $null = [Marshal]::FinalReleaseComObject($Bk2)
352
-
353
-
354
-
355
- $App = $Apps[0]
526
+
356
-
357
-
358
-
359
- $Sh = $App.ActiveSheet
360
-
361
-
362
-
363
- $i = 0
364
-
365
-
366
-
367
- Write-host "セルに適当に値書き込み"
368
-
369
- $Sh.cells(1,1).resize(100,10) | foreach { $i++; $_.Value = $i}
370
-
371
-
372
-
373
- Write-host "100回シートコピー"
374
-
375
- 1..100 | foreach{ $Sh.Copy($Sh) }
527
+ $Apps | foreach { $_.quit() }
376
-
377
-
378
-
528
+
379
- $BK = $App.ActiveWorkbook
529
+ $null = $Apps | foreach { [Marshal]::FinalReleaseComObject($_) }
380
-
381
-
382
-
530
+
383
- $BK.Sheets(1).Activate()
531
+ $Thread.Dispose()
384
-
385
-
386
-
532
+
387
- $App.DisplayAlerts = $false
533
+ Remove-Item -Path $ExcelPath
388
-
389
-
390
-
391
-
392
-
393
- Write-host "残りシートが10になるまで削除"
534
+
394
-
395
- while($BK.sheets.Count -gt 10){
535
+ Remove-Item -Path $Tmp
536
+
537
+ }
538
+
539
+
540
+
541
+ ```
542
+
543
+
544
+
545
+ ### 試したこと
546
+
547
+
548
+
549
+ ・リトライ
550
+
551
+ ```powershell
396
552
 
397
553
  $Try = $true
398
554
 
@@ -406,7 +562,7 @@
406
562
 
407
563
  {
408
564
 
409
- $BK.sheets(11).delete()
565
+ $BK.Sheets($($Page + $Index + 1)).Delete()
410
566
 
411
567
  $Try = $false
412
568
 
@@ -424,111 +580,19 @@
424
580
 
425
581
  }
426
582
 
427
- }
428
-
429
-
430
-
431
- Write-host "$ExcelPath`に保存"
432
-
433
- $BK.SaveAs($ExcelPath)
434
-
435
-
436
-
437
- $App.WorkBooks | where { $_ -ne $null } | foreach {$_.close($false)}
438
-
439
-
440
-
441
- Start-Process -FilePath $ExcelPath
442
-
443
-
444
-
445
-
446
-
447
- }
448
-
449
- catch
450
-
451
- {
452
-
453
- Write-Host "Err"
454
-
455
- }
456
-
457
- finally
458
-
459
- {
460
-
461
- Write-Host "クリーンアップしています..."
462
-
463
-
464
-
465
- $null = [Marshal]::FinalReleaseComObject($Sh)
466
-
467
- $null = [Marshal]::FinalReleaseComObject($Bk)
468
-
469
- $Apps | foreach { $_.quit() }
470
-
471
- $null = $Apps | foreach { [Marshal]::FinalReleaseComObject($_) }
472
-
473
- $Thread.Dispose()
474
-
475
- }
476
-
477
-
478
-
479
-
480
-
481
583
  ```
482
584
 
483
-
484
-
485
- ### 試したこと
486
-
487
-
488
-
489
- ・リトライ
490
-
491
- ```powershell
492
-
493
- $Try = $true
494
-
495
- while ($Try)
496
-
497
- {
498
-
499
-
500
-
501
- try
502
-
503
- {
504
-
505
- $BK.Sheets($($Page + $Index + 1)).Delete()
506
-
507
- $Try = $false
508
-
509
- }
510
-
511
- catch
512
-
513
- {
514
-
515
- Write-host "Delete Retry"
516
-
517
- }
518
-
519
-
520
-
521
- }
522
-
523
- ```
524
-
525
585
  ・Start-Sleep
526
586
 
527
587
 
528
588
 
529
- ・問題が起きているのと同じようなコードを書いてみたのですが
589
+ ~~・問題が起きているのと同じようなコードを書いてみたのですが
530
-
590
+
531
- 問題が再現できませんでした....
591
+ 問題が再現できませんでした....~~
592
+
593
+ 二台以上のPCで問題の再現が出来ました。
594
+
595
+
532
596
 
533
597
 
534
598
 

3

問題の起きてるコードにさらに似せてみましたが、問題再現できず

2018/12/04 01:06

投稿

kamikazelight
kamikazelight

スコア305

test CHANGED
File without changes
test CHANGED
@@ -356,10 +356,6 @@
356
356
 
357
357
 
358
358
 
359
- $App.Visible = $true
360
-
361
-
362
-
363
359
  $Sh = $App.ActiveSheet
364
360
 
365
361
 
@@ -380,12 +376,18 @@
380
376
 
381
377
 
382
378
 
379
+ $BK = $App.ActiveWorkbook
380
+
381
+
382
+
383
+ $BK.Sheets(1).Activate()
384
+
385
+
386
+
383
387
  $App.DisplayAlerts = $false
384
388
 
385
389
 
386
390
 
387
- $BK = $App.ActiveWorkbook
388
-
389
391
 
390
392
 
391
393
  Write-host "残りシートが10になるまで削除"
@@ -432,6 +434,14 @@
432
434
 
433
435
 
434
436
 
437
+ $App.WorkBooks | where { $_ -ne $null } | foreach {$_.close($false)}
438
+
439
+
440
+
441
+ Start-Process -FilePath $ExcelPath
442
+
443
+
444
+
435
445
 
436
446
 
437
447
  }
@@ -450,7 +460,7 @@
450
460
 
451
461
  Write-Host "クリーンアップしています..."
452
462
 
453
- $App.WorkBooks | where { $_ -ne $null } | foreach {$_.close($false)}
463
+
454
464
 
455
465
  $null = [Marshal]::FinalReleaseComObject($Sh)
456
466
 
@@ -466,6 +476,8 @@
466
476
 
467
477
 
468
478
 
479
+
480
+
469
481
  ```
470
482
 
471
483
 

2

修正

2018/12/03 05:53

投稿

kamikazelight
kamikazelight

スコア305

test CHANGED
File without changes
test CHANGED
@@ -390,7 +390,39 @@
390
390
 
391
391
  Write-host "残りシートが10になるまで削除"
392
392
 
393
- while($BK.sheets.Count -gt 10){$BK.sheets(11).delete()}
393
+ while($BK.sheets.Count -gt 10){
394
+
395
+ $Try = $true
396
+
397
+ while ($Try)
398
+
399
+ {
400
+
401
+
402
+
403
+ try
404
+
405
+ {
406
+
407
+ $BK.sheets(11).delete()
408
+
409
+ $Try = $false
410
+
411
+ }
412
+
413
+ catch
414
+
415
+ {
416
+
417
+ Write-host "Delete Retry"
418
+
419
+ }
420
+
421
+
422
+
423
+ }
424
+
425
+ }
394
426
 
395
427
 
396
428
 

1

近いコードの記載

2018/12/03 05:37

投稿

kamikazelight
kamikazelight

スコア305

test CHANGED
File without changes
test CHANGED
@@ -58,11 +58,383 @@
58
58
 
59
59
 
60
60
 
61
+ ### 該当のソースコードに近いコード(問題が再現できない....)
62
+
63
+
64
+
65
+ ```powershell
66
+
67
+ <#
68
+
69
+ 情報源
70
+
71
+ guitarrapc_tech 様
72
+
73
+ タイトル : PowerShell による同期処理、非同期処理、並列処理 を考えてみる
74
+
75
+ URL : http://tech.guitarrapc.com/entry/2013/10/29/100946
76
+
77
+
78
+
79
+ *** 様
80
+
81
+ タイトル : [properties] Powershellクラスはget setプロパティを実装します
82
+
83
+ URL : https://code-examples.net/ja/q/25e096e
84
+
85
+ #>
86
+
87
+ using namespace System.Management.Automation.Runspaces;
88
+
89
+ using namespace System.Collections;
90
+
91
+ using namespace System.Threading;
92
+
93
+ using namespace System.Runtime.InteropServices
94
+
95
+
96
+
97
+ # クラスを定義します
98
+
99
+ class _MultiThread
100
+
101
+ {
102
+
103
+
104
+
105
+ # ノーマル プロパティ
106
+
107
+ [array] $RunspaceCollection
108
+
109
+
110
+
111
+ # 非表示 プロパティ
112
+
113
+ hidden [RunspacePool] $runspacePool
114
+
115
+
116
+
117
+ # 完了 プロパティ
118
+
119
+ hidden [bool]$_AllCompleted = $($this | Add-Member ScriptProperty -Name 'AllCompleted' -Value {
120
+
121
+ $($this.runspaceCollection.RunSpace | sort IsCompleted -Unique).IsCompleted -eq $true
122
+
123
+ })
124
+
125
+
126
+
61
- ### 該当のソー
127
+ # コントラクタ
128
+
62
-
129
+ _MultiThread ($MyHost)
130
+
63
-
131
+ {
132
+
64
-
133
+ # create Runspace
134
+
135
+ [initialsessionstate] $sessionstate = [initialsessionstate]::CreateDefault()
136
+
137
+ [int] $minPoolSize = [int] $maxPoolSize = 5000
138
+
139
+ $this.runspacePool = [runspacefactory]::CreateRunspacePool($minPoolSize, $maxPoolSize, $sessionstate, $MyHost) # create Runspace Pool
140
+
141
+ $this.runspacePool.ApartmentState = "STA"
142
+
65
- ※どこまで載せていいのか分からないので 要求されたら 都度追加いたします。
143
+ $this.runspacePool.Open() # open pool
144
+
145
+ }
146
+
147
+
148
+
149
+ # スレッドの追加
150
+
151
+ [void]AddThread([scriptblock]$ScriptBlock)
152
+
153
+ {
154
+
155
+ # Main Invokation
156
+
157
+ [powershell] $powershell = [PowerShell]::Create().AddScript($ScriptBlock)
158
+
159
+ $powershell.RunspacePool = $this.runspacePool
160
+
161
+ $this.RunspaceCollection += New-Object -TypeName PSObject -Property @{
162
+
163
+ Runspace = $powershell.BeginInvoke();
164
+
165
+ powershell = $powershell
166
+
167
+ }
168
+
169
+ # $powershell.Dispose()
170
+
171
+ }
172
+
173
+
174
+
175
+ # スレッドの追加
176
+
177
+ [void]AddThread([scriptblock]$ScriptBlock,[psobject]$Parameters)
178
+
179
+ {
180
+
181
+ # Main Invokation
182
+
183
+ [powershell] $powershell = [PowerShell]::Create().AddScript($ScriptBlock).AddParameters($Parameters)
184
+
185
+ $powershell.RunspacePool = $this.runspacePool
186
+
187
+ $this.RunspaceCollection += New-Object -TypeName PSObject -Property $(
188
+
189
+ [ordered]@{
190
+
191
+ Runspace = $powershell.BeginInvoke();
192
+
193
+ powershell = $powershell
194
+
195
+ }
196
+
197
+ )
198
+
199
+ }
200
+
201
+
202
+
203
+
204
+
205
+ # 結果の取得
206
+
207
+ [object]GetResult()
208
+
209
+ {
210
+
211
+ # get process result and end powershell session
212
+
213
+ return $(foreach ($runspace in $this.runspaceCollection)
214
+
215
+ {
216
+
217
+ # get reuslt
218
+
219
+ $runspace.powershell.EndInvoke($runspace.Runspace)
220
+
221
+ })
222
+
223
+ }
224
+
225
+
226
+
227
+ # デストラクタの代わり手動で実行
228
+
229
+ [void]Dispose()
230
+
231
+ {
232
+
233
+ if (!($this.runspacePool.runspacePool.IsDisposed))
234
+
235
+ {
236
+
237
+ foreach ($Runspace in $this.RunspaceCollection)
238
+
239
+ {
240
+
241
+ $Runspace.powershell.Dispose()
242
+
243
+ }
244
+
245
+
246
+
247
+ # Dispose Runspace
248
+
249
+ $this.runspacePool.Dispose()
250
+
251
+ }
252
+
253
+ }
254
+
255
+ }
256
+
257
+
258
+
259
+ function _New_MultiThread()
260
+
261
+ {
262
+
263
+ [OutputType([_MultiThread])]
264
+
265
+ $Thread = New-Object _MultiThread($host)
266
+
267
+ return $Thread
268
+
269
+ }
270
+
271
+
272
+
273
+ $ExcelPath = "$PSScriptRoot\Tmp.xlsx"
274
+
275
+ $OpenPath = ""
276
+
277
+ if (Test-Path -Path $ExcelPath)
278
+
279
+ {
280
+
281
+ $OpenPath = $ExcelPath
282
+
283
+ }
284
+
285
+ $Thread = _New_MultiThread
286
+
287
+
288
+
289
+ $NewBook = {
290
+
291
+ Param($Path)
292
+
293
+ $App = New-Object -ComObject "Excel.Application"
294
+
295
+
296
+
297
+ if($Path -eq "")
298
+
299
+ {
300
+
301
+ $null = $App.WorkBooks.Add()
302
+
303
+ Write-host "新規ブック"
304
+
305
+ }
306
+
307
+ else
308
+
309
+ {
310
+
311
+ $null = $App.WorkBooks.Add($Path)
312
+
313
+ Write-host "既存ブックをテンプレートとして立ち上げ"
314
+
315
+ }
316
+
317
+
318
+
319
+ $App
320
+
321
+ }
322
+
323
+
324
+
325
+ try
326
+
327
+ {
328
+
329
+
330
+
331
+ $Add_Args = @{
332
+
333
+ Path = $OpenPath
334
+
335
+ }
336
+
337
+
338
+
339
+ 1..5 | foreach { $Thread.AddThread($NewBook,$Add_Args) }
340
+
341
+
342
+
343
+ while(!($Thread.AllCompleted)) {Start-Sleep -Milliseconds 5}
344
+
345
+
346
+
347
+ $Apps = $($Thread.GetResult())
348
+
349
+
350
+
351
+ $Apps | foreach { $_.Caption = "Test_Apps" }
352
+
353
+
354
+
355
+ $App = $Apps[0]
356
+
357
+
358
+
359
+ $App.Visible = $true
360
+
361
+
362
+
363
+ $Sh = $App.ActiveSheet
364
+
365
+
366
+
367
+ $i = 0
368
+
369
+
370
+
371
+ Write-host "セルに適当に値書き込み"
372
+
373
+ $Sh.cells(1,1).resize(100,10) | foreach { $i++; $_.Value = $i}
374
+
375
+
376
+
377
+ Write-host "100回シートコピー"
378
+
379
+ 1..100 | foreach{ $Sh.Copy($Sh) }
380
+
381
+
382
+
383
+ $App.DisplayAlerts = $false
384
+
385
+
386
+
387
+ $BK = $App.ActiveWorkbook
388
+
389
+
390
+
391
+ Write-host "残りシートが10になるまで削除"
392
+
393
+ while($BK.sheets.Count -gt 10){$BK.sheets(11).delete()}
394
+
395
+
396
+
397
+ Write-host "$ExcelPath`に保存"
398
+
399
+ $BK.SaveAs($ExcelPath)
400
+
401
+
402
+
403
+
404
+
405
+ }
406
+
407
+ catch
408
+
409
+ {
410
+
411
+ Write-Host "Err"
412
+
413
+ }
414
+
415
+ finally
416
+
417
+ {
418
+
419
+ Write-Host "クリーンアップしています..."
420
+
421
+ $App.WorkBooks | where { $_ -ne $null } | foreach {$_.close($false)}
422
+
423
+ $null = [Marshal]::FinalReleaseComObject($Sh)
424
+
425
+ $null = [Marshal]::FinalReleaseComObject($Bk)
426
+
427
+ $Apps | foreach { $_.quit() }
428
+
429
+ $null = $Apps | foreach { [Marshal]::FinalReleaseComObject($_) }
430
+
431
+ $Thread.Dispose()
432
+
433
+ }
434
+
435
+
436
+
437
+ ```
66
438
 
67
439
 
68
440
 
@@ -110,6 +482,12 @@
110
482
 
111
483
 
112
484
 
485
+ ・問題が起きているのと同じようなコードを書いてみたのですが
486
+
487
+ 問題が再現できませんでした....
488
+
489
+
490
+
113
491
  ### 補足情報(FW/ツールのバージョンなど)
114
492
 
115
493