コンテンツにスキップ

部品ごとの関数(設定・ファイル)

扱うこと: 設定ファイル(tebunko/core/settings.ps1)、検索対象でチェックを外したフォルダ(search_excludes.ps1)、ワークスペース(workspace.ps1)とその切り替え(workspace_mover.ps1)、ファイル・フォルダ操作(shared/core/fs.ps1・folder.ps1・office_file_kind_view.ps1)の関数一覧(入力・出力・概要・使用元)。扱わないこと: 取り込み一覧・インデックスの管理(部品ごとの関数(インデックス作成))。先に読むページ: 部品から関数一覧を引く。

設定ファイル(tebunko/core/settings.ps1・source_name.ps1)

関数 入力 出力 概要 詳細 使用元
newSettings – ordered hashtable 設定の既定値(targetFolders indexSources searchExcludes useRegex caseSensitive fileKinds includeShapes includeComments openMode workspaceFolder searchLimit ingestThreads) 設定ファイル(setting.config) readSettings
readSettings path(既定 $settingsFile) ordered hashtable 設定を読む。記載の無いキーは既定値。ファイルが無ければ既定値(ファイルは作らない)。数値のキーは文字列でも数値にして読む(読めなければ既定値)。JSON として読めなければ FormatException(ファイルは動かさない)。ロック・共有違反は IOException のまま 同上 設定の各関数
toSettingBool value, default bool 設定ファイルの真偽値を読む。文字列の "true" / "false" も読み、読めなければ default 同上 readSettings, readSearchExcludes(search_excludes.ps1)
writeSettings settings, path(既定 $settingsFile) – 設定を JSON(UTF-8 BOM なし)で保存。一時ファイルに書いてから置き換える(writeTextLinesAtomic) 同上 updateSettings
invokeSettingsLocked path, action, timeout(既定 5000 ミリ秒) action の出力 設定ファイルごとの名前付きミューテックス(Local\tebunko_settings_<getFolderKey の鍵>)の中で action を実行する。設定の「読む → 変える → 書く」の一続きを囲む。引数の順は path, action, timeout(-action は名前で渡す) 設定ファイル(setting.config) updateSettings など
updateSettings key, value, path(既定 $settingsFile) – ファイルを読み直し、key の値だけ変えて保存する(invokeSettingsLocked の中) 同上 設定の各関数
repairBrokenSettings path(既定 $settingsFile) 退避したパス(何もしなければ空文字) 設定ファイルが JSON として読めないときだけ、setting.config.broken-<yyyyMMdd-HHmmss>(重なれば -2・-3…)に中身のまま移してパスを返す。移せなければ例外。invokeSettingsLocked の中で行う。起動口が起動の時に 1 回だけ呼ぶ 同上 gui.ps1, indexer.ps1
getSettingsRecoveryMessage brokenPath 文字列 退避して既定の設定で起動したときの知らせの文言(画面・インデクサで共通) 同上 gui.ps1, invokeIndexer
getTargetFolders path(既定 $settingsFile) @{Name; Path; Enabled} の配列 クロール対象フォルダ(targetFolders。記載順)。Name はインデックス名、Path は今の置き場所(分けて持つ)。enabled が false はチェックなし(Enabled = $false)。同じフォルダ・同じ名前は最初のものだけ(書き方が違うだけで同じフォルダも testSameFolder で同一とみなす。重複した名前は空にして割り当て直す) クロール対象フォルダと取り込み対象 インデックス作成・画面
writeTargetFolders folders(@{Name; Path; Enabled} の配列), path(既定 $settingsFile) – クロール対象フォルダを targetFolders に保存(名前も保存する) 同上 インデックス作成・画面
mergeAssignedIndexNames / saveAssignedIndexNames current, assigned / assigned, path 一覧 / 一覧 割り当てたインデックス名(assigned)を、読み直した今の一覧(current)の名前が空の項目にだけ、パスで突き合わせて足す(同じ名前をほかの項目が使っていれば付けない)/ 排他の中で読み直して足して保存し、保存した一覧を返す 設定ファイル(setting.config) インデクサ・画面(loadTargets)
readIndexSources / writeIndexSources path(既定 $settingsFile) / sources, path @{Name; Path} の配列 / – インデックス作成の対象にしないインデックスの元のフォルダ(indexSources)を読み書きする 設定ファイル(setting.config) getSourceFolderMap, 画面
setIndexSourceFolder name, folder, path(既定 $settingsFile) – インデックス名に対する元のフォルダを記録する。クロール対象フォルダにある名前ならそのフォルダの Path を書き換え、無ければ indexSources に記録する 元のファイルが見つからないとき(元のフォルダを設定する) 画面
testSourceNameRecordable name bool 元のフォルダを設定に記録できる名前か(空・前後に空白があれば偽。setIndexSourceFolder の入口と、確認ダイアログの文言で使う。tebunko/core/source_name.ps1。判断層) 元のファイルを開く 判断
readVersionFile path(配布物の VERSION.txt のパス) @{Tag; Sha} / $null 版とコミットの記録を読む。無い・読めない・2行でない・形が違えば $null(画面は「開発版」と表示する。about_view.ps1 の getAboutView) 画面 画面
resolveGitRef ref, dirs string リポジトリのリファレンス(refs/heads/main など。形が違えば空)が指すコミットの SHA を、refs\ の下のファイル → packed-refs の順に読む(外部のコマンドは起動しない) 画面 readDevVersion
readDevVersion rootDir @{Tag; AtHead; Sha} / $null 配布物でない(VERSION.txt が無い)ときの版の手がかりを、作業ツリーの .git のファイルだけから読む(worktree の gitdir:・commondir も読む)。HEAD に付いたリリースのタグ(v<数>.<数>.<数>)があればそれ、無ければ版の並びで最も新しいタグ。どちらも分からなければ SHA だけ、SHA も無ければ $null 画面 getToolDiagnosticHeader, 画面の起動(裏の仕事)
readSearchOption / writeSearchOption path / option, path @{UseRegex; CaseSensitive; IncludeShapes; IncludeComments} / – 画面の検索条件(種類は readFileKinds / writeFileKinds)。元のファイルの特定・画面 を参照 続き 画面
getSearchLimit value int 検索結果の件数の上限として使う値を返す。0 は制限なし(${searchLimitNone})でそのまま返す。数値にできない・負の数は既定の 10,000(${searchLimitDefault})、範囲の外は近い端(1,000=${searchLimitMin}~100,000=${searchLimitMax})に寄せる。ファイルは読まない 設定ファイル(setting.config) readSearchLimit
readSearchLimit path(既定 $settingsFile) int 検索結果の件数の上限(searchLimit)を読み、getSearchLimit で寄せて返す。画面は起動のときに読む 検索タブ 画面(startGui)
writeSearchLimit value、path(既定 $settingsFile) – 検索結果の件数の上限(searchLimit)を書く。0(制限なし)か 1,000〜100,000 だけ書き、ほかの値は例外にする。ほかのキーは変えない 設定ファイル(setting.config) 設定の画面(commitSearchLimit)
readCloudFiles / writeCloudFiles path(既定 $settingsFile) / mode, path string / – クラウドにだけあるファイルの扱い(cloudFiles。ask / download)を読み書きする。無い・知らない値なら ask 取り込み対象の決定 画面・インデクサ
readOpenMode / writeOpenMode path(既定 $settingsFile) / mode, path string / – 元のファイルの開き方(openMode)を読み書きする。無い・知らない値なら normal 元のファイルを開く 画面
getDefaultWorkDir profileDir(既定は利用者のプロファイル) string 既定のワークスペース <profileDir>\Documents\tebunko_ws(OneDrive にリダイレクトされた「ドキュメント」は使わない)。profileDir を渡さず、環境変数 TEBUNKO_DEFAULT_WORKSPACE(絶対パス)があるときは、その場所(テスト・実機の確かめ用。絶対パスでなければ例外) データの置き場所とパスの決め方 getWorkDir, writeWorkspaceFolder, 画面
getWorkDir path(既定 $settingsFile) string work の置き場所(workspaceFolder。空なら既定。相対パスは設定ファイルのフォルダから、%変数% は展開する) 同上 paths.ps1($workspace)
writeWorkspaceFolder folder, path(既定 $settingsFile) – work の置き場所を保存する。既定の場所なら空で保存する 同上 画面

