Powershell

Word文書ファイルのバージョンを一括更新

読者
読者
docファイルをdocxファイルに変換したい。
複数あるので、一括で変換する方法が無いですか?
あるよ!
Powershellを使うんだ。
管理人
管理人

PowerShellのコードイメージ
※変換元のファイルはリネームして、先頭に”_”(アンダーバーをつける)

# 事前準備
Add-Type -AssemblyName Microsoft.Office.Interop.Word
$fileType = “*doc”
$extensionDoc = “.doc”
$extensionDocx = “.docx”
$namehead = “_”

$word = New-Object -ComObject Word.Application

# ファイルの一覧取得
$files = Get-ChildItem -Path “C:\temp\sample” -Include $fileType -Recurse

Write-Host “Word変換処理開始”
Write-Host “変換元ファイルは、リネームして、ファイル名の先頭にアンダーバーをつける”

try {

# 1ファイルずつ処理
foreach($file in $files)
{
# フォルダ取得
$filePath = [System.IO.Path]::GetDirectoryName($file.FullName)
# 拡張子を含まないファイル名取得
$fileName = [System.IO.Path]::GetFileNameWithoutExtension($file)
# docファイルを保存するパスを作成
$wordPath = (Join-Path $filePath $fileName) + $extension

# Wordの処理開始
$word.Visible = $False

$doc = $word.Documents.Open($file.fullname)

$wordPath = (Join-Path $filePath $fileName) + $extensionDocx

$doc.SaveAs2($wordPath,16)

$doc.close($false)

# 変換元ファイルをリネーム
$newFileName = $namehead + $fileName + $extensionDoc

Rename-Item -Path $file -NewName $newFileName

# 終了フラグ取得
$isSucess = $?

} catch [Exception] {
Write-Host “エラーが発生しました。”
Write-Host “↓↓↓エラー詳細↓↓↓”
$error[0] | Out-String | Write-Host

} finally {
Write-Host “プログラムを終了します…”
# Excelを閉じる
if ($word -ne $null) {
$word.Quit()
}
}

Write-Host “処理完了”

Wordファイルのページ数を取得する

読者
読者
複数あるファイルのページ数を一括で取得したい
PowerShellを使えば取得できるよ
管理人
管理人

作成したWordファイルのページ数を取得したいことがありませんか?
類似システムのWordファイルの頁数を基に、設計作業の見積り根拠にしたり、
成果物の納品報告書の頁数を記入したり。。。等々

対象のファイルが数ファイルなら、1ファイルずつ開いて確認できます。
ですが、複数ファイルもあったり、フォルダがネストして格納していると、指定が面倒です。
そういう時は、次のPowerShellを使って、一括に取得してしまいましょう。

ソース(page-count.ps1)

# 結果出力(C:\temp\output.csvに結果を出力する)
$outpath = “C:\temp”
$output = $outpath + “/output.csv”

# 引数チェック
function usage {
Write-Host “Usage: “page-output.ps1 Input-dir “<directory path>”
exit 1
}

if ($args.length -eq 0) {
usage
}

$inpath= $args

# 出力ファイルを削除
if (Test-Path $output) {
Remove-Item -Path $output
}

# 指定されたパス配下のファイルを取得(サブフォルダも対象+docファイルのみ)
$target = Get-Childitem $inpath -r -include *.doc -exclude *コピー*,*.back,~* | Where-Object {-not $_.PSIsContainer}

# WSHのShellオブジェクトを生成
$shell = New-Object -Com Shell.Application

# ファイル分だけ繰り返す
$target | ForEach-Object {

# GetDetailsOfに必要なオブジェクト
$folderobj = $shell.NameSpace($_.DirectoryName)
$item = $folderobj.ParseName($_.name)

# ファイル出力
$_.DirectoryName + “\” + $_.name + “`,” + $folderobj.GetDetailsOf($item,157) | Add-Content $output
}

 

プロパティの取得(ページ数を表す番号を確認する)

もし、GetDetailsOf($item,157)でページ数が取得できない場合に下記のソースを実行して、番号(=157)を確認する

$sh = New-Object -ComObject Shell.Application
$folderobj = $sh.Namespace(‘C:\test’)
$item = $folderobj.ParseName(‘サンプル.docx’)
for($i = 0; $i -lt 300; $i++){
echo ([string]$i + ” : ” + $folderobj.GetDetailsOf($item, $i))
}

実行

PS C:\> page-count.ps1 対象ディレクトリ名

※C:\temp\output.csvに結果が出力されます。

コマンドの解説(備忘録)

ファイルの絞り込み -include

# 単一の拡張子で絞り込む場合(例:docファイルのみ取得)
PS C:\> Get-ChildItem -File -r -include *.doc

# 複数の拡張子で絞り込む場合(例:docファイル、dotファイルを取得)
PS C:\> Get-ChildItem -File -r -include *.doc,*.dot

ファイルの除外 -exclude

# 単一の拡張子で除外する場合(例:docファイルを除外)
# 例)jpg拡張子を含まないファイルを取得する
PS C:\> Get-ChildItem -File -r -exclude *.doc

# 複数の拡張子で除外する場合(例:docファイル、dotファイルを除外)
PS C:\tmp> Get-ChildItem -File -r -exclude *.doc,*.dot