我有一个简单的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
)
答案 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是如何工作的,只是添加了我的补充/更正....希望它对你有用。 最好的问候!