Bat Datei die sich selbst in den Autostart Ordner kopiert?

2 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Eigenartiges Vorhaben, Du wirst aber vermutlich schon wissen warum Du willst, dass die Datei sich selbst kopiert (und nicht Du das aktiv tust)?

Den Pfad zum Autostart Ordner kennnst Du, sonst hättest Du gefragt "wo finde ich den ..."? Oder ist das dann die nächste Frage?

Die Variable %0 einer Batchdatei enthält den Namen der aufgerufenen Batchdatei, die Variablen %1, %2, ... die Übergabeparameter.

  • test.bat aaa --> in %0 steht test.bat, in %1 steht aaa

Problem: In %0 steht exakt das, was Du als Parameter 0 angegeben hast.

  • test aaa --> in %0 steht test, in %1 steht aaa

Für das Kopieren benötigst den vollständigen Namen, den bekommst Du über

  • %~f0

Folgende Anweisung in der Batchdatei kopiert diese als zum Autostart Ordner:

  • copy %~f0 C:\Users\XXXXXX\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

Statt XXXXXX musst Du natürlich den richtigen Usernamen einsetzen!


PWolff  27.01.2020, 00:06

Es ist zwar unwahrscheinlich, aber nicht unmöglich, dass das Home-Verzeichnis nicht auf derselben Partition liegt wie das System. %userprofile% statt C:\Users\<username> funktioniert auch dann.

(Und Anführungszeichen um die Pfade und Dateinamen setzen)

1
airfun  27.01.2020, 00:08
@PWolff

Kein Widerspruch. Aber das fällt für mich in die Kategorie "Den Pfad zum Autostart Ordner kennnst Du, sonst hättest Du gefragt ...".

--> Da die Frage ja nicht gestellt wurde, kennt er die Antwort (oder fraget noch)! ;-)

1
copy /y "%0" "%USERPROFILE%\..."

(Autostartordner bitte selbst raussuchen)

Woher ich das weiß:Berufserfahrung – Software-Entwickler

airfun  27.01.2020, 00:02

Wenn er zum Ausführen seiner "test.bat" nur "test" eintippt (das .bat weglässt), wird das Batchprogramm korrekt gestartet. Das kopieren wird jedoch in die Hose gehen, weil dann in "%0" nur "test" steht (die Datei "test" wird der copy Befehl nicht finden)!

0
Erzesel  27.01.2020, 08:18
@airfun
Das kopieren wird jedoch in die Hose gehen, weil dann in "%0" nur "test" steht 

Quatsch... %0 bzw. "%~0" enthält immer den vollen Pfad, egal wie die Batch aufgerufen wurde...

Wer sicher gehen möchte kann ja %~f0 oder %~s0 (8.3pfad ---immer ohne Sonderzeichen) verwenden.

0
Erzesel  27.01.2020, 08:11
copy /y "%~0" "%USERPROFILE%\..."

Die Tilde ist wichtig. Sie entfernt mögliche Quotes um den Dateinamen.

...sonst könntest du Quotes um Quotes haben. ""C:\pfad\meine Batch.cmd"" ...das geht schief...

0
airfun  27.01.2020, 09:12
@Erzesel

Vielleicht ist das Verhalten ja unterschiedlich (je nach Windows-Version, ...)? Ich hab's ausprobiert (Windows 7):

test.bat

  • @echo off
  • echo I am %0

C:\temp\test.bat

--> I am test.bat

C:\temp\test

--> I am test

1
Erzesel  27.01.2020, 13:29
@airfun

Echt...ich muss zugeben ich lag falsch😥 (wann ruft man schon mal eine Batch auf, welche nicht im aktuellen Verzeichnis ist) ---im allgemeinen wird eine Batch einfach angeklickt und oder als Droptarget für andere Dateien benutzt , wobei immer automatisch der volle Pfad übergeben wird.

Allerdings ist es eher unwahrscheinlich, das eine Batch ohne Pfadangabe aus einem anderen Verzeichnis heraus aufgerufen wird.

C:\Users\Erzesel Secure\Desktop>%temp%\test
iam C:\Users\ERZESE~1\AppData\Local\Temp\test
C:\Users\Erzesel Secure\Desktop>%temp%\test.bat
iam C:\Users\ERZESE~1\AppData\Local\Temp\test.bat
C:\Users\Erzesel Secure\Desktop>cd "%temp%"


C:\Users\ERZESE~1\AppData\Local\Temp>test
iam test
C:\Users\ERZESE~1\AppData\Local\Temp>test.bat
iam test.bat

Bei der Verwendung als Droptarget, bei welchem auch Dateien aus anderen Laufwerken und Verzeichnissen auf die Batch gezogen werden , war es schon immer zweckmäßig das Batchverzeichnis als Arbeitsverzeichnis festzulegen.

cd /d "%~dp0"

...da auch andere Dateien im Batchverzeichnis involviert sein können und cmd automatisch zum Pfad der gedropten Dateien wechselt.

oder man verwendet brav "%~f0" oder "%~dpnx0"

Zugegeben... ich hatte in 30 Jahren nie eine Situation, in welcher %0 nichtmehr im Relativen aktuellen Pfad verfügbar war... (sonst wäre mir die skurrile Situation sicher aufgefallen)

0