Подтвердить что ты не робот

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

Кто-нибудь может мне помочь?

4b9b3361

Ответ 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 )