Powershellを使用して、タブ区切りのAsciiファイルをMS Excelにインポートします。私はそうするためにループを使用して、今の私が働く簡単な解決策があります:私は今powershell:excelが既に実行されている場合はインスタンスを取得し、そうでない場合は例外ハンドリングを開始します。
for each file: start Excel , import tsv file, close Excel.
エクセル2010、Excelはパスで、それはエクセルの正しいバージョンださ..assuming
をより効率的なバージョンに移行したいと考えています。
ファイルごとに:実行中のインスタンスがある場合はそれを実行し、存在しない場合はExcelを起動しようとします。プロセスファイル。キープしてください。最後に、開いたままにしておきます(スクリプトが実行されている間にExcelファイルを見たいと思っていますが、それはしばらく時間がかかる可能性があります。
私はインターネット上の他の場所でも、これに関する包括的な解決策を見つけられませんでした。 「包括的な」とは、「例外処理」を意味します。 Powershellでは、ちょっと混乱します。例外を扱うには、トラップとtry-catchブロックの2つの方法があります。
いくつかのインターネットソースから一緒にスローされたコードですが、どうすれば改善できますか?
私はそれを関数にラップしたいが、戻り値としてCOMオブジェクトは問題がある。 ( は、私が欲しいのは「シンプル工場」と「シングルトン」の組み合わせである。)
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Interop.Excel")
try {
$excelApp = [System.Runtime.InteropServices.Marshal]::GetActiveObject("Excel.Application")
} catch [System.Runtime.InteropServices.COMException], [System.Management.Automation.RuntimeException]{
write-host
write-host $("TRAPPED: " + $_.Exception.GetType().FullName);
write-host $("TRAPPED: " + $_.Exception.Message);
write-host "Excel is not running, trying to start it";
$excelApp = New-Object -ComObject "Excel.Application"
if (-not $excelApp){
# excel not installed, not in path
Write-Error "Excel not running, and cannot be started, exiting."
# Todo: test if excel version is correct, e.g. english Excel 2007 or 2010., if not set outfile extension xls.
exit;
}
}
catch [System.Exception]{
write-host $("EXCEPTION: " + $_.Exception.GetType().FullName);
write-host $("EXCEPTION: " + $_.Exception.Message);c
Write-Error 'Something went wrong during creation of "Excel.Application" object, => Exit.'
exit;
}
は、私が覚えている限りでは、私は、Excelの実行中のインスタンスを探してみました、そして1が存在しない場合、それはcatchブロック内に新しいものを開始しようとします。たぶん、それはより良い/より堅牢な方法で行うことができますが、私はその時点でpowershellを学んでいました(そして、私はまだ、intermissionsで) – knb