【问题标题】:Including subfolders in a CMD batch file在 CMD 批处理文件中包含子文件夹
【发布时间】:2018-07-30 10:40:44
【问题描述】:

我正在使用批处理文件将 XLSB 文件转换为 CSV - 从这里开始: https://stackoverflow.com/a/11252731/9403175

很好,但我还想包含子文件夹。我有 0 次编写批处理文件的经验,所以我只是复制了它(并为工作表名称添加了一个额外的参数)。

我正在使用的代码:

FOR /f "delims=" %%i IN ('DIR *.xls* /b') DO ExcelToCsv.vbs "qrOUTPUT1" "%%i" "%%~ni.csv"

我在 Google 上搜索到您应该使用 FOR /R 而不是 FOR /F,但它不起作用。

我试着修改了一下,也想出了这个:

FOR /f "delims=" %%i IN ('DIR *.xls* /b /s') DO ExcelToCsv.vbs "qrOUTPUT1" "%%i" "%%i.csv"

另一方面,这个版本也通过子文件夹循环,但错误地将文件保存为*.xlsb.csv,而不仅仅是*.csv(我猜在最后一个参数中没有~n,它需要整个文件路径)

有人可以帮帮我吗?我认为这对于更有经验的人来说应该相当简单

谢谢!

【问题讨论】:

  • dir /?。你是用For来遍历dir的输出,所以for /f是对的。
  • CatCat:虽然它不适用于子文件夹,但它只会遍历顶级文件夹中的文件
  • @CatCat:多亏了 dir /?你的帖子建议,我想我可以这样做: FOR /f "delims=" %%i IN ('DIR .xls /b /s') DO ExcelToCsv.vbs "qrOUTPUT1" "% %i" "%%i.csv" 现在甚至循环通过子文件夹,但它现在具有 .xlsb.csv 作为文件类型:P 所以我仍然可以改进,只是不知道如何......
  • For阅读帮助的结尾。
  • 为什么你会选择在你的第一组代码中使用 FOR 变量修饰符而不是第二组?

标签: windows shell batch-file command-line cmd


【解决方案1】:

您似乎使查询过于复杂。您不需要执行 dir /S 函数,因为 for /R 会为您递归执行。

for /R %%i in (*.xlsb) do ExcelToCsv.vbs "qrOUTPUT1" "%%i" "%%~dpni.csv"

当您运行cmd.exe 并输入for /? 时,您滚动到变量引用,您将看到:

%~nI        - expands %I to a file name only

这将从名称中去除扩展名,因此在我的示例中,我只是使用%%~ni.csv

【讨论】:

  • 谢谢 - 这与我在试验时得到的类似,但这段代码的问题是它试图将所有文件写入顶层文件夹(所以它总是问如果你想覆盖) - 但是,我需要将文件保留在与原始 XLSB 文件相同的子文件夹中。这是我只有在删除 ~n 时才能做到的(然后它显示完整路径)。我已经在一夜之间运行了脚本,所以我将所有文件都保存为 .XLSB.CSV - 我想我会制作另一个 BAT 将它们重命名为 .CSV
  • @RadekC 这不会使用原始文件扩展名,保证!!我将其更改为使用 %%~dpni 代替,意思是驱动器、路径和名称,这会将其放置在找到的同一目录中。试试看,你会发现它会起作用的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-22
  • 2016-01-30
  • 1970-01-01
  • 1970-01-01
  • 2013-11-26
  • 2012-03-11
  • 1970-01-01
相关资源
最近更新 更多