【问题标题】:DOSKEY recall aliasDOSKEY 调用别名
【发布时间】:2023-03-19 01:00:02
【问题描述】:

是否可以使用 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:看到这里,但这不是一个令人满意的答案。似乎它不会工作。 :(

【问题讨论】:

标签: windows batch-file cmd alias doskey


【解决方案1】:

好问题,很难回答...不过,我可以建议一个使用简单批处理脚本的解决方法。

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

  1. Static 方法:让我们为脚本命名,例如dem (define macro) 并将其放在您的 path 中的某个位置。然后dem acb a c b 应该定义一个新宏 acb(准备进一步使用)如下:doskey acb=commandA $T commandC $T commandB。该脚本可以通过对提供的脚本dsk 稍作修改来建立(提示:不是启动宏文本,构成新宏的文本,但请注意另一个转义)。

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

    • 允许在doskey a=echo %variable% 宏中使用% 百分号和/或甚至在doskey a=for /F "tokens=*" %G in ('dir /b /s *.txt') do @echo %G 中使用for 循环;
    • 允许$T 在宏中连接命令(相当于批处理文件中的&),例如doskey a=dir $T set;通过将$T 替换为& 来完成(在极少数情况下还不够,则需要单独拆分并执行命令)。

已知问题和/或限制(在不了解所用宏的真实结构的情况下无法解决); dsk 脚本

  • for 循环可能会给%%parameter 变量带来问题;否决在宏中使用:%%{(外循环)和%%? %%@(内循环)
  • 不考虑像doskey a=dir ^> somefile 这样的管道或重定向;
  • 不允许在宏中使用^& 串联命令(但允许doskey 内在$T 串联);
  • 不允许启动批处理 .bat.cmd 脚本(在 :doItem 过程中需要 call %xitem% 而不是 %xitem%(cca 第 50 行);
  • 如果没有找到宏名称,它只是被跳过了...

脚本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 和执行 宏中的命令)。

【讨论】:

猜你喜欢
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2018-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多