einfachbernd
Goto Top

BATCH - Problem mit Variablenauflösung

hi @all,

anbei mal der Code face-smile

echo off
cls
setlocal ENABLEDELAYEDEXPANSION

rem Variablen
set "installpath=%ProgramFiles%\Statistik"  
set "mdbSRVpath=%~dp0"  
set "office32reg=HKLM\SOFTWARE\WOW6432Node\Microsoft\Office"  
set "office64reg=HKLM\SOFTWARE\Microsoft\Office"  
set "accessreg=Access\InstallRoot\Path"  
set "shortcutpath=%allusersprofile%\desktop"  

for /f "delims=" %%a in ('dir "%systemdrive%\msaccess.exe" /S /Q /B ^|^ findstr /i office') do ( set "accessexe=%%a" & set "accesspath=!accessexe:~0,-13!")  

goto installation

:installation
echo ### INSTALLATION ###
echo Anlage lokaler Installationsorder "%installpath%"  
 md "%installpath%" >nul 2>nul  
 
echo.
echo Kopiere Datenbank auf "%installpath%"  
 if exist "%mdbSRVpath%" ( copy /Y "%mdbSRVpath%*.md*" "%installpath%" >nul 2>nul )  
 for /f "delims=" %%a in ('dir "%~dp0*.mdw" /b ') do ( set "accessmdw=%%a" )  
 for /f "delims=" %%a in ('dir "%~dp0*.mdb" /b ') do ( set "accessmdb=%%a" )  
 
echo.
echo Erstelle Shortcut auf Desktop
 start "" /w "%~dp0shortcut.exe" /F:"%shortcutpath%\Statistik.lnk" /A:C /T:""%accessexe%" "%installpath%\%accessmdb%" /wkgrp "%installpath%\%accessmdw%"" /W:"%installpath%"  
 
 goto ende

:ende
echo.
echo ### END OF SCRIPT ###

Problem ist dass bei Zeile 30 hinter /T: die Variablen nicht so aufgelöst wird wie ich das möchte.
Was macht das Script?
1. Es sucht nach einer MSACCESS.exe (Access) und versetzt diese mit 2 Variablen (exe und Pfad)
2. Dann werden die nötigen mdb und mdw in das %installpath% kopiert
3. anschließend sollte ein Shortcut auf den Public Desktop erstellt werden mit den Verweis auf
 %InstallPathAccess% %accessmdb% /wkgrp %accessmdw% 

