DOSKEY召回别名

时间:2014-08-06 10:51:22

标签: windows batch-file cmd alias doskey

是否可以使用DOSKEY调用别名? 简单的例子..我希望做类似的事情:

DOSKEY a=someCommand
DOSKEY b=someOtherCommand
DOSKEY c=andAThirdCommand

:: How to do this? -> DOSKEY all=a+b+c

我已经知道我可以写下这个:

DOSKEY all=someCommand ^& someOtherCommand ^& andAThirdCommand

但在重用内容的意义上,我想重用上面定义的别名。 是否有可能像我想要的那样?

谢谢!

PS:看到这里,但这不是一个令人满意的答案。看起来它不会起作用。 :(

1 个答案:

答案 0 :(得分:3)

好问题,很难回答......但是,我可以建议使用简单的批处理脚本进行解决。

假设我们定义了doskey a=commandAdoskey a=commandB以及doskey c=commandC宏。

  1. 静态方法:让我们为脚本命名,例如dem de 罚款 m acro)并将其放在path的某个位置。然后dem acb a c b定义新的宏 acb(准备进一步使用),如下所示:doskey acb=commandA $T commandC $T commandB。该脚本可以通过提供的脚本dsk进行一些调整来建立(提示:而不是启动宏文本,构成新宏的文本,但是要知道另一个逃脱的事。)

  2. 动态方法:让我们为我们的脚本命名,例如dsk d o sk ey)并将其放在path的某个位置。然后dsk a b c应该在该序列中调用宏 abc。传递给脚本的参数(宏名称)的数量不受限制。该脚本适用于非常简单的宏,但

    • 允许使用%百分号,例如doskey a=echo %variable%宏和/或for循环,例如doskey a=for /F "tokens=*" %G in ('dir /b /s *.txt') do @echo %G;
    • 允许$T一个宏中的连接命令(相当于批处理文件中的&),如doskey a=dir $T set;通过将$T替换为&来完成(在极少数情况下是不够的,然后需要单独拆分和执行命令)。
  3. 已知问题和/或限制(如果不了解更多关于使用的宏的真实结构,则无法解决); dsk脚本

    • for循环可能会导致%%parameter变量出现问题;否决了在宏中使用:%%{(外循环)和%%? %%@(内循环)
    • 不允许像doskey a=dir ^> somefile;
    • 那样管道或重定向
    • 不允许宏中的^&连接命令(但允许doskey内在$T连接);
    • 不允许在.bat程序(cca第50行)中启动批处理.cmdcall %xitem%脚本(需要%xitem%而不是:doItem;
    • 如果找不到宏名称,那就太过分了......

    脚本dsk如下:

    :: dsk.bat
    @ECHO OFF >NUL
    @SETLOCAL enableextensions enabledelayedexpansion
    set "CheckOnly=0"
    
    set "DoneList="
    set "ToDoList="
    set "xitem=x"
    for %%{ in (%*) do (
      set "_G_found=0"
      echo.
      for /F "tokens=1* delims==" %%? in ('doskey /macros') do (
        if /i "%%{"=="%%?" (
          for /F "tokens=*" %%_ in ("%%@") do set "item=%%_"
          if /i "!item:~0,3!"=="for" set "item=!item:%%=%%%%!"
          if "%CheckOnly%"=="1" (
              echo :  to do: '!item!'
          ) else (
              echo :  To Do: '!item!'
              call :doItem !item!
          )
          set "DoneList=!DoneList! +%%{"
          set "_G_found=1"
        ) 
      )
      if "!_G_found!"=="0" (
        set "DoneList=!DoneList! -%%{"
        echo :  macro: [%%{] ^(not found^)
        if "!ToDoList!"=="" set "ToDoList=!ToDoList!, [%%{]"
        if "!ToDoList!"=="!ToDoList:[%%{]=!" set "ToDoList=!ToDoList!, [%%{]"
      )
    )
    echo.
    echo :  
    echo :    trailing progress report
    echo :  
    if "%ToDoList%"=="" (
        echo :    all found: %DoneList:~1%
    ) else (
        echo :    +found, -not found: %DoneList:~1%
        echo :   %ToDoList:~2% not found in macro name list 
    )
    echo :    end of batch %~f0
    echo :  
    :endlocal
    @ENDLOCAL
    @goto :eof
    
    :doItem
      set "xitem=%*"
      set "xitem=%xitem:$T=&%"
      %xitem%
    @goto :eof
    

    下一个场景:

    d:\bat>doskey /macros
    y=for /F "tokens=*" %g in ('dir /b rand.bat') do @echo %g
    x=dir /B /AD $T dir /B /AD "D:\Remote\bat\COCL\bu bu bu" $T set y
    a=echo CheckOnly=%CheckOnly%
    b=rand.bat
    

    dsk y b a x n调用会给出下一个输出:

    d:\bat>dsk y b a x n
    
    :  To Do: 'for /F "tokens=*" %%g in ('dir /b rand.bat') do @echo %%g'
    rand.bat
    
    :  To Do: 'rand.bat'
    The system cannot find the batch label specified - doItem
    
    :  To Do: 'echo CheckOnly=%CheckOnly%'
    CheckOnly=0
    
    :  To Do: 'dir /B /AD $T dir /B /AD "D:\Remote\bat\COCL\bu bu bu" $T set y'
    files
    a.dot 1.dot 2.dot 3
    Environment variable y not defined
    
    :  macro: [n] (not found)
    
    :
    :    trailing progress report
    :
    :    +found, -not found: +y +b +a +x -n
    :   [n] not found in macro name list
    :    end of batch d:\bat\dsk.bat
    :
    d:\bat>
    

    脚本对于调试目的而言相当冗长(以及变量CheckOnly,值为1 =仅 echo 命令,0 = echo和< em>在宏中执行命令)。