是否可以使用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:看到这里,但这不是一个令人满意的答案。看起来它不会起作用。 :(答案 0 :(得分:3)
好问题,很难回答......但是,我可以建议使用简单的批处理脚本进行解决。
假设我们定义了doskey a=commandA
和doskey a=commandB
以及doskey c=commandC
宏。
静态方法:让我们为脚本命名,例如dem
( de 罚款 m acro)并将其放在path
的某个位置。然后dem acb a c b
应定义新的宏 acb
(准备进一步使用),如下所示:doskey acb=commandA $T commandC $T commandB
。该脚本可以通过提供的脚本dsk
进行一些调整来建立(提示:而不是启动宏文本,构成新宏的文本,但是要知道另一个逃脱的事。)
动态方法:让我们为我们的脚本命名,例如dsk
( d o sk ey)并将其放在path
的某个位置。然后dsk a b c
应该在该序列中调用宏 a
,b
和c
。传递给脚本的参数(宏名称)的数量不受限制。该脚本适用于非常简单的宏,但
%
百分号,例如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
替换为&
来完成(在极少数情况下是不够的,然后需要单独拆分和执行命令)。已知问题和/或限制(如果不了解更多关于使用的宏的真实结构,则无法解决); dsk
脚本
for
循环可能会导致%%parameter
变量出现问题;否决了在宏中使用:%%{
(外循环)和%%?
%%@
(内循环)doskey a=dir ^> somefile
; ^&
连接命令(但允许doskey
内在$T
连接); .bat
程序(cca第50行)中启动批处理.cmd
或call %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>在宏中执行命令)。