Ich habe es schon mit """ und "" und "' usw. ausprobiert... Ohne Erfolg

Wenn ich mit
 start "" /w "%~dp0shortcut.exe" /F:"%shortcutpath%\Statistik.lnk" /A:C /T:"%accessexe% %accessmdb%"   
das mache funktioniert es aber das ist nicht das was ich benötige.

Wer hat ne Idee?

LG Berni

Content-ID: 235007

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

Ausgedruckt am: 25.11.2024 um 12:11 Uhr

Xaero1982
Xaero1982 09.04.2014 um 12:05:18 Uhr
Goto Top
Moin,

mich wundert, dass du alles in "" setzt ... auch bei set "variablenname=blabla". mWn sollte es set variablenname="blabla" sein oder auch set variablenname=blabla.

Deswegen mal set accessexe=%%a ohne "" in Zeile 13 und dann auch ohne "" in Zeile 30. Gleiches gilt für die anderen Variablen.

Gruß
einfachBernd
einfachBernd 09.04.2014 um 12:08:49 Uhr
Goto Top
Hi,

danke für die schnelle Reaktion.
Es funktioniert alles sauber bis Zeile 30, also Erstellung von Shortcut.

wenn man eine Variable mit Leerzeichen (bei mir Pfad) befüllt macht es Sinn das so zu machen
 set "variablenname=inhalt"   

Wer hat ne Idee?
einfachBernd
einfachBernd 09.04.2014 um 12:10:44 Uhr
Goto Top
Kleine Ergänzung.

wenn ich mit
 echo 
mir Zeile 30 ausgeben lassen kommt wie folgt raus

start "" /w "C:\Users\Administrator\Desktop\Statistik\Statistik\shortcut.exe" /F:"C:\ProgramData\desktop\Statistik.lnk" /A:C /T:""C:\Program Files (x86)\Microsoft Office\Office15\MSACCESS.EXE" "C:\Program Files\Statistik\Statistik.mdb" /wkgrp "C:\Program Files\Statistik\Statistik.mdw"" /W:"C:\Program Files\Statistik"

Das heisst er löst alle Variablen korrekt auf... HELP face-smile
einfachBernd
einfachBernd 09.04.2014 um 12:11:03 Uhr
Goto Top
 start "" /w "C:\Users\Administrator\Desktop\Statistik\Statistik\shortcut.exe" /F:"C:\ProgramData\desktop\Statistik.lnk" /A:C /T:""C:\Program Files (x86)\Microsoft Office\Office15\MSACCESS.EXE" "C:\Program Files\Statistik\Statistik.mdb" /wkgrp "C:\Program Files\Statistik\Statistik.mdw"" /W:"C:\Program Files\Statistik"   
Xaero1982
Xaero1982 09.04.2014 aktualisiert um 12:31:30 Uhr
Goto Top
Nu bin ich verwirrt: Zitat:"Er löst die Variablen nicht so auf wie ich es möchte"
Wie soll er sie denn auflösen, außer so wie er es ja nun tut? Und das offenbar auch noch richtig face-smile

Vielleicht hilft dir das ja weiter:
Verknüpfungen erstellen
einfachBernd
einfachBernd 09.04.2014 um 13:50:03 Uhr
Goto Top
danke für den Link, jedoch möchte ich kein VBS nutzen...
eigtl reicht mir der richtige Code ;)
bastla
bastla 09.04.2014 um 15:29:59 Uhr
Goto Top
Hallo einfachBernd!

Etwas eingedampft (und ungetestet) etwa so:
@echo off & setlocal
cls

rem Variablen
set "installpath=%ProgramFiles%\Statistik"  
set "mdbSRVpath=%~dp0"  
set "office32reg=HKLM\SOFTWARE\WOW6432Node\Microsoft\Office"  
set "office64reg=HKLM\SOFTWARE\Microsoft\Office"  
set "accessreg=Access\InstallRoot\Path"  
set "shortcutpath=%allusersprofile%\desktop"  

for /f "delims=" %%a in ('dir "%systemdrive%\msaccess.exe" /S/B ^|findstr /i office') do set "accessexe=%%a" & set "accesspath=%%~dpa"  
echo ### INSTALLATION ###
echo Anlage lokaler Installationsorder "%installpath%"  
md "%installpath%" >nul 2>nul  
 
echo.
echo Kopiere Datenbank auf "%installpath%"  
if exist "%mdbSRVpath%" copy "%mdbSRVpath%*.md*" "%installpath%" >nul 2>nul  
for /f "delims=" %%a in ('dir "%~dp0*.mdw" /b') do set "accessmdw=%%a"  
for /f "delims=" %%a in ('dir "%~dp0*.mdb" /b') do set "accessmdb=%%a"  
 
echo.
echo Erstelle Shortcut auf Desktop
"%~dp0shortcut.exe" /F:"%shortcutpath%\Statistik.lnk" /A:C /T:""%accessexe%" "%installpath%\%accessmdb%" /wkgrp "%installpath%\%accessmdw%"" /W:"%installpath%"  
 
echo.
echo ### END OF SCRIPT ###
wobei auch mir das Problem nicht ganz klar ist - was sollte denn die Zeile 30 (hier 25) genau für eine Syntax erzeugen? Kennt die "shortcut.exe" keinen Parameter für die "Argumente" der Verknüpfung?

Ich würde übrigens "shortcut.exe" ohnehin nicht verwenden, da ich (siehe das von Xaero1982 verlinkte Beispiel) mit einem Batch, der ein (temporäres) VBS selbst erzeugt, das Auslangen fände und nicht noch zusätzlich ein Programm "mitschleppen" wollte ...

Grüße
bastla
einfachBernd
einfachBernd 09.04.2014 aktualisiert um 15:36:19 Uhr
Goto Top
Hi Bastla,

danke für deine schnelle Reaktion face-smile

also es wird der Shortcut nicht erzeugt, das ist das Problem.

rem temporäres VBScript erzeugen ... 
	echo Set objShell=WScript.CreateObject("Wscript.Shell")>%temp%\MakeShortCut.vbs  
	echo Set objShortcut=objShell.CreateShortcut("%shortcutpath%\Statistik.lnk")>>%temp%\MakeShortCut.vbs  
	echo objShortcut.TargetPath="%accessexe%" "%installpath%\%accessmdb%" /wkgrp "%installpath%\%accessmdw%">>%temp%\MakeShortCut.vbs  
	echo objShortcut.WorkingDirectory="%installpath%">>%temp%\MakeShortCut.vbs  
	echo objShortcut.Save>>%temp%\MakeShortCut.vbs
	
	cscript //nologo %temp%\MakeShortCut.vbs 
	del %temp%\MakeShortCut.vbs

funktioniert leider auch nicht... k.a. wieso
bastla
Lösung bastla 09.04.2014, aktualisiert am 10.04.2014 um 12:37:32 Uhr
Goto Top
Hallo einfachBernd!

Versuch es mal so:
rem temporäres VBScript erzeugen ... 
     >%temp%\MakeShortCut.vbs echo Set objShell=WScript.CreateObject("Wscript.Shell")  
    >>%temp%\MakeShortCut.vbs echo Set objShortcut=objShell.CreateShortcut("%shortcutpath%\Statistik.lnk")  
    >>%temp%\MakeShortCut.vbs echo objShortcut.TargetPath="%accessexe%"  
    >>%temp%\MakeShortCut.vbs echo objShortcut.WorkingDirectory="%installpath%"  
    >>%temp%\MakeShortCut.vbs echo objShortcut.Arguments="""%installpath%\%accessmdb%"" /wkgrp ""%installpath%\%accessmdw%"""  
    >>%temp%\MakeShortCut.vbs echo objShortcut.Save
	
    cscript //nologo %temp%\MakeShortCut.vbs 
    del %temp%\MakeShortCut.vbs
Ansonsten: Wenn die Verknüpfung nicht erstellt wird, könnte das natürlich auch ganz einfach auf fehlende (Schreib-)Rechte für "%allusersprofile%\desktop" zurückzuführen sein - der Batch sollte jedenfalls als Admin ausgeführt werden ...

Grüße
bastla

P.S.: Das Voranstellen der Ausgabeumleitung (>>%temp%\MakeShortCut.vbs) dient hier in erster Linie der besseren Lesbarkeit.
Xaero1982
Xaero1982 09.04.2014 um 20:32:56 Uhr
Goto Top
Zitat von @bastla:


Ansonsten: Wenn die Verknüpfung nicht erstellt wird, könnte das natürlich auch ganz einfach auf fehlende
(Schreib-)Rechte für "%allusersprofile%\desktop" zurückzuführen sein - der Batch sollte jedenfalls als
Admin ausgeführt werden ...

Grüße
bastla

Genau da sehe ich den Knackpunkt face-smile

Gruß
einfachBernd
einfachBernd 09.04.2014 um 22:09:56 Uhr
Goto Top
Hi @all,

Rechte passen da ich eben wenn ich den Teil nach %installpath% weglasse ja alles funktioniert... es happert definitv an der Thematik, dass hier mehrere Variablen mit leerzeichen nach /T: Probleme machen... i schau ma den ansatz von bastla nochmals an mit den vbs und den """ hoffe mal das klappt face-smile

