批量FOR / F循环不会读取相对目录

时间:2014-07-04 13:16:26

标签: loops batch-file for-loop text

我有一个简单的FOR / F循环,除了文本文件的一行之外的所有内容:

for /f "skip=12 tokens=* delims= " %%f in (.\NonProcessed\*.txt) do (
   > newfile.txt echo.%%f
   goto :eof
)

但是当我跑步时,我得到了结果:

The system cannot find the file .\NonProcessed\*.txt

如果我在括号内输入文本文件的完全限定路径,for循环工作正常,但它无法处理我在那里的相对链接。我已经能够在另一个标准中使用完全相同的相对链接,在同一目录中运行的不同批处理文件中循环,没有任何问题。我无法理解为什么它不会起作用!请帮忙。

编辑:对于评论,我现在使用的代码是

for %%f in (.\NonProcessed\*.txt) do (
  echo f is %%f
  for /f "usebackq skip=12 tokens=* delims= " %%a in (%%f) do (
    echo a is %%a
    > %%f echo.%%a
    goto :continue
  )
:continue
  sqlcmd stuff here
)

2 个答案:

答案 0 :(得分:1)

很抱歉,for /f不允许你这样做。不,问题不是文件的相对路径,而是通配符。

根据documentation,你有语法案例

for /F ["ParsingKeywords"] {%% | %}variable in (filenameset) do command [CommandLineOptions]

对于这种情况,文档说明The Set argument specifies one or more file names。你可以做到

for /f %%a in (file1.txt file2.txt file3.txt) do ...

但不允许使用通配符。

如果您不知道要处理的文件的名称,最好的选择是添加额外的for命令以首先选择文件

for %%a in (".\NonProcessed\*.txt"
) do for /f "usebackq skip=12 tokens=* delims= " %%f in ("%%~fa"
) do (
   > newfile.txt echo(%%f
   goto :eof
)

执行时,goto命令将取消两个for循环,因此您将以原始代码所期望的相同行为结束。

已修改以使代码适应评论

@echo off

    set "folder=.\NonProcessed"

    pushd "%folder%"
    for /f "tokens=1,2,* delims=:" %%a in (
        ' findstr /n "^" *.txt ^| findstr /r /b /c:"[^:]*:13:" '
    ) do (
        echo Overwrite file "%%a" with content "%%c"
        >"%%a" echo(%%c
    )
    popd

读取文件夹中的所有文件,对行进行编号。第一个findstr命令的输出将是

filename.txt:99:lineContents

解析此输出以查找第13行,结果数据使用冒号作为分隔符进行拆分,因此我们将以%%a中的文件名结尾,%%b中的行号和%%c中的行内容。

答案 1 :(得分:0)

SET FILES_LIST=files_list.config
DIR /b .\NonProcessed\*.txt>!FILES_LIST!
for /f "skip=12 tokens=* delims= " %%f in (!FILES_LIST!) do (
   > newfile.txt echo.%%f
   goto :eof
)
IF EXIST "!FILES_LIST!" DEL "!FILES_LIST!"

我没有检查你的FOR是如何工作的,只是添加了我的补充/更正....希望它对你有用。 最好的问候!