ワークスペース(tebunko/core/workspace.ps1)

Workspace クラスは、ワークスペースのフォルダ(Dir)から、中のファイル・フォルダの場所を組み立てるだけで、設定は読まない。どのフォルダを使うかは設定の workspaceFolder で決まる(getWorkDir)。関数はその場所を使って、取り込みの作業フォルダの置き場所の判断・前の版のワークスペースの扱いを行う(ワークスペースの移動は下の WorkspaceMover)。画面の操作は データの置き場所とパスの決め方、[設定]タブは [設定]タブ を参照。

関数 入力 出力 概要 使用元
getMachineKey – string(8 文字) この PC を識別する短い鍵(getFolderKey の先頭 8 文字)。共有フォルダのワークスペースを複数の PC から使うとき、一時フォルダを PC ごとに分ける getWorkspaceTmpDir
assertWorkspaceReachable dir – 裏の仕事の先頭でワークスペースに届くかを確かめる。届かない・確かめられないときは「ワークスペースに接続できません:…」「ワークスペースを確かめられません:…」の例外にする。まだ無いだけなら何もしない(呼び出しは裏の仕事の中。画面のスレッドでは呼ばない) IndexCatalog.AssertReachable(index_catalog.ps1)
getWorkspaceJobQueue 場所(複数可) string 裏の列を選ぶ。渡した場所のどれかがネットワークなら network、それ以外は default。届かない共有の仕事が、ほかの仕事を待たせないため index_store.ps1, index_tree.ps1 ほか
getWorkspaceTmpDir workspace string 取り込みの作業フォルダの候補 <TmpRoot>\<PC の鍵>\<PID>。副作用は無い selectTmpDir, index_migrate.ps1
selectTmpDir workspace @{Dir; Reason} 作業フォルダの置き場所を決める。候補のパスに [ ] があれば(Excel が保存できない)Dir を空にして Reason = Brackets、候補の長さに取り込みのスレッドが下に作る名前の分を足して $excelMaxPath 以上なら Reason = TooLong。どちらでもなければ候補のまま(Reason は空)。%TEMP% には逃がさない paths.ps1, indexer_run.ps1, extract_office.ps1, index_migrate.ps1
getTmpDirUnavailableMessage reason string 作業フォルダを置けない理由(Brackets・TooLong・Link(作業領域の途中にリンクがある)・その他)を、利用者向けの 1 文にする indexer_run.ps1, index_migrate.ps1
getLegacyIndexState dir @{HasLegacyIndex; ContentEmpty} 前の版のワークスペースの状態。index\ の直下のフォルダに元のフォルダ.txt があれば前の版のしるし(HasLegacyIndex)。store\content\ と前の版の content_index\ がどちらも空か(ContentEmpty) indexing_tab.ps1, workspace_jobs.ps1, index_archive.ps1, indexer_run.ps1, paths.ps1
getLegacyIndexMessage dir, hasLegacyIndex string 前の版のインデックスが見つかったときの知らせ。しるしが無ければ空 workspace_jobs.ps1, indexer_run.ps1
removeOldSystemIndex dir @{Ok; Reason} 前の版が作った検索用のファイル(system_index\ と system_index_state.tsv)を消す。ワークスペースの下で途中にリンクが無いことを確かめてから消し(removeDirectoryUnder・removeFileUnder)、無ければ何もしない。消せなくても例外にせず Ok = $false(次に呼べば続きから) startup.ps1(画面の起動), indexer_run.ps1, index_archive.ps1
newWorkspace dir Workspace Workspace のインスタンスを作る(クラスの本体では型の名前を書けないため、WorkspaceMover・IndexCatalog がこの関数を通して作る) workspace_mover.ps1

