Batch script - выполнить команду для каждого файла в каталоге
Мне нужно преобразовать некоторые файлы xls в файлы xlsx. Я могу успешно конвертировать один файл xls в xlsx, выполнив эту команду в командной строке cmd (windows):
ssconvert inputFileName.xls outputFileName.xlsx
(ssconvert - это утилита командной строки Gnumeric, которая может конвертировать между различными форматами файлов электронной таблицы)
Я хотел бы написать пакетный файл, который для файла EACH в указанном каталоге запускает приведенную выше команду, используя текущее имя файла как для ввода, так и для имени выходного файла.
Например, если у меня есть этот набор файлов:
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
Кто-нибудь может мне помочь?
Ответы
Ответ 1
for /r %%v in (*.xls) do ssconvert "%%v" "%%vx"
пара попросили меня объяснить это, поэтому:
Часть 1: for /r %%v in (*.xls)
Эта часть возвращает массив файлов в текущем каталоге с расширением xls
. %%
может показаться немного любопытным. Это в основном специальный символ %
из командной строки, используемый в% PATH% или% TEMP%. Чтобы использовать его в пакетном файле, нам нужно убежать так: %%PATH%%
или %%TEMP%%
. В этом случае мы просто избегаем временной переменной v
, которая будет содержать наш массив имен файлов.
Мы используем переключатель /r
для поиска файлов рекурсивно, поэтому также будут найдены любые соответствующие файлы в дочерних папках.
Часть 2: do ssconvert "%%v" "%%vx"
Эта вторая часть - это то, что будет выполняться один раз для каждого имени файла, поэтому, если в текущей папке присутствуют следующие файлы:
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:\temp\mySheet_yesterday.xls" "c:\temp\mySheet_yesterday.xlsx"
ssconvert "c:\temp\mySheet_20160902.xls" "c:\temp\mySheet_20160902.xlsx"
Ответ 2
На самом деле это довольно легко с Windows Vista. Microsoft добавила команду FORFILES
в вашем случае
forfiles /p c:\directory /m *.xls /c "cmd /c ssconvert @file @fname.xlsx"
Единственная странная вещь с этой командой заключается в том, что forfiles автоматически добавляет двойные кавычки вокруг @file и @fname. но он должен работать в любом случае
Ответ 3
вы можете запустить что-то вроде этого (вставьте код ниже в байт, или если вы хотите, чтобы он выполнял взаимозаменяемую замену %%
на %
:
for %%i in (c:\directory\*.xls) do ssconvert %%i %%i.xlsx
Если вы можете запустить powershell, это будет:
Get-ChildItem -Path c:\directory -filter *.xls | foreach {ssconvert $($_.FullName) $($_.baseName).xlsx }
Ответ 4
Я делаю схожие вещи, чтобы скомпилировать все файлы c в каталоге.
попробуйте это сделать для итерации файлов в разных каталогах.
set codedirectory=C:\Users\code
for /r %codedirectory% %%i in (*.c) do
( some GCC commands )