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?

Antworten:


29

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

cmd.exe /C start <file>

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: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 "${@//&/^&}"

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

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

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: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

Das hat bei mir viel besser funktioniert:

explorer.exe `wslpath -aw <path>`

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.


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.


Hervorragende Lösung!
Stabledog

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.