Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Batch - Drag And Drop Files - Ampersand Bug

Mitglied: rubberman

rubberman (Level 3) - Jetzt verbinden

05.04.2014 um 15:38 Uhr, 4745 Aufrufe, 2 Kommentare, 3 Danke

Hallo Community.

Wie man weiß, kann man Parameter in einer Batchtatei über die Ausdrücke %1 bis %9 abgreifen, bzw. mit %* um gleich alle Parameter zu bekommen. Bei dragged/dropped Dateien gibt es dabei einen Bug, der nie gefixt wurde:
Alle auf diese Weise übergebenen Dateien kommen mit dem kompletten Pfad an. Sollte im Pfad oder im Dateiname ein Leerzeichen vorhanden sein, werden die Parameter automatisch in Anführungszeichen gesetzt und die Verarbeitung funktioniert problemlos. Alle Parameter ohne Leerzeichen kommen ohne umschließende Anführungszeichen. Das macht die Verarbeitung von Pfaden/Dateien mit einem & unmöglich. Hierbei wird am & Zeichen abgebrochen, unabhängig davon, ob nachträglich im Code Anführungszeichen eingefügt werden (zB. "%~1") oder nicht. Ein Workaround für diesen Bug ist die Verarbeitung der Umgebungsvariable %CMDCMDLINE%. Hier gibt es dann aber Probleme, wenn die übergebenen Dateipfade FOR-Trennzeichen wie ',' ';' '=' enthalten. Eine Reihe an Stringersetzungen ist nötig, um am Ende jeden Parameter in Anführungszeichen zu setzen um eine problemlose Verarbeitung zu ermöglichen...
Soviel zur langen Vorrede, nun aber mal zum Code, der zeigt wie die Umsetzung aussieht
(Darauf achten, dass sich nach dem letzten % in Zeile 13 kein Leerzeichen einmogelt!)
01.
@echo off &setlocal DisableDelayedExpansion
02.

03.
setlocal EnableDelayedExpansion
04.
set "params=!cmdcmdline:~,-1!"
05.
set "params=!params:*" =!"
06.

07.
if "!params!"=="" exit
08.

09.
endlocal&set "params=%params:"=""%"
10.
set "params=%params:^=^^%"
11.
set "params=%params:&=^&%"
12.
set "params=%params: =^ ^ %"
13.
set params=%params:""="%
14.
set "params=%params:"=""Q%"
15.
set "params=%params:  ="S"S%"
16.
set "params=%params:^ ^ = %"
17.
set "params=%params:""="%"
18.

19.
setlocal EnableDelayedExpansion
20.
set "params=!params:"Q=!"
21.

22.
for %%i in ("!params:"S"S=" "!") do (
23.
  if "!!"=="" endlocal
24.
  REM Nur Dateien sollen verarbeitet werden.
25.
  if not exist "%%~i\" (
26.
    set "file=%%~i"
27.
    call :proc
28.
  )
29.
)
30.

31.
echo Fertig.
32.
pause
33.
exit
34.

35.

36.
:proc
37.
echo Verarbeite "%file%" hier ...
38.
goto :eof
Ausnahmsweise kommen hier mal EXITs zum Einsatz, um Fehlermeldungen zu unterdrücken.

Referenzen:
www.dostips.com/forum/viewtopic.php?f=3&t=5479
stackoverflow.com/questions/1243240/drag-and-drop-batch-file-for-multiple-files/5370380#5370380
stackoverflow.com/questions/5471556/pretty-print-windows-path-variable-how-to-split-on-in-cmd-shell/7940444#7940444

Grüße
rubberman
Mitglied: pieh-ejdsch
12.04.2014, aktualisiert 06.10.2019
moin rubberman,

den Bug kannte ich noch nicht. Ganz schön durchgetüftelte Ersetzung.
Ich habe diese mithilfe der Quotes in der Forschleife gelöst:
01.
@echo off
02.

03.
 rem Anwendung ohne Dateiname
04.
set program= echo Verarbeite
05.

06.
::-------------------------------
07.
set "drag="
08.
setlocal enabledelayedexpansion
09.
for /f usebackqeol^=^:tokens^=2*delims^=^" %%h in (
10.
 '!cmdcmdline!'
11.
) do ( endlocal
12.
 if "%~0" equ "%%h" (
13.
  set drag="%%i"
14.
))
15.
if not defined drag exit /b
16.
set /a n=0
17.
call :readDrag
18.
>nul pause|set /p=%n% verarbeitet
19.
exit
20.

21.
:readDrag
22.
if . neq .!! setlocal enabledelayedexpansion
23.
if !drag! equ "" exit /b 
24.

25.
for /f eol^=^:tokens^=1-2*delims^=^" %%h in (!drag!) do (
26.
 endlocal
27.
 for /f "eol=:tokens=*" %%q in ("%%h") do (
28.
  set "withoutQ=%%q"
29.
  if defined withoutQ (
30.
   setlocal enabledelayedexpansion
31.
   for %%f in ("!withoutQ: =" "!") do (if . equ .!! endlocal
32.
    if %%f neq "" set /a n+=1 & %program% %%f
33.
 )))
34.
 if "%%i" neq "" set /a n+=1 & %program% "%%i"
35.
 set   drag="%%j"
36.
)
37.
goto :readDrag
Gruß Phil
Bitte warten ..
Mitglied: rubberman
12.04.2014 um 21:03 Uhr
Hallo Phil.

Ganz schön durchgetüftelte Ersetzung.
Die ist im Grundsatz nicht auf meinem Mist gewachsen. Stammt letztlich aus dem letzten Link und ist von mir nur für Leerzeichen angepasst worden. Schade nur, dass man die verzögerte Variablenerweiterung nicht durchgängig nutzen kann. Ich denke, dann könnte man noch etwas mehr herauskitzeln, was die Anzahl (eigentlich die Gesamtlänge) der übergebenen Parameter angeht.

Ich habe diese mithilfe der Quotes in der Forschleife gelöst
Sehr schönes Beispiel, wie man mit Quotes als Delimiter arbeiten kann
+1

Grüße
rubberman
Bitte warten ..
Ähnliche Inhalte
iOS
Taschenrechner Bug unter 11.3 behoben
Information von sabinesiOS

Der Bug wurde zwar schon einmal behoben, aber wohl nur durch Abschalten der Animation, wodurch die Zahlen schneller eingegeben ...

Sicherheit

Zufällige Speicherzuweisung: Windows-Bug hebelt Sicherheitsmechanismus ASLR aus

Information von Penny.CilinSicherheit1 Kommentar

Anbei eine neue Meldung bzgl.ASLR: Heise Newsticker: Zufällige Speicherzuweisung: Windows-Bug hebelt Sicherheitsmechanismus ASLR aus Gruss Penny

Windows 10

Win10 v1709 - Bug im Bare-Metal-Imagerestore - funktionsuntüchtig!

Erfahrungsbericht von DerWoWussteWindows 10

Dieser Bug existiert exklusiv in der neuen Version 1709 (hier: 16299.19) ->Ein Image wird auf einen externen Datenträger erstellt ...

Windows 10

Bug: Windows 10 Enterprise LTSC erhält Funktionsupdate angeboten

Information von kgbornWindows 106 Kommentare

Der Fehler ist mittlerweile zwar korrigiert, aber ich denke, ich stelle die Info doch mal hier für Leute ein, ...

Neue Wissensbeiträge
Grafik

Gute Spiele aus der Ubuntu Repository: SuperTuxKart

Information von NetzwerkDude vor 7 StundenGrafik1 Kommentar

Fall jemand die Firmenpolicy hat das man Linux Software nur aus dem default Repository installieren kann: Ich habe festgestellt ...

Datenschutz
Im Zweifel ist die Cloud immer unsicher
Information von certifiedit.net vor 8 StundenDatenschutz8 Kommentare

Hallo, wie schon mehrmals angesprochen, egal, womit der Dienst wirbt, im Zweifel ist es in der Cloud immer unsicher(er) ...

Entwicklung

Neu im TickX - Das neue Zusatzmodul Resourcen Syncronization

Tipp von TickXmedia-service vor 11 StundenEntwicklung1 Kommentar

Mit der aktuellen TickX Version 3.2 haben wir wieder zahlreiche Verbesserungen und Anpassungen im TickX vorgenommen. Das neue TickX-Modul ...

MikroTik RouterOS

Dynamische VLAN Zuweisung für WLAN (u. LAN) Clients mit Mikrotik

Anleitung von aqui vor 4 TagenMikroTik RouterOS2 Kommentare

1. Allgemeine Einleitung: Das folgende Tutorial gibt einen Überblick über die dynamische VLAN Zuweisung von WLAN und LAN Clients ...

Heiß diskutierte Inhalte
Ubuntu
Linux Ubuntu VNC IP
Frage von 141835Ubuntu61 Kommentare

Wie finde ich bei Linux Ubuntu die IP-Adresse vom VNC Server heraus???

Netzwerke
VPN auf Firmennetzwerk (Festplatten, Computer) einrichten, aber wie?
Frage von 81083Netzwerke34 Kommentare

Hallo, es ist ein Bisschen frustrierend. Wir haben einen 2012 R2 Server, eine Fritzbox und etwa 10-12 PC die ...

Hyper-V
Hyper-V-Host rebootet - einige wenige Gäste haben danach Ping-Zeiten von über 400ms!
Frage von DerWoWussteHyper-V20 Kommentare

Moin an alle Hyper-V Admins! Hat jemand außer mir schon einmal Folgendes erlebt? Hyper-V auf Server 2019. Server startet ...

Windows Installation
Netzwerkregistrierung mit regsvr32 über UNC Netzwerkpfad ohne Fehlermeldung gescheitert
Frage von RycoDePsycoWindows Installation18 Kommentare

Hallo, ich habe ein Problem und weiß nicht genau woran dies liegen kann. Es gibt ein Server (DomänenController) und ...