-
-
Save vtenfys/004da18b89fff0534edd9b6f6082bcaf to your computer and use it in GitHub Desktop.
| #!/bin/bash | |
| command=$1 | |
| args=${@:2} | |
| winrun_pid=$$ | |
| pidfile="/tmp/winrun-pid-$(date +%s)" | |
| if [[ $args != '' ]]; then | |
| argumentlist="-ArgumentList \"$args\"" | |
| fi | |
| powershell_command=" | |
| \$process = Start-Process -NoNewWindow -PassThru \"$command\" $argumentlist | |
| if (\$process) { | |
| echo \$process.id | |
| Wait-Process \$process.id | |
| exit \$process.ExitCode | |
| } else { | |
| # startup failure | |
| echo -1 | |
| }" | |
| powershell.exe -Command "$powershell_command" > $pidfile & | |
| linux_pid=$! | |
| # Use tail to wait for the file to be populated | |
| while read -r line; do | |
| windows_pid=$(echo $line | tr -d '\r\n') | |
| break # we only need the first line | |
| done < <(tail -f $pidfile) | |
| rm $pidfile | |
| if [[ $windows_pid == -1 ]]; then | |
| exit 127 | |
| fi | |
| term() { | |
| taskkill.exe -pid $windows_pid > /dev/null | |
| } | |
| trap term SIGTERM | |
| trap term SIGINT | |
| while ps -p $linux_pid > /dev/null; do | |
| wait $linux_pid | |
| done | |
| exit $? |
This doesn't handle spaces correctly. For example:
echo hi > "multispace .txt"
winrun notepad "multispace .txt"Will result in Notepad complaining about not be able to find multispace .txt (note the whitespace difference).
I was able to get it to work by changing args=${@:2} to args=$(printf '"`"%s`"",' "${@:2}") ; args=${args%,} and argumentlist="-ArgumentList \"$args\"" to argumentlist="-ArgumentList $args".
This is not showing the log in wsl? e.g. i started a java process with this script and i don't see the logs.
This is very cool though I can't seem to have it work on ssh: had to change 'powershell.exe' to the full path from wsl to the powershell and same thing for taskkill.exe, though this last one doesn't seem to kill the process.
Update: I changed both paths correctly (I think the path to taskkill was wrong), /mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe and /mnt/c/Windows/System32/taskkill.exe, and now I can terminate the task with CTRL+C. Letting a program run in the background and trying to terminate with "kill -9 pid" doesn't work though.
Letting a program run in the background and trying to terminate with "kill -9 pid" doesn't work though.
This is to be expected as SIGKILL is not something that can be intercepted and immediately kills a process without cleanup
Installation:
/usr/bin/winrunsudo chmod +x /usr/bin/winrunUsage:
Example: