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

Tipp Entwicklung Batch & Shell

Mitglied: rubberman

rubberman (Level 3) - Jetzt verbinden

05.04.2014 um 15:38 Uhr, 4114 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 13.04.2014
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  if "%~0" equ "%%h" set drag="%%i" 
12.
if not defined drag exit /b 
13.
set /a n=0 
14.
call :readDrag 
15.
>nul pause|set /p=%n% verarbeitet 
16.
exit 
17.
 
18.
:readDrag 
19.
if . neq .!! setlocal enabledelayedexpansion 
20.
if !drag! equ "" exit /b  
21.
 
22.
for /f eol^=^:tokens^=1-2*delims^=^" %%h in (!drag!) do ( 
23.
 endlocal 
24.
 for /f "eol=:tokens=*" %%q in ("%%h") do ( 
25.
  set "withoutQ=%%q" 
26.
  if defined withoutQ ( 
27.
   setlocal enabledelayedexpansion 
28.
   for %%f in ("!withoutQ: =" "!") do (if . equ .!! endlocal 
29.
    if %%f neq "" set /a n+=1 & %program% %%f 
30.
 ))) 
31.
 if "%%i" neq "" set /a n+=1 & %program% "%%i" 
32.
 set   drag="%%j" 
33.
34.
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
Sicherheit
UAC-Bypass durch Bug im Aufgabenplaner
Information von DerWoWussteSicherheit4 Kommentare

Abstract: Durch einen Bug im Scheduler/in der schtasks.exe kann ein unbedachter Klick eines lokalen Administrators auf ein Skript böse ...

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

Webbrowser
Firefox 56 mit beseitigtem IndexDB-Bug und Screenshot-Tool
Information von BassFishFoxWebbrowser

Das Geschrei im Artikel um das Screenshot-Tool ist groesser wie das Reden ueber Beseitigen eines Bugs. Bevor jemand etwas ...

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

Neue Wissensbeiträge
Erkennung und -Abwehr

Necur-Botnet soll Erpressungstrojaner Scarab massenhaft verbreiten

Information von BassFishFox vor 11 StundenErkennung und -Abwehr

12,5 Millionen Spam-Mails aus einem Bot-Netz mit 6 Millionen Computern? Eigentlich eine schwache Leistung. Die Erpresser setzen dabei auf ...

Microsoft

Nadeldrucker-Problem unter Windows - Microsoft liefert Updates

Information von BassFishFox vor 12 StundenMicrosoft

Hat ja nicht lange gedauert. Nachdem die November-Updates für Windows 7, 8.1 und 10 zahlreiche Nadeldrucker lahmgelegt hatten, stellt ...

Linux

Limux-Ende in München: Wie ein Linux Projekt unter Ausschluss der Öffentlichkeit zerstört wurde

Information von Frank vor 20 StundenLinux14 Kommentare

Mein persönlicher Kommentar zum Thema "Limux-Ende". Die SPD-Politikerin Anne Hübner hat die Richtung von München ganz klar definiert: "Wir ...

Batch & Shell

Open Object Rexx: Eine mittlerweile fast vergessene Skriptsprache aus dem Mainframebereich

Information von Penny.Cilin vor 1 TagBatch & Shell9 Kommentare

Ich kann mich noch sehr gut an diese Skriptsprache erinnern und nutze diese auch heute ab und an noch. ...

Heiß diskutierte Inhalte
Windows Server
Kann man im KMS nachschauen , wieviele Clients den Key in Anspruch genommen haben
gelöst Frage von rainergugusWindows Server15 Kommentare

Hallo, wir haben einen KMS Windows 10 Key. Dieser ist ja W7 kompatibel. Aber unser Windows 7 Pool registriert ...

Router & Routing
Zwei Netzwerke erstellen
Frage von bunteblumeRouter & Routing14 Kommentare

Hallo Zusammen, Ich möchte gerne ein backup von einem bestimmten Folder welcher auf dem Server regelmässig synchronisiert wird auf ...

Linux
Limux-Ende in München: Wie ein Linux Projekt unter Ausschluss der Öffentlichkeit zerstört wurde
Information von FrankLinux14 Kommentare

Mein persönlicher Kommentar zum Thema "Limux-Ende". Die SPD-Politikerin Anne Hübner hat die Richtung von München ganz klar definiert: "Wir ...

Off Topic
Fachkräftemangel in Deutschland? - Talentschmiede schreibt alle 2 Tage die gleichen Stellen aus
Frage von Penny.CilinOff Topic12 Kommentare

Hallo, haben wir in Deutschland Fachkräftemangel? Die Talentschmiede schreibt gefühlt alle zwei Tage dieselben Stellen aus. Und das schon ...