Windows PowerShellでファイル名を一括変更する(Get-ChildItemとRename-Itemを使用)

2022/01/13
数年の沈黙を破り,このWikiを更新します.非公開のWikiばかり更新していたのですが,公開できる記事を少しずつ公開していくつもりです.
第1弾はWindows PowerShellでのファイル名一括置換操作.私がPowerShellのコマンドで使うもの上位です.

リネームソフトは世の中にたくさんあると思いますが,Windows環境で何も準備せずに使えてパワフルなので気に入っています.
ただし,よくわかってないところがあります.使えてるからいいか,くらいの認識でいるので,ご使用の際は注意してください.

説明

概要

Windows PowerShell上で正規表現を使ったファイル名の一括置換を行いたい場合,次の書式でコマンドを入力する.
Get-ChildItem -r 「パス」 | Rename-Item -NewName { $_.Name -replace 'Old','New' }
入力の例.これはカレントディレクトリ以下のファイルの変更を行いたい場合である.
> Get-ChildItem -r . | Rename-Item -NewName { $_.Name -replace '0405','0404' }
意味はファイル名に『0405』という文字列が含まれている場合,それをすべて『0404』に置換するというもの.

注意点

正規表現の書式
第一引数(元となる文字列,上の'Old')は正規表現に則ったエスケープが必要だが,第二引数(新しい文字列,上の'New')はエスケープを書くと逆にエラーになる*1
PS C:\Users\user\Desktop\Renamed\○○○○> Get-ChildItem -r C:\Users\user\Desktop\Renamed\○○○○\* `
| Rename-Item -NewName { $_.Name -replace '(X\+092_Y\+092)', 'X-095_Y\+092_moto\($1\)'}
Rename-Item : 指定された対象がパスまたはデバイス名を表しているため、名前を変更できません。
発生場所 行:1 文字:98
+ Get-ChildItem -r C:\Users\ysekiya\Desktop\Renamed\○○○○\* | Rename-Item <<<<
  -NewName { $_.Name -replace '(X\+092_Y\+092)', 'X-095_Y\+092_moto\($1\)'}
    + CategoryInfo          : InvalidArgument: (:) [Rename-Item]、PSArgumentException
    + FullyQualifiedErrorId : Argument,Microsoft.PowerShell.Commands.RenameItemCommand

PS C:\Users\user\Desktop\Renamed\○○○○>
PS C:\Users\user\Desktop\Renamed\○○○○> Get-ChildItem -r .\* | Rename-Item -NewName { $_.Name -replace '(X\+092_Y\+092)', 'X-095_Y+092_moto($1)'}
PS C:\Users\ysekiya\Desktop\Renamed\○○○○>
Get-ChildItemのパス指定部
Get-ChildItemのパス指定部は絶対パスでも相対パスでもよいが,何かをきっかけに変なエラーが出る.
Rename-Item : ソース パスとターゲット パスを同じにすることはできません。
これを完全に回避する方法はよくわからない.
パスの最後を「*」にしてカレントディレクトリに入ってコマンドを入力したり,
考え付く範囲でパス指定やファイル名を変更すると通ることがあるようだ.

*1 : 以下の例は仕事で使った処理(文字列)を公開しても良い文字列に手動で書き換えて,表示結果を推測しています.挙動が違う可能性もあるので注意してください.

2014/06/27(金)EPSファイル(jw_cadで作成した図)をinkscapeで追加編集する

jw_cadで作成した図面に,数式や文字,色などの情報を追加したいことはままあること.

この場合,回りくどいがjw_cad→EPSプリンタで印刷→GsViewでSVG変換→inkscapeで開くという手順を踏むと問題なく編集できる.

最初,jw_cad→PDFプリンタ→inkscapeで読み込みという手順で編集したら,EPSで再保存する際に出力がおかしくなった.

この方法は,別のソフトで作成した図をinkscapeで編集する場合に広く利用できると思われる.

gnuplotのsvg出力でフォントを設定し,inkscapeで編集する

2013/05/16 未分類import
svgのグラフでローマン体を使って出力したい場合は次のように設定を行う.
set term svg enhanced mouse size 600,400 fname "Times New Roman"
注意しなければならないのは,inkscapeに登録されいるフォント名を指定しなければならないということ.
Times New Romanを指定したい場合は素直に"Times New Roman"とする.
(gnuplotのEPS出力等では"Times-Roman"など別の名前にする必要がある.)
inkscapeではフォントは(半角スペースを含んだ)半角英数で登録されている.
文字入力モードで選択できるフォント名をそのまま指定する形になる.

dviout abort automatic font generation

2013/04/30 未分類import
これまでWindowsでTeX環境を整えるときは専ら
TeXインストーラー3というプログラムを利用させていただいていた.
これは非常に簡単にTeX環境構築ができるのでオススメである.

今回ThinkPadのOSの再インストールを行った関係で久しぶりにこのプログラムを使わせていただいたのだが,
珍しくエラーが出たのでメモしておく.

dvioutでフォントがうまく生成されず,
"dviout abort automatic font generation"というようなエラーが出た.

エラー表示を見たり,TeX環境の再インストールを何度か行ったりしたが,
結局dvioutのTEXROOTの値に"C:\w32tex\share\texmf-dist\fonts"というパスを追加することで解決した.
設定する場所はdvioutを起動して,[Option]→[Setup Parameters ...]の[Font]タブである.
該当箇所を追記し,変更を適用してSaveする.

TeXWikiのdvioutのページを見て修正した.
ここによれば,2013年4月8日以降のW32TeXではこの対策をしないとダメらしい.
dviout側で対策がされるまではこの手動設定が必要みたいである.