Windows批处理文件将目录中的所有文件路径以特殊字符回显到文件

时间:2014-03-30 17:51:18

标签: batch-file

所以我一直在尝试编写一个脚本,而不是回显目录中所有文件的所有文件路径(包括子目录)。

到目前为止我已经想出了这个:

SETLOCAL ENABLEDELAYEDEXPANSION
for /f "delims=" %%F IN ('dir /b /s /B *.java') do (
    SET "str123=%%~F"
    echo "!str123:\=/!" >> sources.txt
)

除了文件路径包含特殊字符(如'º')的情况外,这是我想要的。当发生这种特殊情况时,.txt文件中的字符将被'§'替换。尝试为此源文件运行javac将失败(它表示文件丢失)。如果我打开文本文件并将所有§替换为'º',它将起作用。 有没有办法改进我的脚本来处理这些情况?

1 个答案:

答案 0 :(得分:2)

这是FOR / F的已知问题 - 它不处理未映射到当前代码页的unicode字符。

但FOR / R确实有效: - )

如果文件名可能包含!,则应在循环中打开和关闭延迟扩展。如果启用了延迟扩展,则包含!的变量在扩展时会损坏。

您的代码会在每次迭代时重新打开输出文件一次。打开和定位写入光标需要时间。如果在一组额外的括号中包围整个FOR语句并且只重定向一次,则性能会明显提高。这也允许您使用常规重定向(不是追加模式),因此您的输出文件每次都可以为空。

@echo off
setlocal disableDelayedExpansion
(for /r %%F in (*.java) do (
  set "file=%%F"
  setlocal enableDelayedExpansion
  echo "!file:\=/!"
  endlocal
)) >sources.txt

使用FOR / R代替FOR / F和DIR / S的唯一缺点是你无法以这种方式获取系统或隐藏文件。但是你的原始代码无论如何都没有得到系统或隐藏文件。

如果您使用dir /a,为了将来参考,您可以使用DIR命令包含系统和隐藏文件。使用不含任何属性的/a会导致DIR接受所有属性。