質問するログイン新規登録

質問編集履歴

4

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

2018/12/04 01:06

投稿

kmyzr
kmyzr

スコア305

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
- $null = $App.WorkBooks.Add($Path)
156
+ # $null = $App.WorkBooks.Add("$Path")
157
- Write-host "既存ブックをテンプレートとして立ち上げ"
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
- $Add_Args = @{
168
+
167
- Path = $OpenPath
168
- }
169
169
 
170
- 1..5 | foreach { $Thread.AddThread($NewBook,$Add_Args) }
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
- Write-host "セルに適当に値書き込み"
200
+ $Bk2.saveAs("$Tmp")
201
+
202
+ $Bk2.close($false)
203
+
185
- $Sh.cells(1,1).resize(100,10) | foreach { $i++; $_.Value = $i}
204
+ $Bk2 = $Apps[0].Workbooks.Open($Tmp)
186
205
 
187
- Write-host "100回シートコピー"
188
- 1..100 | foreach{ $Sh.Copy($Sh) }
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 "残りシートが10になるまで削除"
214
+ Write-host "残りシートが5になるまで削除"
198
- while($BK.sheets.Count -gt 10){
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.sheets(11).delete()
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
- $BK.SaveAs($ExcelPath)
240
+ $null = $BK.SaveAs("$ExcelPath")
241
+ $Try = $false
242
+ }
243
+ catch
244
+ {
245
+ Write-host "Save Retry"
246
+ }
218
247
 
219
- $App.WorkBooks | where { $_ -ne $null } | foreach {$_.close($false)}
248
+ }
220
249
 
221
- Start-Process -FilePath $ExcelPath
250
+ $Apps | foreach { $_.WorkBooks | foreach {$_.close($false) } }
222
251
 
223
-
224
252
  }
225
253
  catch
226
254
  {
227
- Write-Host "Err"
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

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

2018/12/04 01:06

投稿

kmyzr
kmyzr

スコア305

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
- $App.WorkBooks | where { $_ -ne $null } | foreach {$_.close($false)}
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

修正

2018/12/03 05:53

投稿

kmyzr
kmyzr

スコア305

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){$BK.sheets(11).delete()}
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

近いコードの記載

2018/12/03 05:37

投稿

kmyzr
kmyzr

スコア305

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