So erhalten Sie einen Parameter in einer Batchdatei

2124
sancho.s

Ich habe eine Frage gestellt: Verwenden Sie eine Umgebungsvariable, um auf ein "Open With" -Programm zu zeigen, das eine fantastische Antwort erhalten hat. Um das Kontextmenü Öffnen mit hinzuzufügen myapp.exe, %MYAPPSDIR%muss ich in die CLI schreiben

reg add "HKCR\Applications\myapp.exe\shell\open\command" /ve /t REG_EXPAND_SZ /d "\"^%MYAPPSDIR^%\myapp\myapp.exe\" \"^%1\"" /f 

Jetzt möchte ich eine .batDatei haben, die einen Parameter erhält, der diesen Satz ausführt. Zum Beispiel regadd.bat myapp.exewürde das ausführen . Was soll die Zeile in der .batDatei sein?

Die Punkte sind:

  1. Wie wird der Parameter eingefügt?
  2. Wie wird der Parameter mit .exeremove (für den Verzeichnisteil) eingefügt ?
  3. Wie man das Erweitern vermeidet, %1das geht in die Registry (ich weiß nicht, wie man es richtig entgeht).

Ich habe viele Ressourcen gefunden (z. B. "%" in einer Batchdatei verwenden ), aber ich möchte nicht mit der Registrierung basteln. Mein Einsatz für 1 und 3 ist (muss noch 2 klappen):

reg add "HKCR\Applications\%1\shell\open\command" /ve /t REG_EXPAND_SZ /d "\"^%MYAPPSDIR^%\(%1 with .exe removed)\%1\" \"^%1\"" /f 

Ich könnte auch festlegen .bat, dass als ausgeführt werden regadd.bat myapp. In diesem Fall wäre die Zeile

reg add "HKCR\Applications\%1.exe\shell\open\command" /ve /t REG_EXPAND_SZ /d "\"^%MYAPPSDIR^%\%1\%1.exe\" \"^%1\"" /f 

Ich interessiere mich für beide Möglichkeiten.

0

3 Antworten auf die Frage

1
JosefZ

Der Batch-Interpreter analysiert die Befehlszeile etwas anders als der reine Befehlszeilen-Parser (lesen Sie die Antworten auf eine andere Frage bei StackOverflow ):

  • Befehlszeile : Um eine Erweiterung %MYAPPSDIR%durch Befehlszeileninterpreter zu vermeiden, sollte das %Prozentzeichen durch das Standard-CLI-Escape-Zeichen ( ^Caret) ersetzt werden: ^%MYAPPSDIR^%oder ^%1;
  • .batSkript : zu vermeiden erweitern %MYAPPSDIR%oder %1durch Batch - Interpreter, der %sollte Prozentzeichen werden verdoppelt, wie folgt: %%MYAPPSDIR%%und %%1, respectively.

So unterscheiden Sie die Parameter Ihres Batch-Skripts:

set "par1=%~1" if "%par1%"=="" ( echo no parameter supplied goto :eof ) else ( set "par=%par1:.exe=%" ) if "%par%"=="%par1%" ( echo .exe not present ) else ( echo .exe present ) 

oder (vielleicht besser)

set "par1=%~1" if "%par1%"=="" ( echo no parameter supplied goto :eof ) else ( set "par=%par1:~-4%" ) if /I "%par%"==".exe" ( echo .exe present ) else ( echo .exe not present ) 

oder (vielleicht das beste)

set "par1=%~1" if "%par1%"=="" ( echo no parameter supplied goto :eof ) else ( set "par=%~x1" ) if /I "%par%"==".exe" ( echo .exe present ) else ( echo .exe not present ) 

Ressourcen (Erforderliche Lektüre):

