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-Key: 235007

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

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

Member: Xaero1982
Xaero1982 Apr 09, 2014 at 10:05:18 (UTC)
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ß
Member: einfachBernd
einfachBernd Apr 09, 2014 at 10:08:49 (UTC)
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?
Member: einfachBernd
einfachBernd Apr 09, 2014 at 10:10:44 (UTC)
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
Member: einfachBernd
einfachBernd Apr 09, 2014 at 10:11:03 (UTC)
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"   
Member: Xaero1982
Xaero1982 Apr 09, 2014 updated at 10:31:30 (UTC)
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
Member: einfachBernd
einfachBernd Apr 09, 2014 at 11:50:03 (UTC)
Goto Top
danke für den Link, jedoch möchte ich kein VBS nutzen...
eigtl reicht mir der richtige Code ;)
Member: bastla
bastla Apr 09, 2014 at 13:29:59 (UTC)
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
Member: einfachBernd
einfachBernd Apr 09, 2014 updated at 13:36:19 (UTC)
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
Member: bastla
Solution bastla Apr 09, 2014, updated at Apr 10, 2014 at 10:37:32 (UTC)
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.
Member: Xaero1982
Xaero1982 Apr 09, 2014 at 18:32:56 (UTC)
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ß
Member: einfachBernd
einfachBernd Apr 09, 2014 at 20:09:56 (UTC)
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
Member: Xaero1982
Xaero1982 Apr 09, 2014 at 22:14:03 (UTC)
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.
Member: Xaero1982
Xaero1982 Apr 10, 2014 at 15:19:37 (UTC)
Goto Top
Immerhin gelöst und den Beitrag den ich als Link postet als Lösung markiert - so lieb ich es face-smile