Last active
February 19, 2024 15:49
-
-
Save benjamine/5992592 to your computer and use it in GitHub Desktop.
Aliases for windows command line
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
:: | |
:: 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 |
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
When I run
alias set 5 echo hello, world
, the output is:The
set
should not appear in the output. Also, the created5.cmd
does not work, since it looks like this: