在批处理文件中,是否可以用for循环替换SED和TR的这种用法?

时间:2009-09-15 00:32:44

标签: windows batch-file sed cmd

批处理文件:

@echo.
@set curdrive=%~d0
@path | %curdrive%\utils\sed -e "s/PATH=//" | %curdrive%\utils\tr ; \n
@echo.

示例输出(每行一个路径元素):

C:\cheeso\bin
C:\Perl\bin
c:\utils
C:\Windows\system32
C:\Windows
C:\Windows\System32\Wbem
c:\Program Files\Microsoft SQL Server\90\Tools\binn\
c:\.net3.5
c:\.net2.0
c:\vs2008\common7\IDE
c:\netsdk2.0\bin

此批处理文件取决于UnxUtils中的sed.exe和tr.exe。 我只想使用Windows附带的内置命令和程序来做同样的事情。我可以做吗?提示?

5 个答案:

答案 0 :(得分:1)

警告,滥用递归:

@echo off

call :one "%PATH%"
goto :eof

:one
for /f "tokens=1,* delims=;" %%i in (%1) do (
    echo %%i
    if not "%%j"=="" call :one "%%j"
)

答案 1 :(得分:1)

这是一个非递归版本。不是更好,但我想寻找另一种解决方案:

SETLOCAL ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS
:again
FOR /F "delims=;" %%I IN ("%PATH%") DO ECHO %%I & SET PATH=!PATH:%%I;=!
IF DEFINED PATH GOTO :again
ENDLOCAL

我相信这只适用于Windows XP,2003 Server和更新版本。

答案 2 :(得分:1)

setlocal
SET _Path="%Path:;=";"%"
FOR %%a IN (%_Path%) DO ECHO     %%~a
endlocal

答案 3 :(得分:0)

我开始使用它:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS
set tpath=%path%;
echo.
:again
FOR /F "delims=;" %%I IN ("%TPATH%") DO (
  echo    %%I 
  set TPATH=!TPATH:%%I;=!
)
IF DEFINED TPATH GOTO :again

ENDLOCAL

但后来决定这更简单:

setlocal
set _path="%PATH:;=" "%"
for %%p in (%_path%) do if not "%%~p"=="" echo     %%~p
endlocal

答案 4 :(得分:0)

我在我的Windows 2003服务器上试过这个并且它有效。这是我的showpath.cmd的内容:

@echo off
for %%p in (%PATH%) do echo %%p