所以我一直在尝试编写一个脚本,而不是回显目录中所有文件的所有文件路径(包括子目录)。
到目前为止我已经想出了这个:
SETLOCAL ENABLEDELAYEDEXPANSION
for /f "delims=" %%F IN ('dir /b /s /B *.java') do (
SET "str123=%%~F"
echo "!str123:\=/!" >> sources.txt
)
除了文件路径包含特殊字符(如'º')的情况外,这是我想要的。当发生这种特殊情况时,.txt文件中的字符将被'§'替换。尝试为此源文件运行javac将失败(它表示文件丢失)。如果我打开文本文件并将所有§替换为'º',它将起作用。 有没有办法改进我的脚本来处理这些情况?
答案 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接受所有属性。