alforno
Goto Top

Erstellen von Verknüpfungen - Parameterübergabe, Leerzeichen im Pfad

Hallo,

ich möchte gerne per Batch und vbs eine Verknüpfung auf eine pdf erstellen, die im Netzwerk liegt.

Hier im Forum habe ich dazu folgende batch Datei gefunden:

::Speicherort der Verknüpfung (unterhalb von Startmenue\Programme)
set "zielpfad=E:\dokumanagement\eingangsrechnungen\lnk_archiv"  

::Name der Verknüpfung (ohne ".lnk") 
set "progtitel=%3"  

::Speicherort der Programmdatei (wird auch für "Ausführen in:" verwendet) 
set "progdir=%1"  
set "progexe=%2"  

::temporäres VBScript erzeugen ...
echo Set objShell=WScript.CreateObject("Wscript.Shell")>%temp%\MakeShortCut.vbs  
echo Set objShortcut=objShell.CreateShortcut("%zielpfad%\%progtitel%.lnk")>>%temp%\MakeShortCut.vbs  
echo objShortcut.TargetPath="%progdir%\%progexe%">>%temp%\MakeShortCut.vbs  
echo objShortcut.WorkingDirectory="%progdir%">>%temp%\MakeShortCut.vbs  
echo objShortcut.Save>>%temp%\MakeShortCut.vbs

::... ausführen ...
cscript //nologo %temp%\MakeShortCut.vbs

::... und wieder löschen.
del %temp%\MakeShortCut.vbs

Da die Verknüpfung als Namen einen Wert aus einer MySQL DB erhalten muss, verwende ich php um die obenstehende .bat aufzurufen.

<?php
exec("cmd.exe /c F:\backup_skripte\GenerateLink.bat $pfad $dateiname $lfdRechNr");  
?>

Solange der Pfad der an die .bat übergeben wird keine Leezeichen enthält funktioniert es einwandfrei. Leider habe ich keinen Einfluss auf die Pfade.
Diese sehen zum Beispiel so aus: \\server\dokus\Müller, Max Stuttgart\

Wie müsste der obenstehende Code verändert werden, damit immer der ganze Pfad übergeben wird.

Danke.

Schöne Grüße
Alforno

Content-ID: 295426

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

Ausgedruckt am: 22.11.2024 um 11:11 Uhr

rubberman
rubberman 06.02.2016 um 19:59:35 Uhr
Goto Top
Hallo Alforno.

Anführungszeichen helfen. In einem PHP String musst du die natürlich maskieren.
exec("cmd.exe /c \"\"F:\backup_skripte\GenerateLink.bat\" \"$pfad\" \"$Dateiname\" \"$lfdRechNr\"\"");


Grüße
rubberman
Alforno
Alforno 06.02.2016 aktualisiert um 20:21:58 Uhr
Goto Top
Hallo rubberman,

vielen Dank für die schnelle Antwort.

Leider war das noch nicht die Lösung. Jetzt wird von den 15 Datensätzen nur für zwei ein Link erstellt. Die Pfade passen aber nicht.
Wenn ich mir die Eigenschaften des Links ansehe, dann wird auch wieder am ersten Leerzeichen getrennt.

Schöne Grüße
Alforno
rubberman
rubberman 06.02.2016 um 20:32:49 Uhr
Goto Top
Im Batchsript die umschließenden Anführungszeichen wieder entfernen.
::Name der Verknüpfung (ohne ".lnk") 
set "progtitel=%~3"  

::Speicherort der Programmdatei (wird auch für "Ausführen in:" verwendet) 
set "progdir=%~1"  
set "progexe=%~2"  


Grüße
rubberman
Alforno
Alforno 06.02.2016 um 20:44:54 Uhr
Goto Top
Hallo rubberman,

leider bringt das keine Änderung.

Schöne Grüße
Alforno
rubberman
rubberman 06.02.2016 um 21:04:09 Uhr
Goto Top
Nanu, wo klemmt's denn nun noch?
Was ist denn in den Eigenschaften der Verknüpfung verkehrt dargestellt?
Alforno
Alforno 06.02.2016 um 21:18:16 Uhr
Goto Top
exec("cmd.exe /c \"\"F:\backup_skripte\GenerateLink.bat\" \"$pfad\" \"$dateiname\" \"$lfdRechNr\"\"");  
oder
exec("cmd.exe /c F:\backup_skripte\GenerateLink.bat $pfad $dateiname $lfdRechNr");   

