blacksun
Goto Top

Per Batch nach bestimmten Dateien suchen und Dateiname in Variable schreiben

Hallo,

ich habe einen Ordner
c:\test
Darin liegen verschiedene Dateien.

In diesem Ordner soll eine Batch-Datei suchen.bat erstellt werden

Wenn diese ausgeführt wird, dann soll der Ordner, in dem die Datei suchen.bat sich befindet, nach Dateien *start.bat durchsucht werden.
Es soll nur der aktuelle Ordner durchsucht werden, keine Unterordner.
Der gefundene Dateiname soll in einer Variablen landen die per Echo ausgegeben wird.

Der Ordner, in dem die Datei suchen.bat abgelegt ist bzw. in dem die Datei sucht, soll nicht fest hinterlegt sein, sondern immer den Ordner nutzen den, aus dem sie aufgerufen wird.

Wie setze ich das am besten um?
(nur Windows-Boardmittel, keine extra Tools)

Danke.

Content-Key: 416638

Url: https://administrator.de/contentid/416638

Printed on: April 19, 2024 at 06:04 o'clock

Mitglied: 138810
138810 Feb 12, 2019 at 20:15:27 (UTC)
Goto Top
@echo off
for %%a in ("%~dp0*start.bat") do echo %%a  
Member: blacksun
blacksun Feb 13, 2019 at 12:44:56 (UTC)
Goto Top
fast genau das was ich brauche.
in %%a steht nun der komplette Pfad + Dateiname + Dateiendung. Wie bekomme ich nur Dateinamen ohne Pfad und ohne Endung?
(die Dateinamen sind unterschiedlich lang, einzige Gemeinsamkeit ist dass sie mit *start aufhören und die Dateiendung bat haben)
Mitglied: 138810
138810 Feb 13, 2019 updated at 12:58:41 (UTC)
Goto Top
in %%a steht nun der komplette Pfad + Dateiname + Dateiendung. Wie bekomme ich nur Dateinamen ohne Pfad und ohne Endung?
Mit
%%~na

for /? auf der Konsole eingeben und lernen was die Dinge bedeuten.

        FOR /F " usebackq delims==" %i IN (`set`) DO @echo %i

