Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows DOSKEY调用别名_Windows_Batch File_Cmd_Alias_Doskey - Fatal编程技术网

Windows DOSKEY调用别名

Windows DOSKEY调用别名,windows,batch-file,cmd,alias,doskey,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 但在重用东

是否可以使用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:在这里看到了这个,但这不是一个令人满意的答案。不过,这似乎行不通(

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

假设我们已经定义了
doskey a=commandA
doskey a=commandB
doskey c=commandC

  • Static方法:让我们命名脚本,例如
    dem
    definemacro)并将其放置在
    路径中的某个位置。然后
    demacab
    应该定义一个新的宏
    acb
    (准备进一步使用)如下所示:
    doskey acb=commandA$T commandC$T commandB
    。该脚本可以通过对提供的脚本
    dsk
    进行一些修改来建立(提示:不要启动宏文本,而是为新宏构成文本,但要注意另一个转义)

  • Dynamic方法:让我们命名脚本,例如
    dsk
    doskey)并将其放置在
    路径的某个地方。然后
    dsk a b c
    按该顺序调用宏
    a
    b
    c
    。参数数(宏名称)传递给脚本并不受限制。脚本可以很好地处理定义非常简单的宏,但是

    • 允许
      %
      doskey a=echo%variable%
      宏和/或甚至
      中为
      循环使用百分比符号,如
      doskey a=for/F”标记=*%G in('dir/b/s*.txt')do@echo%G
    • 允许在宏(相当于批处理文件中的
      &
      )中连接
      $T
      命令,如
      doskey a=dir$T set
      ;通过将
      $T
      替换为
      &
      (在极少数情况下不够,然后需要单独拆分和执行命令)
  • 已知问题和/或限制(如果不了解所用宏的实际结构,就无法解决);dsk脚本

    • 循环的
      可能会给
      %%参数
      变量带来问题;被否决在宏中使用:
      %%{
      (外循环)和
      %%?
      %%@
      (内循环)
    • 不考虑管道或重定向,如
      doskey a=dir^>somefile
    • 不允许宏中的
      ^&
      串联命令(但允许
      doskey
      内部
      $T
      串联)
    • 不允许启动批处理
      .bat
      .cmd
      脚本(需要
      调用%xitem%
      ,而不是
      :doItem
      过程(cca第50行)中的
      %xitem%
    • 如果找不到宏名称,它将被跳过
    脚本
    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
    =仅回显命令,
    0
    =在宏中回显和执行命令)。

    没有人知道答案?太糟糕了:(好吧,我想我可以接受它。duplicate:doskey是控制台API的简单包装器,因此编写一个调用和的小程序可能更简单。