質問編集履歴
4
問題の再現が出来ました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -28,7 +28,7 @@
|
|
28
28
|
+ FullyQualifiedErrorId : System.Runtime.InteropServices.COMException
|
29
29
|
```
|
30
30
|
|
31
|
-
### 該当のソースコードに近いコード(問題
|
31
|
+
### 該当のソースコードに近いコード(二台以上のPCで問題の再現が出来ました)
|
32
32
|
|
33
33
|
```powershell
|
34
34
|
<#
|
@@ -143,66 +143,83 @@
|
|
143
143
|
$Thread = _New_MultiThread
|
144
144
|
|
145
145
|
$NewBook = {
|
146
|
-
Param($Path)
|
146
|
+
#Param($Path)
|
147
147
|
$App = New-Object -ComObject "Excel.Application"
|
148
148
|
|
149
|
-
if($Path -eq "")
|
149
|
+
#if($Path -eq "")
|
150
|
-
{
|
150
|
+
#{
|
151
151
|
$null = $App.WorkBooks.Add()
|
152
152
|
Write-host "新規ブック"
|
153
|
-
}
|
153
|
+
#}
|
154
|
-
else
|
154
|
+
#else
|
155
|
-
{
|
155
|
+
#{
|
156
|
-
|
156
|
+
# $null = $App.WorkBooks.Add("$Path")
|
157
|
-
|
157
|
+
# Write-host "既存ブックをテンプレートとして立ち上げ"
|
158
|
-
}
|
158
|
+
#}
|
159
159
|
|
160
160
|
$App
|
161
161
|
}
|
162
162
|
|
163
|
+
clear-host
|
164
|
+
$Error.Clear()
|
163
165
|
try
|
164
166
|
{
|
165
167
|
|
166
|
-
|
168
|
+
|
167
|
-
Path = $OpenPath
|
168
|
-
}
|
169
169
|
|
170
|
-
1..
|
170
|
+
1..2 | foreach { $Thread.AddThread($NewBook<#,$Add_Args#>) }
|
171
171
|
|
172
172
|
while(!($Thread.AllCompleted)) {Start-Sleep -Milliseconds 5}
|
173
173
|
|
174
|
+
if ($OpenPath -ne "")
|
175
|
+
{
|
176
|
+
Remove-Item -Path $OpenPath
|
177
|
+
}
|
178
|
+
|
174
179
|
$Apps = $($Thread.GetResult())
|
175
180
|
|
176
181
|
$Apps | foreach { $_.Caption = "Test_Apps" }
|
177
182
|
|
178
183
|
$App = $Apps[0]
|
179
184
|
|
185
|
+
$BK = $App.ActiveWorkbook
|
186
|
+
|
187
|
+
$BK2 = $Apps[1].ActiveWorkbook
|
188
|
+
|
180
189
|
$Sh = $App.ActiveSheet
|
181
190
|
|
182
191
|
$i = 0
|
183
192
|
|
193
|
+
$Tmp = "$PSScriptRoot\tmp2.xlsx"
|
194
|
+
|
195
|
+
if (Test-Path -Path $Tmp)
|
196
|
+
{
|
197
|
+
Remove-Item -Path $Tmp
|
198
|
+
}
|
199
|
+
|
184
|
-
|
200
|
+
$Bk2.saveAs("$Tmp")
|
201
|
+
|
202
|
+
$Bk2.close($false)
|
203
|
+
|
185
|
-
$
|
204
|
+
$Bk2 = $Apps[0].Workbooks.Open($Tmp)
|
186
205
|
|
187
|
-
Write-host "100回シートコピー"
|
188
|
-
1..
|
206
|
+
1..10 | foreach { $Bk2.Sheets(1).Copy($Sh) }
|
189
207
|
|
190
|
-
$BK = $App.ActiveWorkbook
|
191
208
|
|
192
209
|
$BK.Sheets(1).Activate()
|
193
210
|
|
194
211
|
$App.DisplayAlerts = $false
|
195
212
|
|
196
213
|
|
197
|
-
Write-host "残りシートが
|
214
|
+
Write-host "残りシートが5になるまで削除"
|
198
|
-
while($BK.sheets.Count -gt
|
215
|
+
while($BK.sheets.Count -gt 5){
|
199
216
|
$Try = $true
|
200
217
|
while ($Try)
|
201
218
|
{
|
202
219
|
|
203
220
|
try
|
204
221
|
{
|
205
|
-
$BK.
|
222
|
+
$BK.Sheets(6).Delete()
|
206
223
|
$Try = $false
|
207
224
|
}
|
208
225
|
catch
|
@@ -214,17 +231,28 @@
|
|
214
231
|
}
|
215
232
|
|
216
233
|
Write-host "$ExcelPath`に保存"
|
234
|
+
$Try = $true
|
235
|
+
while ($Try)
|
236
|
+
{
|
237
|
+
|
238
|
+
try
|
239
|
+
{
|
217
|
-
|
240
|
+
$null = $BK.SaveAs("$ExcelPath")
|
241
|
+
$Try = $false
|
242
|
+
}
|
243
|
+
catch
|
244
|
+
{
|
245
|
+
Write-host "Save Retry"
|
246
|
+
}
|
218
247
|
|
219
|
-
|
248
|
+
}
|
220
249
|
|
221
|
-
|
250
|
+
$Apps | foreach { $_.WorkBooks | foreach {$_.close($false) } }
|
222
251
|
|
223
|
-
|
224
252
|
}
|
225
253
|
catch
|
226
254
|
{
|
227
|
-
Write-Host "
|
255
|
+
Write-Host "$Error"
|
228
256
|
}
|
229
257
|
finally
|
230
258
|
{
|
@@ -232,12 +260,14 @@
|
|
232
260
|
|
233
261
|
$null = [Marshal]::FinalReleaseComObject($Sh)
|
234
262
|
$null = [Marshal]::FinalReleaseComObject($Bk)
|
263
|
+
$null = [Marshal]::FinalReleaseComObject($Bk2)
|
235
264
|
$Apps | foreach { $_.quit() }
|
236
265
|
$null = $Apps | foreach { [Marshal]::FinalReleaseComObject($_) }
|
237
266
|
$Thread.Dispose()
|
267
|
+
Remove-Item -Path $ExcelPath
|
268
|
+
Remove-Item -Path $Tmp
|
238
269
|
}
|
239
270
|
|
240
|
-
|
241
271
|
```
|
242
272
|
|
243
273
|
### 試したこと
|
@@ -262,9 +292,11 @@
|
|
262
292
|
```
|
263
293
|
・Start-Sleep
|
264
294
|
|
265
|
-
・問題が起きているのと同じようなコードを書いてみたのですが
|
295
|
+
~~・問題が起きているのと同じようなコードを書いてみたのですが
|
266
|
-
問題が再現できませんでした....
|
296
|
+
問題が再現できませんでした....~~
|
297
|
+
二台以上のPCで問題の再現が出来ました。
|
267
298
|
|
299
|
+
|
268
300
|
### 補足情報(FW/ツールのバージョンなど)
|
269
301
|
|
270
302
|
Win10
|
3
問題の起きてるコードにさらに似せてみましたが、問題再現できず
title
CHANGED
File without changes
|
body
CHANGED
@@ -177,8 +177,6 @@
|
|
177
177
|
|
178
178
|
$App = $Apps[0]
|
179
179
|
|
180
|
-
$App.Visible = $true
|
181
|
-
|
182
180
|
$Sh = $App.ActiveSheet
|
183
181
|
|
184
182
|
$i = 0
|
@@ -189,9 +187,12 @@
|
|
189
187
|
Write-host "100回シートコピー"
|
190
188
|
1..100 | foreach{ $Sh.Copy($Sh) }
|
191
189
|
|
190
|
+
$BK = $App.ActiveWorkbook
|
191
|
+
|
192
|
+
$BK.Sheets(1).Activate()
|
193
|
+
|
192
194
|
$App.DisplayAlerts = $false
|
193
195
|
|
194
|
-
$BK = $App.ActiveWorkbook
|
195
196
|
|
196
197
|
Write-host "残りシートが10になるまで削除"
|
197
198
|
while($BK.sheets.Count -gt 10){
|
@@ -215,7 +216,11 @@
|
|
215
216
|
Write-host "$ExcelPath`に保存"
|
216
217
|
$BK.SaveAs($ExcelPath)
|
217
218
|
|
219
|
+
$App.WorkBooks | where { $_ -ne $null } | foreach {$_.close($false)}
|
218
220
|
|
221
|
+
Start-Process -FilePath $ExcelPath
|
222
|
+
|
223
|
+
|
219
224
|
}
|
220
225
|
catch
|
221
226
|
{
|
@@ -224,7 +229,7 @@
|
|
224
229
|
finally
|
225
230
|
{
|
226
231
|
Write-Host "クリーンアップしています..."
|
227
|
-
|
232
|
+
|
228
233
|
$null = [Marshal]::FinalReleaseComObject($Sh)
|
229
234
|
$null = [Marshal]::FinalReleaseComObject($Bk)
|
230
235
|
$Apps | foreach { $_.quit() }
|
@@ -232,6 +237,7 @@
|
|
232
237
|
$Thread.Dispose()
|
233
238
|
}
|
234
239
|
|
240
|
+
|
235
241
|
```
|
236
242
|
|
237
243
|
### 試したこと
|
2
修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -194,8 +194,24 @@
|
|
194
194
|
$BK = $App.ActiveWorkbook
|
195
195
|
|
196
196
|
Write-host "残りシートが10になるまで削除"
|
197
|
-
while($BK.sheets.Count -gt 10){
|
197
|
+
while($BK.sheets.Count -gt 10){
|
198
|
+
$Try = $true
|
199
|
+
while ($Try)
|
200
|
+
{
|
201
|
+
|
202
|
+
try
|
203
|
+
{
|
204
|
+
$BK.sheets(11).delete()
|
205
|
+
$Try = $false
|
206
|
+
}
|
207
|
+
catch
|
208
|
+
{
|
209
|
+
Write-host "Delete Retry"
|
210
|
+
}
|
198
211
|
|
212
|
+
}
|
213
|
+
}
|
214
|
+
|
199
215
|
Write-host "$ExcelPath`に保存"
|
200
216
|
$BK.SaveAs($ExcelPath)
|
201
217
|
|
1
近いコードの記載
title
CHANGED
File without changes
|
body
CHANGED
@@ -28,10 +28,196 @@
|
|
28
28
|
+ FullyQualifiedErrorId : System.Runtime.InteropServices.COMException
|
29
29
|
```
|
30
30
|
|
31
|
-
### 該当のソースコード
|
31
|
+
### 該当のソースコードに近いコード(問題が再現できない....)
|
32
32
|
|
33
|
+
```powershell
|
34
|
+
<#
|
35
|
+
情報源
|
36
|
+
guitarrapc_tech 様
|
33
|
-
|
37
|
+
タイトル : PowerShell による同期処理、非同期処理、並列処理 を考えてみる
|
38
|
+
URL : http://tech.guitarrapc.com/entry/2013/10/29/100946
|
34
39
|
|
40
|
+
*** 様
|
41
|
+
タイトル : [properties] Powershellクラスはget setプロパティを実装します
|
42
|
+
URL : https://code-examples.net/ja/q/25e096e
|
43
|
+
#>
|
44
|
+
using namespace System.Management.Automation.Runspaces;
|
45
|
+
using namespace System.Collections;
|
46
|
+
using namespace System.Threading;
|
47
|
+
using namespace System.Runtime.InteropServices
|
48
|
+
|
49
|
+
# クラスを定義します
|
50
|
+
class _MultiThread
|
51
|
+
{
|
52
|
+
|
53
|
+
# ノーマル プロパティ
|
54
|
+
[array] $RunspaceCollection
|
55
|
+
|
56
|
+
# 非表示 プロパティ
|
57
|
+
hidden [RunspacePool] $runspacePool
|
58
|
+
|
59
|
+
# 完了 プロパティ
|
60
|
+
hidden [bool]$_AllCompleted = $($this | Add-Member ScriptProperty -Name 'AllCompleted' -Value {
|
61
|
+
$($this.runspaceCollection.RunSpace | sort IsCompleted -Unique).IsCompleted -eq $true
|
62
|
+
})
|
63
|
+
|
64
|
+
# コンストラクター
|
65
|
+
_MultiThread ($MyHost)
|
66
|
+
{
|
67
|
+
# create Runspace
|
68
|
+
[initialsessionstate] $sessionstate = [initialsessionstate]::CreateDefault()
|
69
|
+
[int] $minPoolSize = [int] $maxPoolSize = 5000
|
70
|
+
$this.runspacePool = [runspacefactory]::CreateRunspacePool($minPoolSize, $maxPoolSize, $sessionstate, $MyHost) # create Runspace Pool
|
71
|
+
$this.runspacePool.ApartmentState = "STA"
|
72
|
+
$this.runspacePool.Open() # open pool
|
73
|
+
}
|
74
|
+
|
75
|
+
# スレッドの追加
|
76
|
+
[void]AddThread([scriptblock]$ScriptBlock)
|
77
|
+
{
|
78
|
+
# Main Invokation
|
79
|
+
[powershell] $powershell = [PowerShell]::Create().AddScript($ScriptBlock)
|
80
|
+
$powershell.RunspacePool = $this.runspacePool
|
81
|
+
$this.RunspaceCollection += New-Object -TypeName PSObject -Property @{
|
82
|
+
Runspace = $powershell.BeginInvoke();
|
83
|
+
powershell = $powershell
|
84
|
+
}
|
85
|
+
# $powershell.Dispose()
|
86
|
+
}
|
87
|
+
|
88
|
+
# スレッドの追加
|
89
|
+
[void]AddThread([scriptblock]$ScriptBlock,[psobject]$Parameters)
|
90
|
+
{
|
91
|
+
# Main Invokation
|
92
|
+
[powershell] $powershell = [PowerShell]::Create().AddScript($ScriptBlock).AddParameters($Parameters)
|
93
|
+
$powershell.RunspacePool = $this.runspacePool
|
94
|
+
$this.RunspaceCollection += New-Object -TypeName PSObject -Property $(
|
95
|
+
[ordered]@{
|
96
|
+
Runspace = $powershell.BeginInvoke();
|
97
|
+
powershell = $powershell
|
98
|
+
}
|
99
|
+
)
|
100
|
+
}
|
101
|
+
|
102
|
+
|
103
|
+
# 結果の取得
|
104
|
+
[object]GetResult()
|
105
|
+
{
|
106
|
+
# get process result and end powershell session
|
107
|
+
return $(foreach ($runspace in $this.runspaceCollection)
|
108
|
+
{
|
109
|
+
# get reuslt
|
110
|
+
$runspace.powershell.EndInvoke($runspace.Runspace)
|
111
|
+
})
|
112
|
+
}
|
113
|
+
|
114
|
+
# デストラクタの代わり手動で実行
|
115
|
+
[void]Dispose()
|
116
|
+
{
|
117
|
+
if (!($this.runspacePool.runspacePool.IsDisposed))
|
118
|
+
{
|
119
|
+
foreach ($Runspace in $this.RunspaceCollection)
|
120
|
+
{
|
121
|
+
$Runspace.powershell.Dispose()
|
122
|
+
}
|
123
|
+
|
124
|
+
# Dispose Runspace
|
125
|
+
$this.runspacePool.Dispose()
|
126
|
+
}
|
127
|
+
}
|
128
|
+
}
|
129
|
+
|
130
|
+
function _New_MultiThread()
|
131
|
+
{
|
132
|
+
[OutputType([_MultiThread])]
|
133
|
+
$Thread = New-Object _MultiThread($host)
|
134
|
+
return $Thread
|
135
|
+
}
|
136
|
+
|
137
|
+
$ExcelPath = "$PSScriptRoot\Tmp.xlsx"
|
138
|
+
$OpenPath = ""
|
139
|
+
if (Test-Path -Path $ExcelPath)
|
140
|
+
{
|
141
|
+
$OpenPath = $ExcelPath
|
142
|
+
}
|
143
|
+
$Thread = _New_MultiThread
|
144
|
+
|
145
|
+
$NewBook = {
|
146
|
+
Param($Path)
|
147
|
+
$App = New-Object -ComObject "Excel.Application"
|
148
|
+
|
149
|
+
if($Path -eq "")
|
150
|
+
{
|
151
|
+
$null = $App.WorkBooks.Add()
|
152
|
+
Write-host "新規ブック"
|
153
|
+
}
|
154
|
+
else
|
155
|
+
{
|
156
|
+
$null = $App.WorkBooks.Add($Path)
|
157
|
+
Write-host "既存ブックをテンプレートとして立ち上げ"
|
158
|
+
}
|
159
|
+
|
160
|
+
$App
|
161
|
+
}
|
162
|
+
|
163
|
+
try
|
164
|
+
{
|
165
|
+
|
166
|
+
$Add_Args = @{
|
167
|
+
Path = $OpenPath
|
168
|
+
}
|
169
|
+
|
170
|
+
1..5 | foreach { $Thread.AddThread($NewBook,$Add_Args) }
|
171
|
+
|
172
|
+
while(!($Thread.AllCompleted)) {Start-Sleep -Milliseconds 5}
|
173
|
+
|
174
|
+
$Apps = $($Thread.GetResult())
|
175
|
+
|
176
|
+
$Apps | foreach { $_.Caption = "Test_Apps" }
|
177
|
+
|
178
|
+
$App = $Apps[0]
|
179
|
+
|
180
|
+
$App.Visible = $true
|
181
|
+
|
182
|
+
$Sh = $App.ActiveSheet
|
183
|
+
|
184
|
+
$i = 0
|
185
|
+
|
186
|
+
Write-host "セルに適当に値書き込み"
|
187
|
+
$Sh.cells(1,1).resize(100,10) | foreach { $i++; $_.Value = $i}
|
188
|
+
|
189
|
+
Write-host "100回シートコピー"
|
190
|
+
1..100 | foreach{ $Sh.Copy($Sh) }
|
191
|
+
|
192
|
+
$App.DisplayAlerts = $false
|
193
|
+
|
194
|
+
$BK = $App.ActiveWorkbook
|
195
|
+
|
196
|
+
Write-host "残りシートが10になるまで削除"
|
197
|
+
while($BK.sheets.Count -gt 10){$BK.sheets(11).delete()}
|
198
|
+
|
199
|
+
Write-host "$ExcelPath`に保存"
|
200
|
+
$BK.SaveAs($ExcelPath)
|
201
|
+
|
202
|
+
|
203
|
+
}
|
204
|
+
catch
|
205
|
+
{
|
206
|
+
Write-Host "Err"
|
207
|
+
}
|
208
|
+
finally
|
209
|
+
{
|
210
|
+
Write-Host "クリーンアップしています..."
|
211
|
+
$App.WorkBooks | where { $_ -ne $null } | foreach {$_.close($false)}
|
212
|
+
$null = [Marshal]::FinalReleaseComObject($Sh)
|
213
|
+
$null = [Marshal]::FinalReleaseComObject($Bk)
|
214
|
+
$Apps | foreach { $_.quit() }
|
215
|
+
$null = $Apps | foreach { [Marshal]::FinalReleaseComObject($_) }
|
216
|
+
$Thread.Dispose()
|
217
|
+
}
|
218
|
+
|
219
|
+
```
|
220
|
+
|
35
221
|
### 試したこと
|
36
222
|
|
37
223
|
・リトライ
|
@@ -54,6 +240,9 @@
|
|
54
240
|
```
|
55
241
|
・Start-Sleep
|
56
242
|
|
243
|
+
・問題が起きているのと同じようなコードを書いてみたのですが
|
244
|
+
問題が再現できませんでした....
|
245
|
+
|
57
246
|
### 補足情報(FW/ツールのバージョンなど)
|
58
247
|
|
59
248
|
Win10
|