-
-
Save benjamine/5992592 to your computer and use it in GitHub Desktop.
:: | |
:: Aliases for windows command line | |
:: | |
:: Installation: | |
:: | |
:: - create a folder for your aliases (eg: ```c:\cmd-aliases```) | |
:: - add that folder to your PATH variable | |
:: - save this script as setalias.cmd on that folder | |
:: - run "alias" to see usage | |
:: | |
:: author: Benjamin Eidelman <[email protected]> | |
:: | |
@echo off | |
set operation=%1 | |
set aliasname=%2 | |
set aliasfile=%~dp0%2.cmd | |
IF "%~1"=="" GOTO help | |
IF /I "%~1"=="list" GOTO listaliases | |
IF /I "%~1"=="set" GOTO setalias | |
IF /I "%~1"=="get" GOTO getalias | |
IF /I "%~1"=="delete" GOTO deletealias | |
IF /I "%~1"=="here" GOTO setaliashere | |
:help | |
echo. Usage: | |
echo. alias list - list available cmd aliases | |
echo. alias set [name] [command line] - set an alias | |
echo. alias get [name] - show an alias | |
echo. alias delete [name] - delete alias | |
echo. alias here [name] [command line] - create alias cmd on cwd | |
exit /B | |
:listaliases | |
dir /B %~dp0*.cmd | |
exit /B | |
:setaliashere | |
set aliasfile=%2.cmd | |
:setalias | |
if "%aliasname%"=="alias" ( | |
echo ERROR: cannot set this alias | |
exit /B 1 | |
) | |
echo %1 %2> "%aliasfile%" | |
for %%a in ("%aliasfile%") do set /a length=%%~za | |
set /a length=length-1 | |
set commandline=%* | |
setlocal enableDelayedExpansion | |
call set commandline=!commandline:~%length%! | |
set commandline=%commandline% %%* | |
echo %commandline%> "%aliasfile%" | |
echo INFO: alias "%aliasname%" set | |
exit /B | |
:getalias | |
if exist %aliasfile% ( | |
type %aliasfile% | |
) ELSE ( | |
echo ERROR: alias not found | |
exit /B 1 | |
) | |
exit /B | |
:deletealias | |
if /I "%aliasname%"=="alias" ( | |
echo ERROR: cannot delete this alias | |
exit /B 1 | |
) | |
if exist %aliasfile% ( | |
del %aliasfile% | |
echo INFO: alias deleted | |
) ELSE ( | |
echo INFO: alias not found | |
) | |
exit /B |
This program does not work when installed into a directory whose name contains spaces. I installed it into %USERPROFILE%\Program Files\bin
, and alias list
always says Cannot find given path.
When I run alias set 5 echo hello, world
, the output is:
set
INFO: alias "5" set
The set
should not appear in the output. Also, the created 5.cmd
does not work, since it looks like this:
d %*
The installation instructions should say save this script as alias.cmd
instead of setalias.cmd
.
Aliases defined with this tool cannot be used in other .cmd
scripts, since execution stops after the first one. For example:
five.cmd:
@echo off
one
one
one
one
one
one.cmd:
@echo off
echo one
When running five.cmd
, I expect it to output 5 times a line one
. Instead, only the first line is output.
Could someone add commands and explanations to it? I am a Linux guy, know a lot about
ruby too but windows is black magic to me. :(
this is just chef's kiss amazing
@echo off
REM Define the directory for storing aliases
set "ALIASES_DIR=%APPDATA%\aliases.d"
REM Create the directory if it doesn't exist
if not exist "%ALIASES_DIR%\" mkdir "%ALIASES_DIR%\"
REM Check if there are no existing alias batch files, and create some defaults
if not exist "%ALIASES_DIR%\*.bat" (
>"%ALIASES_DIR%\ll.bat" echo::: unix: alias ls='ls -F --color=auto --show-control-chars'
>>"%ALIASES_DIR%\ll.bat" echo:@for /f "tokens=*" %%%%i in ^('dir %%1^^^|findstr /b [0-9]'^) do @^(if "%%%%~xi"=="" ^(echo:�^^^[94m%%%%i\�^^^[0m^) else ^(echo:%%%%i^)^)
>"%ALIASES_DIR%\~.bat" echo:@pushd "%%USERPROFILE%%"
>"%ALIASES_DIR%\e..bat" echo:@explorer .
>"%ALIASES_DIR%\cp.bat" echo:@copy %%*
>"%ALIASES_DIR%\ls.bat" echo:@dir %%*
>"%ALIASES_DIR%\mv.bat" echo:@move %%*
>"%ALIASES_DIR%\ni.bat" echo:@if not "%%~1"=="" echo/^>"%%~f1"
>"%ALIASES_DIR%\rm.bat" echo:@del %%*
)
REM Add the aliases directory to current session PATH
call set "PATH=%ALIASES_DIR%;%%PATH:%ALIASES_DIR%;=%%"
REM Enable delayed expansion for variable manipulation
setlocal enabledelayedexpansion
REM Check command line arguments
if "%~1"=="" (
echo Try '%~nx0 /?' for more information.
echo. & call :show
exit /b 0
) else if "%~1"=="/?" (
goto :help
) else if /i "%~1"=="/d" (
if "%~2"=="" (
echo Alias name is required.
exit /b 1
)
set REMOVE_ALIAS=1
shift /1
) else if "%~2"=="" (
call :show "%~1.bat"
exit /b 0
) else (
call :char "%~1" || (
echo ERROR: The alias name invalid character "%~1".
exit /b 1
)
if /i "%~nx1"=="%~nx0" (
echo ERROR: The alias name cannot be the same as this script "%~nx0".
exit /b 1
)
)
REM Set alias name, value, and file path
set "ALIAS_NAME=%~1"
set "ALIAS_VALUE=%~2"
set "ALIASES_FILE=%ALIASES_DIR%\%ALIAS_NAME%.bat"
REM Check for spaces in alias name
if not ["%ALIAS_NAME: =%"] == ["%ALIAS_NAME%"] (
echo ERROR: The alias name cannot contains spaces.
exit /b 1
)
REM Execute the alias creation or removal
call :test "%ALIAS_NAME%" "%ALIASES_FILE%"
if %errorlevel% equ 0 exit /b 1
REM Remove the alias if option '/d' is used.
if defined REMOVE_ALIAS (
if exist "%ALIASES_FILE%" del /q "%ALIASES_FILE%"
exit /b 0
)
REM Check if alias value is provided
if not defined ALIAS_VALUE (
echo ERROR: Alias value is required.
exit /b 1
)
REM Create and update the aliases file.
echo::%ALIAS_NAME%>"%ALIASES_FILE%"
echo:@%ALIAS_VALUE%>>"%ALIASES_FILE%"
echo:Alias "%ALIAS_NAME%" successfully created.
exit /b 0
@REM :: Alternatives for creating aliases
@REM echo::%ALIAS_NAME%=%ALIAS_VALUE%>"%ALIASES_FILE%"
@REM set /p x=@%ALIAS_VALUE%< nul >>"%ALIASES_FILE%"
:test -- Execute alias validation
if "%~1"=="" exit /b 1
setlocal enabledelayedexpansion
set "name=%~1"
set "file=%~f2"
set "names=!PATHEXT:.=%name%.!;%name%.PS1"
for %%I in (%names%) do if not "%%~$PATH:I"=="" (
if /i "%%~$PATH:I"=="%file%" exit /b 1
echo WARNING: The alias same as "%%~nx$PATH:I".
exit /b 0
)
exit /b 1
:char -- Validate characters in alias name
if "%~1"=="" exit /b 1
if "%~1"=="<" exit /b 1
if "%~1"==">" exit /b 1
if "%~1"=="/" exit /b 1
if "%~1"=="\" exit /b 1
if "%~1"=="|" exit /b 1
if "%~1"==":" exit /b 1
if "%~1"=="?" exit /b 1
if "%~1"=="*" exit /b 1
exit /b 0
:show -- Display all defined aliases
setlocal
for %%A in ("%ALIASES_DIR%\*%~n1.bat") do (
for /f "eol=: tokens=* delims=@ " %%B in ('type "%%~fA"') do (
if not defined %%~nA (set "%%~nA=1" & echo:%%~nA=%%B)
)
)
exit /b 0
:help -- Display script usage information
echo. Usage: %~nx0 [/d] [name[=value] ... ]
echo. %~nx0 - a recalls Windows commands.
echo.
echo. name The name of the alias
echo. value The value of the alias
echo. /d ^<name^> Remove the alias from the list
echo.
echo. The NAME and/or VALUE must be enclosed in double quotes.
echo. For escaping the env-var sign, use '^^%%' instead of '%%%%'.
echo.
echo. Invalid characters in alias NAME : ^< ^> ^\ ^/ ^| ^? ^: ^*
echo. Escaped characters in this script: ^^^| ^^^& ^^^< ^^^> ^^^( ^^^)
echo.
echo. Examples:
echo. %~nx0 d="dir "^^%%ProgramFiles^^^^(x86^^^^)^^%%" %%*"
echo. %~nx0 log="^(foo.exe ^&^& bar.bat)^ ^> log.txt"
echo. %~nx0 /d log
goto :EOF
Thank you for snippet. :-) I use it with only one change on line 60 to
echo @echo off> "%aliasfile%"
echo %commandline%>> "%aliasfile%"
because this suppress inessential echo from alias :-)