Zusätzlich wurde die Ersetzung von Verweisen auf FOR-Variablen erweitert.
Sie können jetzt folgende Syntax verwenden:

    %~I         - Expandiert %I und entfernt alle umschließenden
                   Anführungszeichen (").
    %~fI        - Expandiert %I zu einem vollständigen Dateinamen.
    %~dI        - erstellt nur den Laufwerkbuchstaben von %I.
    %~pI        - erstellt nur den Pfad von %I.
    %~nI        - erstellt nur den Dateinamen von %I.
    %~xI        - erstellt nur die Dateierweiterung von %I.
    %~sI        - erstellter Pfad enthält nur kurze Dateinamen.
    %~aI        - erstellt die Dateiattribute von %I.
    %~tI        - erstellt Datum und Zeit von %I.
    %~zI        - erstellt die Dateigröße von %I.
    %~$PATH:I   - Durchsucht die in der PATH-Umgebungsvariablen
                   angegebenen Verzeichnisse und expandiert die erste
                   gefundene Datei %I zu dem vollständigen Dateinamen.
                   Wenn der Name der Umgebungsvariablen nicht definiert
                   ist oder diese Datei bei der Suche nicht gefunden wurde,
                   wird dieser Parameter zu einer leeren Zeichenfolge
                   expandiert.

Diese Parameter können auch miteinander kombiniert werden:

    %~dpI       - erstellt den Laufwerkbuchstaben und Pfad von %I.
    %~nxI       - erstellt den Dateinamen und die Dateierweiterung von %I.
    %~fsI       - Expandiert %I zu einem vollständigen Namen, der nur
                   kurze Dateinamen enthält.
    %~dp$PATH:I - Durchsucht die in der PATH-Umgebungsvariablen
                   angegebenen Verzeichnisse nach %I und erstellt den
                   Laufwerkbuchstaben und Pfad der ersten gefundenen Datei.
    %~ftzaI     - Expandiert %I zu einer Zeile, die der Ausgabe des DIR-
                   Befehls entspricht.

In den angegebenen Beispielen können %I und PATH durch andere gültige
Werte ersetzt werden. Der Ausdruck %~ wird durch einen gültigen Variablen-
namen für FOR abgeschlossen. Die Verwendung von Großbuchstaben für die Namen
von Variablen, wie z. B. %I, macht diese Ausdrücke leichter lesbar und
vermeidet Verwechslungen mit den eigentlichen Parametern.
Member: blacksun
blacksun Feb 13, 2019 at 13:26:10 (UTC)
Goto Top
Vielen Dank.

an for /? bin ich dran.
mir hat noch gefehlt wie man %%a und z.B. %~nI kombiniert, also z.B. kein %%~n%%a

kannst du mir noch sagen wie man
%~dp0
und
:~1
kombiniert (nicht in der for-Schleife)

hier ein Beispiel:
set LW1=y
set LW2=w
set LW3=v
set LW4=t


copy /Y "%~dp0*.bat" "%LW1%%~dp0:~1"
copy /Y "%~dp0*.bat" "%LW2%%~dp0:~1"
copy /Y "%~dp0*.bat" "%LW3%%~dp0:~1"
copy /Y "%~dp0*.bat" "%LW4%%~dp0:~1"
Mitglied: 138810
138810 Feb 13, 2019 updated at 13:36:30 (UTC)
Goto Top
Zitat von @blacksun:
mir hat noch gefehlt wie man %%a und z.B. %~nI kombiniert, also z.B. kein %%~n%%a
Steht da ja.
kannst du mir noch sagen wie man
%~dp0
und
:~1
kombiniert (nicht in der for-Schleife)

hier ein Beispiel:
set LW1=y
set LW2=w
set LW3=v
set LW4=t


copy /Y "%~dp0*.bat" "%LW1%%~dp0:~1"
copy /Y "%~dp0*.bat" "%LW2%%~dp0:~1"
copy /Y "%~dp0*.bat" "%LW3%%~dp0:~1"
copy /Y "%~dp0*.bat" "%LW4%%~dp0:~1"

%%~dp0 Bedeutet d = Drive, p = Path Du kombinierst also Laufwerksbuchstaben doppelt also falsch.
Was soll den im ersten Commandline Parameter %~1 stehen? nur ein Dateiname oder was?
"%LW1%:%~p0:%~1"

Beschreibe mal mit Worten was du überhaupt machen willst, damit man sich das hier nicht zusammenreimen muss...

Btw. wieso muss man immer noch mit Batch rumpfuschen?? Sowas macht man heutzutage mit Powershell ... Die Leute lernen es offensichtlich nie. Den Lehrern auf den Berufsschulen sollte man langsam mal in der Allerwertesten treten was sie da immer noch heranzüchten. ^^
Member: blacksun
blacksun Feb 13, 2019 updated at 14:24:52 (UTC)
Goto Top
es sind 2 Dinge die gemacht werden sollen. Das eine hat sich leider aus dem anderen so entwickelt.

Ursprünglich ging es nur darum:
Runas-Befehl in Batch, mehrere Befehle ausführen

es sollten mit runas nicht nur ein Kommando mit dem entsprechend eingegebenen User ausgeführt werden, sondern 4

Wie Du siehst wusste dort keiner mehr weiter.
Somit blieb mir nur die ebenfalls dort erwähnte Möglichkeit das ganze auf 2 Batch-Dateien aufzuteilen. Die 4 Befehle stehen in der 2. Batch, und runas ruft eben die 2. Batch auf.

Die Idee war nun die dass ich die 2. Batch so variabel gestalte dass sie ohne Anpassungen für verschiedene Anwendungen verwendet werden kann.

Die erste Batch heißt z.B. Notepad_start.bat
Die dazugehörige 2. Batch soll dann Notepad_start2.bat heißen

Dazu sollte eben
for %%a in ("%~dp0*start.bat") do set filename=%%~na
dienen

nun zum 2. Thema.
Hier geht es darum die beiden Batch-Dateien auf verschiedene Server zu kopieren.
dazu habe ich die kopieren.bat erstellt. Diese sieht so aus:

@echo off

set LW1=y
set LW2=w
set LW3=v
set LW4=t

for %%a in ("%~dp0*start.bat") do set filename=%%~na  
echo @echo off >"%~dp0%filename%2.bat"  
echo net use u: /d >>"%~dp0%filename%2.bat"  
echo net use w: /d >>"%~dp0%filename%2.bat"  
echo net use u: \\x.x.x.x\Home\S%username:~1% >>"%~dp0%filename%2.bat"  
echo net use w: \\x.x.x.x\Home\A%username:~1% >>"%~dp0%filename%2.bat"  
echo start "" "%%StartFile%%" >>"%~dp0%filename%2.bat"  


copy /Y "%~dp0*.bat" "%LW1%%~dp0:~1"  
copy /Y "%~dp0*.bat" "%LW2%%~dp0:~1"  
copy /Y "%~dp0*.bat" "%LW3%%~dp0:~1"  
copy /Y "%~dp0*.bat" "%LW4%%~dp0:~1"  

Die kopieren.bat erzeugt also zunächst die 2. Batch neu (Beispielsweise Notepad_start2.bat), und kopiert Batch1 und Batch2, also Notepad_start.bat und Notepad_start2.bat auf die Server.

Die kopieren.bat soll also alle *.bat Dateien aus dem Pfad, aus dem kopieren.bat aufgerufen wird, auf die entsprechenden Server kopieren.

kopieren.bat liegt z.B. unter
c:\temp\notepadOrdner\
Die Datei Notepad_start.bat liegt ebenfalls darin.
Nun starte ich kopieren.bat
es wird die Notepad_start2.bat erzeugt.
*.bat soll nun von c:\temp\notepadOrdner\ kopiert werden auf
y:\temp\notepadOrdner\
w:\temp\notepadOrdner\
v:\temp\notepadOrdner\
t:\temp\notepadOrdner\

Die Idee war nun dass ich mit %%~dp0 den Pfad c:\temp\notepadOrdner\ nehme, die erste Stelle wegschneide, und dann somit die Zielpfade baue.
Mitglied: 138810
138810 Feb 13, 2019 updated at 14:42:07 (UTC)
Goto Top
es sollten mit runas nicht nur ein Kommando mit dem entsprechend eingegebenen User ausgeführt werden, sondern 4
Das mappen ist ja eigentlich auch Blödsinn, nutze einfach UNC Pfade
notepad \\server\share\datei.txt

Wie Du siehst wusste dort keiner mehr weiter.
Wundert mich bei den Beiden nicht.

Für mehrere Befehle hintereinander die aufeinander warten:
runas /user:DOMAIN\USER "cmd /c notepad \\server\share\sdfdsf.txt & notepad \\server\share\dfsgsfdg.txt"  
oder parallel gestartete
runas /user:DOMAIN\USER "cmd /c start \"\" notepad \\server\share\sdfdsf.txt & start \"\" notepad \\server\share\dfsgsfdg.txt"  
usw.
Member: blacksun
blacksun Feb 13, 2019 updated at 15:40:22 (UTC)
Goto Top
Das mit dem Mappen und dem Aufruf einer Datei (notepad.exe "m:\Daten\meine Datei.txt") habe ich nur deshalb erwähnt um zu sehen wie da die Syntax aussehen muss.

Die eigentliche Anwendung benötigt tatsächlich 2 gemappte Laufwerke da die Anwendung mit mehreren Dateien auf dem Share arbeitet.
In der Anwendung kann ich kein UNC angeben, bzw. unsere Gruppenrichtlinien verhindern die Nutzung von UNC im Explorer.

Es müssen also tatsächlich vor dem Aufruf 2 Laufwerke gemappt werden, also zuerst 2 Buchstaben entmappen falls bereits belegt, dann 2LW Mappen und dann den Aufruf der Anwendung (Kyocera NetViewer)

und die Kombination runas und net use funktioniert leider nicht.

Meine Idee war für einen Test
@echo off
set StartFile=%PROGRAMFILES%\Kyocera\NetViewer\KNV\bin\Netviewer.exe
echo %StartFile%

...
:sUserKonto
set /p BENUTZER="Bitte den Benutzernamen eines Ad-Admin-Accounts eingeben:"  
runas /env /savecred /user:%USERDOMAIN%\%BENUTZER% "cmd /c net use u: /d & net use w: /d & net use u: \\x.x.x.x\Home\S%username:~1% & net use w: \\x.x.x.x\Home\A%username:~1%" & start \"\" \"%StartFile%\""  

Ich brauche also die synchrone Abarbeitung der 4 net use, und dann einen start "" "xx" damit die cmd NICHT offen bleibt bis die Anwendung geschlossen wird.

Das funktioniert so leider nicht.
Member: blacksun
blacksun Feb 14, 2019 at 11:00:47 (UTC)
Goto Top
Hallo,

ich bin jetzt nochmal die Syntax genau durchgegangen und nun funktioniert das mit dem runas

set /p BENUTZER="Bitte den Benutzernamen eines Ad-Admin-Accounts eingeben: "  
runas /env /savecred /user:%USERDOMAIN%\%BENUTZER% "cmd /k net use u: /d & net use w: /d & net use u: \\x.x.x.x\Home\S%username:~1% & net use w: \\x.x.x.x\Home\A%username:~1% & start \"\" \"%StartFile%\" & exit"  


was ich aber nicht verstehe beim Aufruf mit start "" "xx"

die " braucht man wenn im Pfad ein Leerzeichen enthalten ist was bei %PROGRAMFILES% leider der Fall ist.
nun zum Aufruf mit runas unter der Annahme dass Notepad.exe dort liegt:

runas /user:DOMAIN\USER "cmd /c start \"\" "%PROGRAMFILES%\Notepad.exe""   

funktioniert so

Wenn man der Notepad.exe Parameter mitgeben möchte, dann darf es keine " geben:
runas /user:DOMAIN\USER "cmd /c start \"\" %PROGRAMFILES%\Notepad.exe /x"   

Das macht die einheitliche Verwendung des Batchfiles für Anwendungen mit und ohne Parameter schwierig.

Hättest Du mir eine Idee wie man das umgehen könnte?


Da der Aufruf mit runas mit mehreren Befehlen nun funktioniert brauche zwar das zweite Batch-File nicht, würde aber für die Zukunft dennoch gerne wissen wie man
%~dp0
und
:~1
kombiniert, sprich die Ausgabe, die %~dp0 liefert, um die erste Stelle kürzt.

Vielen Dank.