Wie kann ich eine Datei aus der WSL mit der Standardanwendung "öffnen"?

12

Die meisten Systeme bieten einen openBefehl (abwechselnd bekannt als start, cygstart, xdg-openetc.) , die eine Datei in der „default“ Anwendung Desktop - Umgebung öffnet, was auch immer das ist.

Zum Beispiel von Powershell, wenn ich eintrete:

PS> start form.pdf

Das Dokument wird in Edge geöffnet.

Kann Bash-on-Ubuntu-on-Windows dies tun?

Cheezmeister
quelle

Antworten:

29

Seit die Windows Linux-Interop funktioniert, können Sie Folgendes aufrufen:

cmd.exe /C start <file>
Martijn Laarman
quelle
Funktioniert für mich für relative Pfade, für absolute Pfade habe ich ein Skript geschrieben, um / mnt / c durch c zu ersetzen: ... | sed 's/\/mnt\/\(.\)/\1:/1' | xargs cmd.exe /C start
Michael
1
Schöne Lösung. Wir können auch auf Dateien im Linux-Dateisystem zugreifen, indem wir Informationen von superuser.com/q/1110974/66714 verwenden . So etwas wie cmd.exe /c start "%localappdata%/lxss/$(readlink -f $some_relative_path)"Jetzt kochen wir mit Feuer!
Cheezmeister
2

Dies hängt davon ab, ob Sie A) ein Linux-Programm innerhalb der WSL starten oder B) ein Windows-Programm über eine Bash-Shell-Eingabeaufforderung starten möchten.

Wenn B) dann ja, wenn Sie cygwin / bash installieren. Wenn Sie beispielsweise git für Windows installieren, wird unter Windows ein System mit bash ausgeführt. Dann können Sie einfach start ausführen, tatsächlich ist es als Skript enthalten:

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

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

Wenn A), wird es viel schwieriger, insbesondere wenn Sie ein Linux-Programm starten möchten, um eine PDF-Datei in einem GUI-Fenster anzuzeigen. Beachten Sie, dass Windows eine Standardanwendung zum Öffnen einer PDF-Datei zuordnen kann, die WSL jedoch nicht über die Informationen verfügt. Selbst wenn Sie einen Desktop unter WSL zum Laufen bringen würden, müssten Sie eine Linux-GUI-App zuordnen, um das PDF zu öffnen.

Hinweis zur Verdeutlichung: Innerhalb der WSL führen Sie ausführbare Linux-Dateien und keine ausführbaren Windows-Dateien aus:

(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
Gilbert
quelle
2

Wie Martijn feststellte, ist dies der richtige Weg, um eine Windows-Anwendung / -Datei auszuführen / zu öffnen.

cmd.exe /C start <file>

Ich fand es sehr nützlich, dies in ein Bash-Skript zu integrieren, das ich in einem Ordner in meinem Systempfad aufbewahre. Ich benenne es startund mache chmod 0744mit der Datei, um sie ausführbar zu machen. Dies $*bedeutet, dass alle Befehlszeilenargumente, die Sie an das Skript übergeben haben, an übergeben werden cmd.exe.

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

Mit diesem Befehl in meinem Systempfad kann ich unter Linux folgende Befehle ausführen, die unter Windows geöffnet werden:

  1. start FileXYZ.pdf // Öffnet die PDF-Datei im standardmäßig zugewiesenen PDF-Viewer unter Windows
  2. start explorer . // Öffnet den aktuellen WSL-Ordner im Windows Explorer
  3. start MyApp.exe // Startet die Windows-Anwendung
pseudosavant
quelle
1
Das einzige Problem ist, dass diese Lösung nicht mit Dateien funktioniert, deren Name Leerzeichen enthält.
0x7d7b
@ h3nrik Toller Punkt. Ich glaube, ich öffne unter Linux nicht viele Dateien mit Leerzeichen. Ich habe das Skript aktualisiert, um damit umzugehen.
Pseudosavant
Unter Linux werden Dateinamen mit Leerzeichen normalerweise mit Backslashes wie behandelt a\ whitespace.pdf. Das Starten Ihres Skripts start.sh a\ a.pdf b\ b.pdfwürde nicht funktionieren.
0x7d7b
explorer.exe .öffnet den aktuellen Pfad im Windows Explorer
Johnny
1

eopen kann verschiedene Dateien (, Verzeichnisse und URI) innerhalb der WSL öffnen.

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

Beispiele

# 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:[email protected]   # 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
Koichi Nakashima
quelle
1

Das hat bei mir viel besser funktioniert:

explorer.exe `wslpath -aw <path>`
Ngo
quelle
1

Sie können den Start-ProcessBefehl von Powershell innerhalb der WSL aufrufen :

powershell.exe -Command Start-Process file

Damit dies auch mit absoluten Pfaden funktioniert, können Sie wslpath -waden Pfad mit dem Befehl in einen Windows-Pfad übersetzen.

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

Dies hat einen Vorteil gegenüber der cmd.exeLösung: wslpathErzeugt für gemountete Netzwerkfreigaben einen UNC-Pfad wie \\server\share\. Diese UNC-Pfade können nicht von verarbeitet werden cmd.exe.

Geronimo
quelle
1

Ich habe festgestellt, dass explorer.exe ziemlich gut funktioniert, um den richtigen aufgelösten Pfad (auch für gemountete Netzwerkverzeichnisse) zu finden und das Standardtool zu starten. Das einzige Problem ist, dass der Dateiname keine Pfade enthalten kann. Sie müssen daher eine kleine Hilfsfunktion / ein Skript erstellen, um den Explorer korrekt zu starten, z.

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")
}

Update: Ngo hat auf ein anderes Skript hingewiesen wslpath, das die Pfadkonvertierung durchführt, sodass Sie explorer.exe direkt auf dem Pfad aufrufen können (nach der Konvertierung). Dann wird die obige Funktion trivial und kann leicht zu einem Alias ​​gemacht werden.

matt
quelle
Hervorragende Lösung!
Stabledog
0

Versuchen Sie es mit wsl-open. Es öffnet Dateien mit ihrer Standard-Windows-Anwendung und kann hier heruntergeladen werden: https://github.com/4U6U57/wsl-open .

marv
quelle