批处理脚本 - 对目录中的每个文件运行命令

BeN*_*ErR 35 foreach cmd batch-file ssconvert

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

ssconvert inputFileName.xls outputFileName.xlsx
Run Code Online (Sandbox Code Playgroud)

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

我想编写一个批处理文件,指定目录中的FOR EACH文件运行我上面写的命令,使用当前文件名作为输入和输出文件名.

例如,如果我有这组文件:

c:\directory\file1.xls
c:\directory\file2.xls
c:\directory\file3.xls
Run Code Online (Sandbox Code Playgroud)

输出应该是

c:\directory\file1.xlsx
c:\directory\file2.xlsx
c:\directory\file3.xlsx
Run Code Online (Sandbox Code Playgroud)

所以批量伪代码应该是这样的

directory = c:\directory\
for (fileName in directory)
    ssconvert fileName.xls fileName.xlsx
Run Code Online (Sandbox Code Playgroud)

谁能帮我?

pau*_*aul 47

for /r %%v in (*.xls) do ssconvert "%%v" "%%vx"
Run Code Online (Sandbox Code Playgroud)

有几个人让我解释这个,所以:

第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"

  • 你为什么不解释这个命令,以便像我这样的人可以更好地利用它......? (4认同)
  • 请记住,如果您尝试从命令提示符,它使用单个百分号,而在批处理(cmd)文件中它需要双百分号! (2认同)

web*_*rik 24

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

在你的情况下

forfiles /p c:\directory /m *.xls /c "cmd /c ssconvert @file @fname.xlsx"
Run Code Online (Sandbox Code Playgroud)

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


Loï*_*HEL 9

你可以运行这样的事情(粘贴到蝙蝠的代码波纹管,或者如果你想让它interractively运行取代%%%:

for %%i in (c:\directory\*.xls) do ssconvert %%i %%i.xlsx
Run Code Online (Sandbox Code Playgroud)

如果你可以运行powershell,它将是:

Get-ChildItem -Path c:\directory -filter *.xls | foreach {ssconvert $($_.FullName) $($_.baseName).xlsx }
Run Code Online (Sandbox Code Playgroud)