danke für eure zeit und mühe face-smile
Xaero1982
Xaero1982 10.04.2014 um 00:14:03 Uhr
Goto Top
Moin,

also ich hab mal bissel rumgebastelt, aber wie man zu diesem Ergebnis kommt muss jemand anderes rausbekommen face-smile

1. Wenn du Office 2010 benutzt heißt der Parameter /wrkgrp
2. Das Ziel im Shortcut muss wie folgt aussehen:
"C:\Program Files (x86)\Microsoft Office\Office14\MSACCESS.EXE" "c:\Program Files\Statistik\statistik.accdb" /wrkgrp "c:\program files\statistik\statistik.mdw"  

Man beachte wirklich die "". Ein umschließendes "" geht nicht.

So, das Problem ist folgendes:

Shortcut.exe /F:"%ALLUSERSPROFILE%\Statistik.lnk" /A:C /T:"%ProgramFiles(x86)%\Microsoft Office\Office14\MSACCESS.EXE" /P:"c:\Program Files\Statistik\statistik.accdb /wrkgrp c:\program files\statistik\statistik.mdw" /W:"C:\program files\statistik"  

Ist nur ein Test - deswegen andere Pfade. Dieser code ergibt letztlich nur folgendes:
"C:\Program Files (x86)\Microsoft Office\Office14\MSACCESS.EXE" c:\Program Files\Statistik\statistik.accdb /wrkgrp c:\program files\statistik\statistik.mdw  
Das widerum funktioniert nicht. Wenn man im Code nach dem T: noch ein " und am Ende ein " setzt erkennt er die Leerzeichen nicht mehr.

Übrigens gibt es /P: für die Parameterangabe.

Aus meiner Sicht ist die Erstellung in dieser Form nicht möglich - selbst ohne Leerzeichen.
Xaero1982
Xaero1982 10.04.2014 um 17:19:37 Uhr
Goto Top
Immerhin gelöst und den Beitrag den ich als Link postet als Lösung markiert - so lieb ich es face-smile