ワークスペースの切り替え(tebunko/core/workspace_mover.ps1。WorkspaceMover)

作るのは [WorkspaceMover]::new(設定ファイルの場所)。ListEntries などの確かめは画面のスレッドで使う。画面(applyWorkspace)は、選んだ直後のフォルダを確かめて利用者に選ばせたあと、ChangeWorkspace を画面の裏の仕事(startWorkspaceMove)で呼ぶ。終わったら、画面のスレッドで結果を出して画面を切り替える(結果の判断は getWorkspaceMoveOutcome。元を消せずに残ったものがあれば、切り替えたあとに getWorkspaceLeftoverNotice の警告を出す)。ChangeWorkspace は成功したときだけ設定を書き、失敗したら戻すので、裏で失敗しても設定は変わらない。クラスの考え方は クラスと関数の使い分け。

メソッド 入力 出力 概要 使用元
ListEntries dir string[] tebunko のファイル・フォルダ(Workspace.Entries のうち、あるもの)のフルパス。利用者のほかのファイルは含めない(旧 getWorkspaceEntries) settings.ps1
Conflicts from, to string[] from の中身を to へ移すとき、to に同じ名前が既にあるものの名前(旧 getWorkspaceMoveConflicts) MoveEntries
ChangeWorkspace mode(use・move・reset), from, to @{Ok; Stage; Message; Targets; Count; Leftovers} ワークスペースを from から to に変えて設定に保存する。use は to のインデックスを使う(UseTargets。from の中身は移さない)、move は中身を移す、reset は to の中身を消してから移す(RemoveEntries・MoveEntries)。移したあとに searchExcludes を付け替える(moveSearchExcludes)。失敗したときは設定を変えず、Stage(remove・move)と Message を返す settings.ps1
MoveEntries from, to, tries(省略時 5), waitMilliseconds(省略時 200) @{Count; Leftovers} from の中身を to へ移し、移した数(Count)と、別のドライブへ写したあと元を消せずに残った元の場所(Leftovers)を返す。フォルダは moveDirectoryRetry で試し直す。to に同じ名前があれば何も移さずに例外にする。途中で移せなければ、移した分を from へ戻してから例外にする(戻せなかった項目は、名前と移し先を例外の文に書く)(旧 moveWorkspace。1 つずつ移す MoveEntry と、別のドライブへ写す CopyTree は内部) ChangeWorkspace
RemoveEntries dir int tebunko のファイル・フォルダを削除し、削除した数を返す。「消して、最初からやり直す」で使う(旧 removeWorkspaceEntries) ChangeWorkspace
UseTargets dir int dir の取り込み一覧(新しい store\ingest_status.tsv と前の版の直下の ingest_status.tsv の両方。新しい方が先)にあるクロール対象フォルダを、インデックスの一覧(targetFolders)にし、その数を返す。取り込み一覧が無ければ一覧は変えない(旧 useWorkspaceTargets) ChangeWorkspace

