【问题标题】:batch script - run command on each file in directory批处理脚本 - 对目录中的每个文件运行命令
【发布时间】:2012-12-23 15:18:23
【问题描述】:

我需要将一些 xls 文件转换为 xlsx 文件。通过在 cmd 提示符(windows)中运行此命令,我可以成功地将一个 xls 文件转换为 xlsx:

ssconvert inputFileName.xls outputFileName.xlsx

(ssconvert 是 Gnumeric 的命令行实用程序,可以在不同的电子表格文件格式之间进行转换)

我想写一个批处理文件,指定目录中的 FOR 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

谁能帮帮我?

【问题讨论】:

标签: batch-file cmd foreach ssconvert


【解决方案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"

【讨论】:

  • 我无法让它与 /r 一起使用。删除它,它很好。
  • @BradIrby 我用它来运行 jar-Konverter 而不是 ssconvert,它运行良好,所以你的 dos cmd.exe 可能有一些问题 ;-)。
  • 请记住,如果您在命令提示符下尝试使用单百分号,而在批处理 (cmd) 文件中则需要双百分号!
  • 你为什么不解释命令,以便像我这样的其他人可以更好地使用它......?
  • @Phoenix 你可以使用"%%~nv" 来获取不带扩展名的文件名
【解决方案2】:

实际上,从 Windows Vista 开始,这很容易。微软添加了命令FORFILES

在你的情况下

forfiles /p c:\directory /m *.xls /c "cmd /c ssconvert @file @fname.xlsx"

这个命令唯一奇怪的地方是 forfiles 会自动在@file 和@fname 周围添加双引号。但无论如何它应该可以工作

【讨论】:

【解决方案3】:

你可以运行这样的东西(将下面的代码粘贴到 .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 }

【讨论】:

  • 第一个命令是否工作,因为 %%i 已经具有 .xls 扩展名,因此您将转换为 .xlsxlsx
【解决方案4】:

我正在做类似的事情来编译目录中的所有 c 文件。
迭代不同目录中的文件试试这个。

set codedirectory=C:\Users\code
for /r  %codedirectory% %%i in (*.c) do 
( some GCC commands )

【讨论】:

    猜你喜欢
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 2015-09-02
    • 2011-12-15
    • 2018-05-17
    • 1970-01-01
    相关资源
    最近更新 更多