Um comando FOR / F do cmd batch que não abrirá um arquivo de texto

1

Eu tenho tentado por dois dias fazer com que o script superficialmente simples abaixo funcione:

for /F "eol=*" %%A in  (c:/users/SCTMP000/server.txt) do (echo %%A)

Isso é uma redução do código desejado, que pretendia percorrer o arquivo de texto acima, que é apenas uma lista de domínios, para emitir um comando PING / TRACERT em cada domínio e caminho. a saída para outro arquivo de texto. Mas até mesmo este simples one-liner não processará o arquivo.

Eu tenho visto inúmeras variações dos citados acima no MSDN, StackOverflow, neste site e em muitos blogs de desenvolvedores pessoais, então sinta que estou no parque certo, mas o meu não vai funcionar! Dependendo de como eu renderizo o nome do arquivo e seu caminho (-ou quoteless, envolto em aspas simples, envolto em aspas duplas), vejo:

[quoteless] - nada: nenhuma atividade de abertura de arquivo e, portanto, nenhum ECHO por linha

[aspas duplas] - o nome completo do caminho ECHOed, ou seja, c: /users/SCTMP000/server.txt

[single-quoted] - o arquivo completo é realmente aberto no bloco de notas !!

Portanto, o caminho está correto, mas nem o script executado como um arquivo em lotes nem um comando executado interativamente parece conseguir realmente abrir o arquivo de texto e rolar através dele. Note também que tentei várias opções de linha: DELIMS, TOKENS, EOL etc, sem sucesso.

O que estou fazendo de errado? Desde já, obrigado.

    
por robgoch 13.11.2017 / 17:56

1 resposta

0

Consegui fazer isso funcionar com os resultados explicados usando um arquivo de lista de exemplos com nomes de domínio que coloquei na lista. Eu usei o FOR /F "USEBACKQ TOKENS=*" %%A IN ("filelist") apenas assim.

Eu tento usar os loops USEBACKQ e TOKENS=* nos FOR / F que leem de uma lista de arquivos pelas razões que listei abaixo na seção Script Logic Explained , leia isso e teste para confirmar.

Exemplo de lote de trabalho

FOR /F "USEBACKQ TOKENS=*" %%A IN ("c:\users\SCTMP000\server.txt") DO (ECHO %%~A)

Script Logic Explained

  • The USEBACKQ option used in the FOR loop will ensure the file list can still be read if the file list name or it's path has any spaces in it and you need to double quote the file list path

    • E.g. SET FileList=C:\Folder Name\File List.txt
      • Without the USEBACKQ the FOR loop would error out in a case like this
  • The TOKENS=* option used in the FOR loop will ensure the the entire value is returned as it's read from the file list even if that value has a space in it even though that should not be applicable to domains this is why you'd use it

    • E.g. File list has a value of "test my file.txt" so the value has a space on a line

      • Without the TOKENS=* the FOR loop would only return the value portion of that line before the first space and not the value as expected (i.e. "test")

Using these options even when not needed does not seem to cause any harm and should you ever introduce such a value or variable into the mix of the script, it'd already be able to handle such cases accordingly.

Mais recursos

  • FOR / F
  • Solução de problemas do Agendador de Tarefas Tarefas
  • FOR /?

        tokens=x,y,m-n  - specifies which tokens from each line are to
                          be passed to the for body for each iteration.
                          This will cause additional variable names to
                          be allocated.  The m-n form is a range,
                          specifying the mth through the nth tokens.  If
                          the last character in the tokens= string is an
                          asterisk, then an additional variable is
                          allocated and receives the remaining text on
                          the line after the last token parsed.
        usebackq        - specifies that the new semantics are in force,
                          where a back quoted string is executed as a
                          command and a single quoted string is a
                          literal string command and allows the use of
                          double quotes to quote file names in
                          file-set.
    
por 19.11.2017 / 17:02