[新規で開く]のコピー(tebunko/core/open_copy.ps1)

関数 入力 出力 概要 使用元
getOpenCopyDir workspace string コピーを置くフォルダ(work\tmp\<PC の鍵>\open_copy)。強制終了の片付けは数字の名前のフォルダだけを消すので、ここは消えない openFoundSource, 起動時の片付け
testOpenCopyDir copyDir, tmpRoot bool 作る・消してよい置き場所か。絶対パスで、tmpRoot\<PC の鍵>\open_copy(大文字・小文字は区別しない)と一致し、open_copy・<PC の鍵>・tmpRoot がリンク(ジャンクション・シンボリックリンク。testPathIsLink)でないときだけ真。空・相対パス・ドライブの根・別の場所・リンクは偽 copySourceForOpen, clearOldOpenCopies
getOpenCopyName book, now string コピーのファイル名 <元の名前>(コピー yyyyMMdd-HHmm).<拡張子>(元のファイル名の末尾の .・空白を除く)。名前が空なら空 copySourceForOpen, getOpenCopyBlocker
getOpenCopyBlocker book, copyDir, now string コピーを作らずに断る理由。NoName(名前が空)・TooLong(パスが長すぎる)・作れるなら空(名前に [ ] があっても断らない) copySourceForOpen, openFoundSource
copySourceForOpen sourcePath, book, copyDir, tmpRoot, now @{Path; Reason} copyDir\<12 桁の英数字>\<getOpenCopyName> に、元のファイルを共有で読んでコピーし、Path にそのパスを入れる(Reason は空)。作れないときは Path を空にし、Reason に理由を入れる(Place=置き場所が不正・NoName/TooLong=getOpenCopyBlocker の結果・Failed=作る・書くのに失敗) openFoundSource(裏の仕事)
clearOldOpenCopies copyDir, tmpRoot, now, keepDays int open_copy の直下のフォルダのうち、最後に使ってから(getOpenCopyLatestTime)keepDays(既定 1 日)より古いものだけを、ファイルを 1 つずつ消してから空のフォルダとして消す。リンクは辿らず、開かれていて消せないものは残す。消したフォルダの数を返す 起動時の裏の仕事