Das Ergebnis ist bei beiden Einträgen das gleiche.

Wenn der Pfad im Netzwerk so aussieht:
\\server\dokus\Mueller Max Stuttgart\

Dann wird in den Eigenschaften der Verknüpfung folgendes Ziel dargestellt:
\\server\dokus\Mueller\Max\

Der Pfad und der Dateiname werden nach folgendem Schema erstellt.

$pfad = "\\\server\\dokus\\".$lieferant."_".$LieferantNr."\\_rech_scan\\".$RechDat_Jahr."\\";  
$dateiname = $RechDat_Jahr."-".$RechDat_Monat."-".$RechDat_Tag."_".$RechnungsNr.".".$datei_format;  


Schöne Grüße
Alforno
rubberman
rubberman 06.02.2016 um 21:35:41 Uhr
Goto Top
Zu PHP kann ich nichts sagen. Die Kommandozeile sollte funktionieren.

D:\test.bat:
@echo off
echo %1
echo %2
echo %3


Aufruf und Ausgabe:
D:\>cmd /c ""test.bat" "mit Leerzeichen 1" "mit Leerzeichen 2" "mit Leerzeichen 3""
"mit Leerzeichen 1"
"mit Leerzeichen 2"
"mit Leerzeichen 3"

D:\>

Ich hab leider keine Ahnung was bei deinen Scripts nicht funktioniert.
Alforno
Alforno 06.02.2016 um 21:40:24 Uhr
Goto Top
Wie müsste ich diesen Aufruf abändern, damit die Ausgaben in eine Datei geschrieben werden können.

exec("cmd.exe /c \"\"F:\backup_skripte\GenerateLink.bat\" \"$pfad\" \"$dateiname\" \"$lfdRechNr\"\"");  

Dann hätte man ja die Möglichkeit zu sehen, wie die einzelnen Werte übergeben werden.
Alforno
Alforno 06.02.2016 um 21:49:45 Uhr
Goto Top
Hallo rubberman,

ich vermute der Fehler liegt hier:
::Name der Verknüpfung (ohne ".lnk") 
set progtitel=%3

::Speicherort der Programmdatei (wird auch für "Ausführen in:" verwendet) 
set progdir=%1
set progexe=%2


Denn wenn ich die .bat direkt über die Kommandozeile aufrufe und die drei Parameter von Hand übergebe, dann erhalte ich den gleichen Fehler.
Es erfolgt an den Leerzeichen eine Trennung und damit wird der Pfad falsch übergeben.

Schöne Grüße
Alforno
rubberman
rubberman 06.02.2016 aktualisiert um 22:03:24 Uhr
Goto Top
Hab ich dir doch in meiner 2. Antwort schon mal anders vorgeturnt. Die Zuweisung in Anführungszeichen und die Tilde (~) um umschließende Anführungszeichen der Parameter zu entfernen.
rubberman
Lösung rubberman 06.02.2016 aktualisiert um 22:44:34 Uhr
Goto Top
Nur mal so nebenher: Du musst deine Variablen nicht zufällig mit Punkten verketten? à la
exec("cmd.exe /c \"\"F:\backup_skripte\GenerateLink.bat\" \"".$pfad."\" \"".$dateiname."\" \"".$lfdRechNr."\"\"");

Wie gesagt, kenne mich mit PHP nicht aus, kommt mir nur komisch vor...
Alforno
Alforno 06.02.2016 um 22:44:31 Uhr
Goto Top
Bingo.
Vielen Dank.

Jetzt hat es bei 2 Datensätzen nicht funktioniert. In beiden ist aber ein & im Pfad enthalten.
rubberman
rubberman 06.02.2016 um 23:12:04 Uhr
Goto Top
Das scheint dann aber wieder eher ein PHP Problem zu sein, denn & in einem Pfad ist in der Kommandozeile genauso harmlos wie ein Leerzeichen, wenn der Pfad in Anführungszeichen steht. Voraussetzung ist aber wieder das Schema der Zuweisung, wie in meiner 2. Antwort ...