【问题标题】:Why is for /f pulling up the file name?为什么 for /f 拉起文件名?
【发布时间】:2016-08-14 04:03:09
【问题描述】:

我有一个名为paths.txt的文本文件,它包含以下数据,

本地名称远程路径
N:\DANIEL-HP\Users\Public
Z:\DANIEL-HP\Users\Public\Favorites
本地名称远程路径
N:\DANIEL-HP\Users\Public
Z:\DANIEL-HP\Users\Public\Favorites

我正在运行以下批处理文件来提取所需的信息路径字母 path。

@echo off
for /f "tokens=1 delims=" %%a in ('find ":" paths.txt') do (
echo %%a
)
pause

结果

---------- PATHS.TXT
N:         \\DANIEL-HP\Users\Public
Z:         \\DANIEL-HP\Users\Public\Favorites
N:         \\DANIEL-HP\Users\Public
Z:         \\DANIEL-HP\Users\Public\Favorites
Press any key to continue . . .

我解决这个问题的方法是修改 FOR 如下,

for /f "skip=2 tokens=1 delims=" %%a in ('find ":" paths.txt') do (echo %%a)

我得到了一个干净的期望输出,

N:         \\DANIEL-HP\Users\Public
Z:         \\DANIEL-HP\Users\Public\Favorites
N:         \\DANIEL-HP\Users\Public
Z:         \\DANIEL-HP\Users\Public\Favorites
Press any key to continue . . .

问题是,我的第一个 FOR 函数有什么问题,它允许文件名通过。

【问题讨论】:

    标签: parsing batch-file for-loop filenames


    【解决方案1】:

    问题在于您的 FIND 命令,而不是您的 FOR /F。

    如果 FIND 打开文件本身(如果文件名作为参数传入),它总是会打印出文件名。

    您可以通过使用重定向来避免文件名:

    find ":" <paths.txt
    

    或管道:

    type paths.txt | find ":"
    

    要在 FOR 循环中使用这些,必须对管道或重定向进行转义。

    for /f "tokens=1 delims=" %%a in ('find ":" ^< paths.txt') do echo %%a
    for /f "tokens=1 delims=" %%a in ('type paths.txt ^| find ":"') do echo %%a
    

    另一种替代方法是使用 FINDSTR(但仅当文件为 ASCII 时):

    findstr ":" paths.txt
    

    如果文件是 unicode (UTF-16),那么您可以通过管道 TYPE 命令的输出将内容转换为 ASCII(同样,如果在 FOR /F 中使用管道,则转义管道):

    type paths.txt | findstr ":"
    

    【讨论】:

    • 找到 ":"
    • @dbenham....您建议的所有解决方案都可以在 for 循环之外完美运行,但在 for 循环的括号“()”内,它们不是.请建议语法。
    • @DannyBoi 特殊字符需要转义,见编辑
    • 我刚刚在 for 循环之外执行了findstr ":" paths.txt,我得到了,` N : \ \ D A N I E L - H P \ U s e r s \ P u b l i c Z : \ \ D A N I E L - H P \ U s e r s \ P u b l i c \ F a v o r i t e s` 故意在每个字符前加一个空格。
    • @DannyBoi - 您的文件必须是 unicode(可能是 UTF-16),这不适用于 FINDSTR。 FINDSTR 命令仅支持 ASCII。我的答案已被编辑。
    【解决方案2】:

    需要删除;))

    /* 我的建议:

    find ":" ^<paths.txt
    type paths.txt ^| find ":"
    

    findstr 工作得很好.. 我不明白你有什么空白

    @echo off
    set "tmp=PATHS.TXT"----your value
    echo,---findstr
    for /f "tokens=1 delims=" %%a in ('findstr ":" %tmp%') do (echo %%a)
    echo,---type
    for /f "tokens=1 delims=" %%a in ('type %tmp% ^| find ":"') do (echo %%a)
    echo,---redirect
    for /f "tokens=1 delims=" %%a in ('find ":" ^<%tmp%') do (echo %%a)
    

    */

    【讨论】:

    • ---findstr ---type N: \\DANIEL-HP\Users\Public Z: \\DANIEL-HP\Users\Public\Favorites N: \\DANIEL-HP\Users\Public Z: \\DANIEL-HP\Users\Public\Favorites ---redirect N: \\DANIEL-HP\Users\Public Z: \\DANIEL-HP\Users\Public\Favorites N: \\DANIEL-HP\Users\Public Z: \\DANIEL-HP\Users\Public\Favorites 这就是我得到的输出
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    相关资源
    最近更新 更多