いくつかのxlsファイルをxlsxファイルに変換する必要があります。cmdプロンプト(Windows)で以下のコマンドを実行すると、1つのxlsファイルをxlsxに変換することができました。
ssconvert inputFileName.xls outputFileName.xlsx
(ssconvertはGnumeric'のコマンドラインユーティリティで、異なるスプレッドシートファイルフォーマット間の変換ができます)
現在のファイル名を入力ファイルと出力ファイル名の両方に使用して、指定されたディレクトリ内の各ファイルに対して上で書いたコマンドを実行するバッチファイルを書きたいと思います。
例えば、次のようなファイル群があるとします。
c:\directory\file1.xls
c:\directory\file2.xls
c:\directory\file3.xls
の場合、出力は次のようになります。
c:\directory\file1.xlsx
c:\directory\file2.xlsx
c:\directory\file3.xlsx
ですから、バッチの疑似コードは次のようになります。
directory = c:\directory\
for (fileName in directory)
ssconvert fileName.xls fileName.xlsx
誰か助けてくれませんか?
for /r %%v in (*.xls) do ssconvert "%%v" "%%vx"
の説明を求められたので、説明します。
パート1:for /r %%v in (*.xls)
この部分は、カレントディレクトリにある、拡張子が xls
のファイルの配列を返します。拡張子がxls
のファイルの配列を返します。これは基本的に、%PATH%や%TEMP%で使われるような、コマンドラインの特別な%
文字です。これをバッチファイルで使用するには、次のようにエスケープする必要があります。%%PATH%%または
%%TEMP%%` のようにエスケープします。この場合は、ファイル名の配列を格納する一時変数「v」をエスケープしているだけです。
また,/r
スイッチを使ってファイルを再帰的に検索しているので,子フォルダにある一致したファイルも検索されます。
パート2: do ssconvert "%%v" "%%vx"
この2番目の部分は、一致するファイル名ごとに1回ずつ実行されますので、現在のフォルダに以下のファイルが存在していたとします。
c:temp\mySheet.xls, c:temp_mySheet_yesterday.xls, c:\temp\mySheet_20160902.xls`
と入力すると、以下のようなコマンドが実行されます。
ssconvert "c:\temp\mySheet.xls" "c:╲temp\mySheet.xlsx" ssconvert "c:\ySheet_yesterday.xls" "c:⏺️⏺️⏺️。 ssconvert "c:\temp\mySheet_20160902.xls" "c:╲temp\mySheet_20160902.xlsx"`
実はこれ、Windows Vista以降はかなり簡単になっています。マイクロソフトは、FORFILESというコマンドを追加しました。
あなたの場合は
forfiles /p c:\directory /m *.xls /c "cmd /c ssconvert @file @fname.xlsx"
このコマンドで唯一奇妙なことは、forfiles が自動的に @file と @fname を二重引用符で囲んでしまうことですが、いずれにしても動作するはずです。
以下のように実行することができます(以下のコードを.batに貼り付けるか、または相互に実行させたい場合は、%%
を%%
に置き換える)。
for %%i in (c:\directory\*.xls) do ssconvert %%i %%i.xlsx
powershellを実行できる場合は、次のようになります。
Get-ChildItem -Path c:\directory -filter *.xls | foreach {ssconvert $($_.FullName) $($_.baseName).xlsx }