検索対象でチェックを外したフォルダ(tebunko/core/search_excludes.ps1)

設定の searchExcludes の読み書きと、フォルダとその下の比べ方。IndexCatalog(改名・削除)、WorkspaceMover(切り替え)、検索対象のツリーが同じ部品を通す。

関数 入力 出力 概要 使用元
testFolderOrUnder path, folder bool path が folder そのもの、または folder の下かを返す。searchExcludes の削除・付け替え・保存でのフォルダとその下の比べ方はここだけ。大文字・小文字を区別しない序数の比べ(OrdinalIgnoreCase)で、folder の末尾の \ は外し、<folder>\ で始まるものだけを「下」にする(Sales の下に Sales2 は入らない)。folder が空ならどれも含まない。既知の制限: \\?\ 付きと無し、/ 区切り、..、8.3 形式の短い名前は同じ場所として扱わない(書き方は呼び出す側がそろえる) removeSearchExcludesUnder, moveSearchExcludes, 検索対象のツリー(saveSearchExcludes)
readSearchExcludes / writeSearchExcludes path(既定 $settingsFile) / excludes, path @{Path; Subfolders} の配列 / – 画面の検索対象のツリーでチェックを外したフォルダ(searchExcludes)を読み書きする。無ければ空(すべて検索) 画面(検索対象のツリー)
removeSearchExcludesUnder folder, path(既定 $settingsFile) – フォルダとその下の searchExcludes を消す(Sales を消しても Sales2 は消さない)。設定の書き込みは invokeSettingsLocked の中で行い、消せなくても例外にしない(インデックスの改名・削除を止めない) IndexCatalog.RenameIndex / RemoveIndex
moveSearchExcludes from, to, path(既定 $settingsFile) int 検索対象ツリーでチェックを外したフォルダ(searchExcludes)のうち、from の store\content の下のものを to の下に付け替えて保存し、付け替えた数を返す WorkspaceMover.ChangeWorkspace

ファイルとフォルダ(shared/core/fs.ps1・folder.ps1・shared/office/office_file_kind_view.ps1)

