首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DOSKEY召回别名

DOSKEY召回别名
EN

Stack Overflow用户
提问于 2014-08-06 10:51:22
回答 1查看 971关注 0票数 5

有可能回忆起带有DOSKEY的别名吗?简单的例子.。我想做这样的事情:

代码语言:javascript
复制
DOSKEY a=someCommand
DOSKEY b=someOtherCommand
DOSKEY c=andAThirdCommand

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

我已经知道,我可以这样写:

代码语言:javascript
复制
DOSKEY all=someCommand ^& someOtherCommand ^& andAThirdCommand

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

谢谢!

PS:在这里看到了这个,但这不是一个令人满意的答案。不过,似乎是行不通的。:(

EN

回答 1

Stack Overflow用户

发布于 2015-01-03 05:21:54

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

假设我们已经定义了doskey a=commandAdoskey a=commandBdoskey c=commandC宏。

  1. 静态方法:让我们命名我们的脚本,例如dem (define macro),并将它放在path中的某个地方。然后dem acb a c b 应该定义一个新的宏 acb (准备进一步使用)如下:doskey acb=commandA $T commandC $T commandB。这个脚本可以通过dsk提供的脚本的一些修改来建立(提示:不是启动宏文本,而是构成新宏的文本,但要注意另一个转义)。
  2. 动态(doskey)方法:让我们将脚本命名为dsk ,并将其放置在path中。然后dsk a b c应该按照这个顺序调用宏 abc。传递给脚本的参数(宏名称)数量不受限制。该脚本适用于非常简单定义的宏,但是

代码语言:javascript
复制
- allows `%` percent sign use like in `doskey a=echo %variable%` macro and/or even `for` loops like in `doskey a=for /F "tokens=*" %G in ('dir /b /s *.txt') do @echo %G`;
- allows `$T` concatenated commands in a macro (equivalent to `&` in a batch file) like `doskey a=dir $T set`; done by replacing `$T` with `&` (in rare cases does not suffice, then need to split and perform commands separately).

已知的问题和/或限制(如果不了解所使用的宏的实际结构,就无法解决);dsk脚本

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

脚本dsk如下:

代码语言:javascript
复制
:: 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

在下一个场景中:

代码语言:javascript
复制
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调用给出了下一个输出:

代码语言:javascript
复制
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=仅回送命令,0=回送并在宏中执行命令)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25158477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档