Vielen Dank. Was ist mit Punkt 2? sancho.s vor 8 Jahren 0
@ sancho.s Verwendung von "% ~ n1" - erweitert "% 1" zu einem Dateinamen ohne Dateierweiterung. Weitere Informationen zu dieser und anderen Parametererweiterungen finden Sie unter [Befehlszeilenargumente (Parameter)] (http://ss64.com/nt/syntax-args.html). DavidPostill vor 8 Jahren 1
Sehr gründliche Antwort! Ich werde die Optionen überprüfen und Feedback geben. sancho.s vor 8 Jahren 0
Feedback Nr. 1: Ich weiß nicht, warum Sie 3 Stufen von "Würdigkeit" für Ihre Lösungen festgelegt haben (vielleicht könnten Sie die Gründe dafür angeben). Für den beabsichtigten Einsatz, wie er im OP veröffentlicht wurde, fand ich jedenfalls den ersten hilfreich, da er den Namen der App ohne .exe für die spätere Verwendung extrahieren kann. Die folgenden zwei Alternativen erkennen nur, wenn die EXE-Datei vorhanden ist, sie isolieren jedoch nicht den App-Namen. sancho.s vor 8 Jahren 0
@DavidPostill - Ihr Kommentar ist eine Antwort wert. sancho.s vor 8 Jahren 0
Ich habe unten eine zusammenfassende Antwort hinzugefügt, die die entsprechende Codezeile http://superuser.com/a/947474/245595 enthält sancho.s vor 8 Jahren 0
1
DavidPostill

Wie verwende ich den Parameter mit der entfernten .exe-Datei (für den Teil des Verzeichnisses)?

Sie können verwenden %~n1.

Dies erweitert sich %1zu einem Dateinamen ohne die Dateierweiterung.


Parametererweiterungen

Wenn ein Argument zur Angabe eines Dateinamens verwendet wird, kann die folgende erweiterte Syntax angewendet werden:

Wir verwenden die Variable% 1 (dies funktioniert aber für jeden Parameter)

  • %~f1 - Erweitern Sie% 1 zu einem vollständig qualifizierten Pfadnamen - C: \ utils \ MyFile.txt

  • %~d1 - Erweitern Sie% 1 nur auf einen Laufwerksbuchstaben. - C:

  • %~p1 - Erweitern Sie% 1 nur auf einen Pfad, z. B. \ utils \. Dies schließt ein nachfolgendes \ ein, das von einigen Befehlen als Escape-Zeichen interpretiert wird.

  • %~n1 - Erweitern Sie% 1 zu einem Dateinamen ohne Dateierweiterung C: \ utils \ MyFile oder, wenn nur ein Pfad vorhanden ist (ohne nachgestellten Backslash) - der letzte Ordner in diesem Pfad.

  • %~x1 - Erweitern Sie% 1 nur auf eine Dateierweiterung - .txt

  • %~s1 - Ändern Sie die Bedeutung von f, n, s und x, um auf den Kurznamen 8.3 zu verweisen (falls vorhanden).

  • %~1 - Erweitern Sie% 1, indem Sie alle umgebenden Anführungszeichen entfernen (").

  • %~a1 - Zeigen Sie die Dateiattribute von% 1 an

  • %~t1 - Datum / Uhrzeit von% 1 anzeigen

  • %~z1 - Zeigen Sie die Dateigröße von% 1 an

  • %~$PATH:1 - Durchsuchen Sie die Umgebungsvariable PATH und erweitern Sie% 1 um den vollständig qualifizierten Namen der ersten gefundenen Übereinstimmung.

Die Modifikatoren oben können kombiniert werden:

  • %~dp1 - Erweitern Sie% 1 nur um einen Laufwerkbuchstaben und -pfad

  • %~sp1 - Erweitern Sie% 1 auf einen Pfad, der auf 8,3 Zeichen verkürzt ist

  • %~nx2 - Erweitern Sie% 2 nur um einen Dateinamen und eine Erweiterung

Quelle Parameter


Lesen Sie weiter

  • Ein AZ-Index der Windows-CMD-Befehlszeile - Eine hervorragende Referenz für alles, was mit Windows-Cmd-Zeilen in Verbindung steht.
  • parameters - Ein Befehlszeilenargument (oder Parameter) ist ein beliebiger Wert, der an ein Batch-Skript übergeben wird.
0
sancho.s

Ich werde die spezifische Frage beantworten: Was soll die Zeile in der .batDatei sein? , die in 3 notwendige Schritte aufgeteilt wurde.

JosefZ beantwortet separat die drei Punkte auf die Antwort führt. DavidPostill gab eine weitere Option für Punkt 2 an.

Der resultierende Code wäre

set "app1=%~1" if "%app1%"=="" ( echo No parameter supplied. This should be run as echo regadd.bat myapp.exe echo or echo regadd.bat myapp goto :eof ) else ( REM set "app=%app1:.exe=%" set "app=%~n1" ) if "%app%"=="%app1%" ( REM echo .exe not present ) else ( REM echo .exe present ) echo App is %app% reg add "HKCR\Applications\%app%.exe\shell\open\command" /ve /t REG_EXPAND_SZ /d "\"%%MYAPPSDIR%%\%app%\%app%.exe\" \"%%1\"" /f