関数 入力 出力 概要 詳細 使用元
getOfficeFileKind name string(Excel / Word / PowerPoint。表に無ければ空) ファイル名・パスの拡張子から Office の種類を返す。拡張子と種類の表($officeFileKinds。$officeExtensions はこの表の拡張子)だけを見る(表に無い .xlsxyz・.xlsa などは空。大文字・小文字は区別しない)。どのツールからも使うため shared/ に置く – getAppName, getContentIndexFileKind, getIngestApp, getRerouteApp, getOfficeOpenKind
getOfficeExtensionsOfKind kind string[] 種類(Excel / Word / PowerPoint)の拡張子を、表($officeFileKinds)の並びで返す。表に無い種類は空 – getFileKindExtensions
readListFile path string[] 行ファイルの空行以外の行(Trim しない)。無ければ空配列。読めなければ例外(空の一覧と取り違えない) – 取り込み中のファイル・元のフォルダの記録 など
writeListFile path, lines – 行ファイルを UTF-8(BOM 付き)で保存 – 同上
writeTextLinesAtomic path, lines, encoding(既定は BOM 付き UTF-8) – 一時ファイルに書いてから置き換える(置き換えられなければ少し待って 5 回まで試す) – writeStatusFile, renameStatusIndexName など
formatFileTime time string 取り込み一覧に記録する日時(yyyy/MM/dd HH:mm:ss)。更新の有無はこの文字列で比べる 取り込み一覧 インデックス作成
copyFileShared sourcePath, destPath – 元のファイルを読み取りだけで開いてコピーする(ほかのアプリの読み書き・削除を妨げない)。インデックス作成は、このコピーを開く 取り込み対象のファイルは書き換えない インデックス作成
invokeWithSourceCopy sourcePath, copyPath, readBlock, extraFiles readBlock の出力 元のファイルを copyFileShared で作業領域へコピーし、コピーを読む処理(readBlock)を実行して、終わったらコピー(と extraFiles)を必ず消す。読む処理が成功したのにコピーを消せなかったときは、作業領域のコピーを消せませんでした: <元のメッセージ> を投げて取り込みの失敗にする(テキスト・PDF・Excel・Word・PowerPoint で共通) 取り込み対象のファイルは書き換えない インデックス作成
getFolderKey dir string(16 進 64 文字) フォルダのパスを小文字にした SHA-256。名前付きミューテックス・イベントの名前に使う。FIPS モードの Windows でも動くよう、FIPS 準拠の実装(SHA256CryptoServiceProvider)を使う – newAppMutex, 画面(多重起動の防止)
testWritableFolder dir bool フォルダにファイルを作れるか(試しに作ったファイルは閉じると消える)。無いフォルダは $false データの置き場所とパスの決め方 getDataDir, 画面(置き場所の変更)
getDataDir root(既定 $rootDir), fallbackDir(必須) string 設定ファイルを置くフォルダ。root に書き込めれば root、書き込めなければ fallbackDir(%LOCALAPPDATA%\tebunko には置かない。shared/core/data_dir.ps1) 同上 settings.ps1(getSettingsFilePath)
getSettingsFilePath root, defaultWorkDir string setting.config のパス。root に書き込めれば root 直下、書き込めなければ既定のワークスペース直下 同上 settings.ps1($settingsFile)
testSettingsFileName name bool 設定ファイル(setting.config・.tmp・.broken-<日時>[-<番号>])の名前か。既定のワークスペースが空かの判断と、中身として数える対象から外すのに使う 設定ファイル testDefaultWorkspace, 画面(getCountedEntryPaths)
getSettingsFileView settingsFile, rootDir @{Path; Note} 設定タブに出す設定ファイルの場所と、ツールのフォルダに置いているか(書き込めなくて既定のワークスペースに置いているか)の注記。判断層(settings_view.ps1) 設定タブ 画面(設定タブ)
getCountedEntryPaths entryPaths, isDefaultWorkspace string[] ワークスペースに選んだフォルダの中身のうち「空でない」の数に入れるもの。選んだフォルダが既定のワークスペースなら、設定ファイルとその付属ファイル(testSettingsFileName)を外す。判断層(settings_view.ps1。カバレッジの分母に入る) 設定タブ 画面(設定タブ)
newAppMutex name(gui / indexer), dir(既定 $rootDir), app(ツールの名前。呼ぶ側が渡す。空なら例外) @{Mutex; Acquired} 同じツール(配置フォルダ)の処理を二重に動かさないための名前付きミューテックス(Local\<app>_<name>_<getFolderKey の鍵>。tebunko では Local\tebunko_<name>_<鍵>)。Acquired が $false なら、ほかで実行中。プロセスが終われば解放されるため、強制終了しても残らない インデックス作成のメインフロー インデックス作成(起動時。dir に $workspace.Dir を渡し、同じ work を使うものを 1 つにする)。画面は getFolderKey の鍵で同じ規則の名前を自前で作る(ウィンドウを前面に出すイベントの名前と共通の鍵を使うため)
invokeWithNamedMutex mutexName, timeoutMilliseconds, action action の出力 名前付きミューテックスを取って action を実行し、終わったら手放す。同じスレッドの入れ子は通す。時間を過ぎても取れなければ「排他の待ちが時間切れになりました」の例外。前の持ち主が手放さずに終わっていた(abandoned)ときは取れたものとして続ける プロセスとスレッド invokeSettingsLocked
normalizeFolderPath path string フォルダパスを 1 つの書き方にそろえる(前後の空白・" の除去、環境変数の展開、/ → \、\\?\ の除去、重なった \ ・ . ・ .. の解決、相対パスは $rootDir から、末尾の \ の除去。ドライブ直下は D:\ のまま)。解釈できない場合は書かれたとおり クロール対象フォルダと取り込み対象 getTargetFolders, 画面
getPathUnderFolder path, folder string / $null path が folder 自身か下なら folder からの相対パス(folder 自身は空)、下でなければ $null(大文字・小文字と末尾の \ を無視)。パスの文字数で切り出さないために使う 同上 インデックス作成・検索
getDriveTargets – Dictionary(Z: → 割り当て先) ネットワークドライブの割り当てを CIM(Win32_LogicalDisk の DriveType=4)で調べる(同じプロセスで 1 回だけ。subst は解決しない) 同上 getFolderPathAliases
getFolderPathAliases path, drives(既定 getDriveTargets) string[] 同じ場所を指す別の書き方を path 自身を先頭にして返す(Z:\見積 ⇔ \\server\share\見積) 同上 testSameFolder, 画面
testSameFolder a, b, drives(既定 getDriveTargets) bool 2 つのパスが同じフォルダを指すか(書き方の違い・ドライブの割り当てをたどる) 同上 getTargetFolders, getSourceFolderMap, 画面
testFolderUnder path, folder, drives(既定 getDriveTargets) bool path が folder 自身か folder の下のフォルダか(testSameFolder と同じく書き方の違いをたどる)。クロール対象フォルダが入れ子にならないかの確認に使う 同上 画面(インデックスの追加・編集)
getFolderLeafName folderPath string フォルダ名(ドライブ直下はドライブ名、UNC は共有名) 取り込み一覧 newIndexName
joinSourcePath folder, rest, name string フォルダ・相対フォルダ・ファイル名をつなぐ(ドライブ直下でも \ を重ねない) – getFolderPathAliases, 元のファイルの特定(source_map.ps1), 画面
getExistingAncestorFolder folder string folder が今もあればそのまま、無ければその上の今もあるフォルダ。どこにも無ければ空 フォルダ選択ダイアログ([参照…]) 画面(フォルダ選択)

診断情報とログの世代(shared/core/diagnostics_view.ps1・diagnostics.ps1・tebunko/core/diagnostics.ps1)

ログの先頭に書く版と環境の見出しと、ログの入れ替え。仕様はログに書く版と環境の情報と増え方と片付け。

関数 入力 出力 概要 使用元
getVersionLabel versionInfo(readVersionFile の結果) @{Version; Commit} 版の表示。タグとコミットの先頭 7 桁。$null なら 開発版(Commit は空)。readDevVersion の結果(devInfo)があれば 開発版(v0.5.0・d79f898) / 開発版(v0.5.0 より後・d79f898) / 開発版(d79f898)。判断層 getAboutView, formatDiagnosticHeader
getOfficeKind exePath, programFiles64, programFilesX86 @{Kind; Bits} Office の実行ファイルのパスから、Click-to-Run か MSI か、32・64 ビットかを決める。判断層 findOfficeApps
hideUserProfile text, profileDir string 文字列の中のプロファイルのフォルダを %USERPROFILE% に置き換える(大文字小文字は区別しない。前方だけ一致する別のフォルダは置き換えない)。判断層。今は呼び出し元が無い(見出しにプロファイルのパスを入れないため) –
formatDiagnosticHeader toolName, versionInfo, envInfo, now string[](見出しの行) 日時・版・OS・PowerShell・Office・表示言語の見出しを組み立てる。調べられない項目は 不明。判断層 getToolDiagnosticHeader
getEnvironmentInfo – hashtable OS・PowerShell・Office・表示言語を調べる。項目ごとに調べ、失敗した項目は空にする(Office を調べている途中で失敗したら $null。見出しでは 不明)。レジストリ・WMI・COM は使わず、Office は起動しない getToolDiagnosticHeader
findOfficeApps programFiles64, programFilesX86(省略すると Windows のあるドライブの決まった名前), os64 @{Name; Version; Kind; Bits} の配列 Program Files の決まった場所の EXCEL・WINWORD・POWERPNT を探し、ファイルの版を読む。32 ビットの Windows では Program Files の Office を 32 ビットとする。例外は投げたまま(呼び出し側が 不明 にする) getEnvironmentInfo
getPreviousLogPath path string <名前>_previous<拡張子>(同じフォルダ) rotateLogFile
rotateLogFile path, maxBytes bool ファイルが maxBytes 以上なら _previous へ移す(あれば File.Replace で置き換える。今のログが移せないときも、今のログは失わない)。maxBytes が 0 なら、あれば必ず移す。移したら $true、ファイルが無い・小さい・移せないときは $false(例外にしない) invokeIndexer, writeErrorLog
getToolDiagnosticHeader – string[] このツールの版(VERSION.txt。無ければ readDevVersion のタグ・コミットを添えた開発版)と環境の見出し invokeIndexer, getToolGuiErrorLogHeader