"FOR"如何在cmd批处理文件中工作?

Sak*_*ake 23 iteration cmd batch-file

我已经用几十种语言编程了20年,但我无法理解"FOR"在windows cmd shell批处理文件中是如何工作的,无论我怎么努力.我读

http://www.amazon.com/Windows-Administration-Command-Line-Vista/dp/0470046163/ref=sr_1_1?ie=UTF8&s=books&qid=1241362727&sr=8-1

http://www.ss64.com/nt/for.html

互联网上的其他一些文章,但仍然混淆,无法完成任何事情.

任何人都可以简单地解释一下"FOR"的工作原理吗?

对于更具体的问题,我如何遍历%PATH%变量中的每个路径?我试过了

rem showpathenv.bat
for /f "delims=;" %%g in ("%PATH%") do echo %%g
Run Code Online (Sandbox Code Playgroud)

这只显示了第一条路径,而不是所有路径.为什么?我做错了什么?

Sak*_*ake 12

这些答案都没有实际效果.我自己设法找到了解决方案.这有点hackish,但它解决了我的问题:

echo off
setlocal enableextensions
setlocal enabledelayedexpansion
set MAX_TRIES=100
set P=%PATH%
for /L %%a in (1, 1, %MAX_TRIES%) do (
  for /F "delims=;" %%g in ("!P!") do (
    echo %%g
    set P=!P:%%g;=!
    if "!P!" == "%%g" goto :eof
  )
)
Run Code Online (Sandbox Code Playgroud)

哦!我讨厌批处理文件编程!!

更新

Mark的解决方案更简单,但它不适用于包含空格的路径.这是Mark解决方案的一个小修改版本

echo off
setlocal enabledelayedexpansion
set NonBlankPath=%PATH: =#%
set TabbedPath=%NonBlankPath:;= %
for %%g in (%TabbedPath%) do (
  set GG=%%g
  echo !GG:#= !
)
Run Code Online (Sandbox Code Playgroud)

  • 实际上,有一些很好的答案.从杰伊的答案来看,这可以在一行中完成C:\> for%p in("%path:; =""%")do @echo%~p (2认同)

Jay*_*Jay 5

马克的想法很好,但也许忘记了一些路径中有空格.替换';' 用"""代替将所有路径切换为带引号的字符串.

set _path="%PATH:;=" "%"
for %%p in (%_path%) do if not "%%~p"=="" echo %%~p
Run Code Online (Sandbox Code Playgroud)

所以在这里,你显示了你的路径.

cmd中的FOR命令有一个繁琐的学习曲线,特别是因为变量如何在()的语句中作出反应...你可以分配任何变量,但你不能在()中读回,除非你使用" setlocal ENABLEDELAYEDEXPANSION"语句,因此也使用!!而不是%%的变量(!_var!)

我目前只用cmd编写脚本,为了工作,不得不学习所有这些:)