2016-08-14 2 views
1

У меня есть текстовый файл с именем paths.txt Он содержит следующие данные,Почему для/f подтягивает имя файла?

LocalName RemotePath
N: \ DANIEL-HP \ Users \ Public
Z: \ DANIEL-HP \ Users \ Общественные \ Favorites
LocalName RemotePath
N: \ DANIEL-HP \ Users \ Public
Z: \ DANIEL-HP \ Users \ Public \ Favorites

Я запускаю следующий командный файл, чтобы извлечь нужную букву пути, путь.

@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 /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, что она разрешает прохождение файла.

ответ

3

Проблема заключается в вашей команде FIND, а не в FOR/F.

FIND всегда печатает имя файла, подобного этому, если он открывает сам файл (если имя файла передано в качестве аргумента).

Вы можете избежать имя файла с помощью перенаправления:

find ":" <paths.txt 

или трубы:

type paths.txt | find ":" 

Чтобы использовать их в цикле, труба или Перенаправление должен быть экранированы.

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 

Если файл Юникода (UTF-16), то вы можете преобразовать содержимое в ASCII по конвейеру вывод команды TYPE (опять-таки, избежать трубу, если используется в FOR/F):

type paths.txt | findstr ":" 
+0

находка ":" DannyBoi

+0

@dbenham .... Все предлагаемые вами решения отлично работают вне цикла ** for **, но в скобках '()' цикла for, они не. Pls советует синтаксис. – DannyBoi

+2

@DannyBoi Специальные символы должны быть экранированы, см. Edit – jeb

1

необходимость быть удален;))

/* совет я:

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) 

*/

+0

'--- Findstr --- Тип 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' То, что я получаю – DannyBoi

Смежные вопросы