Windows DOSKEY调用别名
是否可以使用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 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
宏
dem
(definemacro)并将其放置在路径中的某个位置。然后demacab
应该定义一个新的宏acb
(准备进一步使用)如下所示:doskey acb=commandA$T commandC$T commandB
。该脚本可以通过对提供的脚本dsk
进行一些修改来建立(提示:不要启动宏文本,而是为新宏构成文本,但要注意另一个转义)
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
替换为&
(在极少数情况下不够,然后需要单独拆分和执行命令)
循环的
可能会给
变量带来问题;被否决在宏中使用:%%参数
(外循环)和%%{
%%?
(内循环)%%@
- 不考虑管道或重定向,如
doskey a=dir^>somefile
- 不允许宏中的
串联命令(但允许^&
内部doskey
串联)$T
- 不允许启动批处理
或.bat
脚本(需要.cmd
,而不是调用%xitem%
过程(cca第50行)中的:doItem
%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的简单包装器,因此编写一个调用和的小程序可能更简单。