我已经尝试了两天来让下面这个表面上简单的脚本运行起来:
for /F "eol=*" %%A in (c:/users/SCTMP000/server.txt) do (echo %%A)
这本身就是我所需代码的缩减,我打算滚动浏览上面的文本文件(它只是一个域列表),以便针对每个域发出PING
/TRACERT
命令并将输出传送到另一个文本文件。但即使是这个简单的单行代码也无法处理该文件。
我在 MSDN、StackOverflow、本网站和许多个人开发者博客上看到了上述无数的变体,所以觉得我的判断是正确的,但我的却行不通!根据我如何呈现文件名及其路径(即无引号、用单引号括起来、用双引号括起来),我看到:
[quoteless] - 没有内容:没有文件打开活动,因此每行没有 ECHO
[双引号] - ECHOed 的完整路径名,即 c:/users/SCTMP000/server.txt
[单引号]-完整文件实际上在记事本中打开!!
因此路径是正确的,但无论是作为批处理文件运行的脚本,还是以交互方式运行的命令,似乎都无法真正打开文本文件并滚动浏览它。还请注意,我尝试了许多行选项:DELIMS、TOKENS、EOL 等,但都没有成功。
我做错了什么?提前致谢。
答案1
我能够使用包含我放入列表中的域名的示例列表文件来让其与解释结果一起工作。我FOR /F "USEBACKQ TOKENS=*" %%A IN ("filelist")
就是这么使用的。
我USEBACKQ
尝试使用TOKENS=*
为/F循环读取文件列表,原因如下所列脚本逻辑解释部分,因此请仔细阅读并测试以确认。
工作批次示例
FOR /F "USEBACKQ TOKENS=*" %%A IN ("c:\users\SCTMP000\server.txt") DO (ECHO %%~A)
脚本逻辑解释
USEBACKQ
使用的选项为了循环将确保如果文件列表名称或其路径中有空格,则仍可以读取文件列表,并且需要用双引号括住文件列表路径
- 例如
SET FileList=C:\Folder Name\File List.txt
- 没有
USEBACKQ
为了在这种情况下循环就会出错
TOKENS=*
使用的选项为了循环将确保从文件列表读取时返回整个值,即使该值中有一个空格,尽管这不适用于域,这就是你要使用它的原因
例如,文件列表的值为,
"test my file.txt"
因此该值在一行上有一个空格
- 没有
TOKENS=*
为了循环只会返回第一个空格之前该行的值部分,而不是预期的值(即"test"
)即使在不需要时使用这些选项似乎也不会造成任何伤害,并且如果您在脚本组合中引入这样的值或变量,它已经能够相应地处理这种情况。
更多资源
- 为/F
- 任务计划程序任务疑难解答
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.