Come posso "aprire" un file da WSL con l'applicazione predefinita?


12

La maggior parte dei sistemi forniscono un opencomando (alternativamente noto come start, cygstart, xdg-openetc.) che si apre un file nella domanda ambiente desktop "default", qualunque essa sia.

Ad esempio, da Powershell quando entro:

PS> start form.pdf

Il documento si apre in Edge.

Bash-on-Ubuntu-on-Windows può farlo?

Risposte:


29

Da quando l'interoperabilità di Windows Linux ha iniziato a funzionare, ora puoi chiamare:

cmd.exe /C start <file>

Lavora per me per percorsi relativi, per percorsi assoluti ho scritto una sceneggiatura per sostituire / mnt / c con c: ... | sed 's/\/mnt\/\(.\)/\1:/1' | xargs cmd.exe /C start
Michael

1
Bella soluzione. Possiamo anche accedere ai file sul filesystem Linux usando le informazioni di superuser.com/q/1110974/66714 . Qualcosa del tipo cmd.exe /c start "%localappdata%/lxss/$(readlink -f $some_relative_path)"Ora stiamo cucinando con il fuoco!
Cheezmeister,

2

Questo dipende se si desidera A) avviare un programma Linux all'interno di WSL o B) si desidera avviare un programma Windows da un prompt della shell bash.

Se B) allora sì se installi cygwin / bash. Ad esempio, installa git per Windows e hai un sistema in esecuzione su Windows con bash. Quindi puoi semplicemente avviare start, in realtà è incluso come uno script:

$ cat /usr/bin/start
#!/usr/bin/env bash
# Copyright (C) 2014, Alexey Pavlov
#   mailto:alexpux@gmail.com
# This file is part of Minimal SYStem version 2.
#   https://sourceforge.net/p/msys2/wiki/MSYS2%20installation/
# File: start

cmd //c start "${@//&/^&}"

Se A), diventa molto più difficile, specialmente se si desidera avviare un programma Linux per visualizzare un .pdf in una finestra della GUI. Nota che Windows sa associare un'applicazione predefinita per aprire un file pdf ma WSL non ha le informazioni. Quindi, anche se hai un desktop in esecuzione su WSL, dovrai aprire un'app della GUI di Linux per aprire il pdf.

Nota per chiarire, all'interno di WSL si eseguono eseguibili Linux non eseguibili Windows:

(WSL):~# file /bin/gzip
/bin/gzip: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=68cc3c090405cf6d40e97d2ff58085fd26940602, stripped

(WSL):~# file /mnt/c/Program\ Files/Internet\ Explorer/iexplore.exe
 /mnt/c/Program Files/Internet Explorer/iexplore.exe: PE32+ executable (GUI) x86-64, for MS Windows

(WSL):~# /mnt/c/Program\ Files/Internet\ Explorer/iexplore.exe
 bash: /mnt/c/Program Files/Internet Explorer/iexplore.exe: cannot execute binary file: Exec format error

2

Come notato da Martijn, questo è il modo corretto di eseguire / aprire un'applicazione / file Windows.

cmd.exe /C start <file>

Ho trovato molto utile lavorare in uno script bash che conservo in una cartella che si trova nel mio percorso di sistema. Lo chiamo starte faccio chmod 0744al file per renderlo eseguibile. Ciò $*significa che passerà a tutti gli argomenti della riga di comando forniti allo script cmd.exe.

#!/bin/bash
cmd.exe /c start "Launching from BASH" "$*"

Con questo comando nel mio percorso di sistema posso comandi come questo in Linux che si aprono in Windows:

  1. start FileXYZ.pdf // Apre il PDF nel visualizzatore PDF assegnato predefinito in Windows
  2. start explorer . // Apre la cartella WSL corrente in Esplora risorse
  3. start MyApp.exe // Avvia l'applicazione Windows

1
L'unico problema è che questa soluzione non funziona con i file che hanno spazi bianchi nel loro nome.
0x7d7b,

@ h3nrik Ottimo punto. Immagino di non aprire molti file con spazi in Linux. Ho aggiornato lo script per gestirlo.
pseudosavant,

Su Linux i nomi dei file con spazi bianchi sono generalmente gestiti con barre rovesciate come a\ whitespace.pdf. Iniziare la tua sceneggiatura come start.sh a\ a.pdf b\ b.pdfnon funzionerebbe.
0x7d7b,

explorer.exe .apre il percorso corrente in Esplora risorse
johnny

1

eopen può aprire vari file (, directory e URI) all'interno di WSL.

https://github.com/ko1nksm/eopen-ecd

Esempi

# Open directory with (latest used) Explorer
eopen ~/.config/

# Open directory with new instance of Explorer
eopen -n ~/.config/

# Opens with Windows default application
eopen image.png

# Opens with Windows text editor
eopen -e ~/.bashrc

# Use sudo to edit the unowned file
eopen -e --sudo /etc/hosts

# Opens with Windows default browser
eopen http://google.com

# Open files and directories under Windows
eopen C:/Windows

# Open files and directories under Network shared folder
eopen //server/shared

# Others
eopen mailto:user@example.com   # Mail protocol
eopen calculator:               # Application
eopen shell:Personal            # Shell commands
eopen :MyComputerFolder         # Shorthand for shell:
eopen shell:::{2559a1f8-21d7-11d4-bdaf-00c04f60b9f0} # CLSID
eopen :                         # Current Explorer location
eopen :/workspace               # Relative path from current Explorer location

1

Questo ha funzionato molto meglio per me:

explorer.exe `wslpath -aw <path>`

1

È possibile chiamare il Start-Processcomando PowerShell da WSL:

powershell.exe -Command Start-Process file

Per farlo funzionare anche con percorsi assoluti, è possibile utilizzare il wslpath -wacomando per tradurre il percorso in un percorso di Windows.

powershell.exe -Command Start-Process `wslpath -wa /absolute/path/to/file`

Questo ha un vantaggio rispetto alla cmd.exesoluzione: per condivisioni di rete montate, wslpathproduce un percorso UNC come \\server\share\. Questi percorsi UNC non possono essere gestiti da cmd.exe.


1

Ho scoperto che explorer.exe funziona abbastanza bene nel trovare il percorso risolto corretto (anche delle directory di rete montate) e nel lanciare lo strumento predefinito. L'unico problema è che non è possibile avere percorsi nel nome file, quindi è necessario creare una piccola funzione / script di supporto per avviare correttamente Explorer, ad esempio:

win() { 
    # get full unsymlinked filename 
    file=`readlink -e $1` 
    dir=$(dirname "$file") 
    base=$(basename "$file") 
    # open item using default windows application 
    (cd "$dir"; explorer.exe "$base")
}

Aggiornamento: Ngo ha sottolineato un altro script, wslpathche esegue la conversione del percorso, in modo da poter chiamare explorer.exe direttamente sul percorso (dopo la conversione). Quindi la funzione sopra diventa banale e può essere facilmente fatta un alias.


Ottima soluzione!
Stabledog

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.