knumskull
Goto Top

Temporäres Netzlaufwerk über pushd mehrfach benutzbar?

Möglichkeit zum mehrfachen benutzen eines temporären Netzlaufwerkes welches durch pushd erzeugt wurde.

Hallo,

ich habe ein Startskript für ein Programm, welches im Netzwerk liegt.
Zum starten wird in das Verzeichnis mittels 'pushd' navigiert.
Dabei wird ein Netzlaufwerk erzeugt.

Alles schön und gut, jedoch wird das Programm jetzt häufiger gestartet, was irgendwann zur Folge hat, dass das Alphabet voll ist und keine Netzlaufwerke mehr erzeugt werden können.

Wie kann ich jetzt erreichen, dass 'pushd' so intelligent ist, dass wenn ein Netzlaufwerk zu dem Pfad schon vorhanden ist, er es nicht nochmal neu erzeugt.

Meine erste Idee war, dass ich mittels 'net use' schaue, ob schon eine Verbindung und Laufwerk zu dem Net-Share exisitiert.

:CHECK_APPL_DRIVE
net use | find "\\cae-samba\appl" > %TEMP%\indi_tmp.tmp  
if errorlevel 1 exit /b 1
for /F "tokens=1,2 delims=: " %%i in (%TEMP%\indi_tmp.tmp) do (  
	if not "%%i" == "" (  
		echo %%i: > %TEMP%\indi_tmp_2.tmp
		for /F "tokens=1 " %%j in (%TEMP%\indi_tmp_2.tmp) do (  
			set CAE_HOME=%%j
		)
	)
)
del /F %TEMP%\indi_tmp_2.tmp
del /F %TEMP%\indi_tmp.tmp

goto :eof

funktioniert soweit, jedoch wenn ich die 'Master-Applikation' beende, ist auch das Netzlaufwerk weg.
Hat jemand eine Idee?

Gruß,
Steffen

Content-Key: 135540

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

Printed on: April 18, 2024 at 06:04 o'clock

Mitglied: 60730
60730 Feb 09, 2010 at 13:47:34 (UTC)
Goto Top
Servus,

was ich nicht so ganz verstehe ist doch...
jedoch wenn ich die 'Master-Applikation' beende, ist auch das Netzlaufwerk weg.

denn das verhalten findet man in deinen zeilen nicht
Und wenn ich schon dabei bin, warum wird denn ein temp. Laufwerksmapping gemacht, wenn das laufwerk auf nach dem beenden der Masterapp vorhanden sein soll?

Lass dich doch dazu mal etwas genauer aus.

gruß
Member: Knumskull
Knumskull Feb 09, 2010 at 13:54:45 (UTC)
Goto Top
unter 'Master-Applikation' meinte ich die zu erst gestartete Apllikation.

Was ich halt nicht möchte, das ich ein Netzlaufwerk fest verbinde, da ich nie sichergehen kann, ob das entsprechende Laufwerk noch frei ist.
Bisher hatte ich keine solche Probleme, jetzt wollen die Benutzer aber eben das Programm mehrfach öffnen. Was an die besagt Alphabets-grenze stößt.

Der aufruf der app funktioniert wie folgt (in kurzform):
pushd \\cae-samba\appl\indi
call indi.exe
popd


Vielleicht kurz zusammengefasst.
- es wird immer die gleiche Applikation gestartet
- pro Start wird ein Netzlaufwerk verbunden

gruß
steffen
Mitglied: 60730
60730 Feb 09, 2010 at 14:02:55 (UTC)
Goto Top
?

gib doch mal pushd /? und Popd /? in einer Dosbox ein....

"in kurzform"
du mappst ein UNC Pfad
callst eine Anwendung
wechselst in dann erst in das verzeichnis und beendest das mapping(wenn die Befehlserweiterungen aktiviert sind)?
Ich glaube 2010 ist so ein Jahr wo ich noch viel lernen kann- Hoffentlich kommt bald Herr Alzheimer und erlöst mich face-wink
Was ich halt nicht möchte, das ich ein Netzlaufwerk fest verbinde, da ich nie sichergehen kann, ob das entsprechende Laufwerk noch frei ist.
oh jee - der Admin, der keinen Überblick über seine Laufwerksmappings hat ist immer klar im Nachteil - und der Seitenhieb mit dem Zaunpfahl von wegen, wenn alle Anwendungen/Laufwerke per pushd gemappt werden - kein Wunder...

for %i in (z y x w v u) do if not exist %i:\ net use %i \\cae-samba\appl\indi && goto weiter
:weiter
Member: Knumskull
Knumskull Feb 09, 2010 at 14:13:37 (UTC)
Goto Top
oh jee - der Admin, der keinen Überblick über seine Laufwerksmappings hat ist immer klar im Nachteil

hier arbeiten ca. 40k leute ... es gibt unzählige Abteilungen, die irgendwelche Programme bereitstellen und dann sind da noch die Anwender. Man kann sich hier nicht sicher sein.
Und auf was verlassen kann man sich hier schon gleich gar nicht.

Aber dein Ansatz ist ausbaubar face-smile ... ab und zu denke ich schon ein bissl kompliziert.
Mitglied: 60730
60730 Feb 09, 2010 at 15:43:43 (UTC)
Goto Top
Aber dein Ansatz ist ausbaubar face-smile ... ab und zu denke ich schon ein bissl kompliziert.
face-wink
yupp und ich setze manchmal zu wenig an face-wink - oder mappe zuviele Laufwerke face-wink

for %%i in (u v w x y z) do if not exist %%i:\ Set "newdrive=%%i:\"  
net use %newdrive% \\cae-samba\appl\indi
Member: Knumskull
Knumskull Feb 11, 2010 at 15:37:47 (UTC)
Goto Top
Bin dummerweise krank geworden und kann das Skript grad nicht vollenden.

Aber deinen Ansatz habe ich übernommen.
Also was ich jetzt mache, ist folgendes:
- testen ob ein netzlaufwerk besteht. Wenn ja, Laufwerksbuchstaben extrahieren und für den Pfad verwenden.
- wenn laufwer nicht besteht, anlegen und Laufwerksbuchstaben als Pfad verwenden.
- Programm starten
- nach beenden des Programmes testen, ob noch prozesse des Programmes offen sind. falls nicht, wird auch die Netzwerkverbindung wieder gelöst.

Ich will halt am Ende immer alles wieder aufräumen face-smile ... hinterlasse ungern spuren.
Member: Knumskull
Knumskull Feb 19, 2010 at 18:42:07 (UTC)
Goto Top
So, jetzt gebe ich einfach mal die entsprechenden Funktionen an.
Also es läuft jetzt. Gemacht habe ich das ganze nach der Anleitung wie im vorherigen Post geschrieben.

Nachfolgend das ganze Skript, was zum Starten des Programmes benutzt wird.

setlocal enableextensions enabledelayedexpansion

rem +----------------------------------------------
rem + CAE-Environment
rem +----------------------------------------------
set CAE_HOME=\\cae-samba\appl
call :CHECK_APPL_DRIVE
if errorlevel 1 call :CREATE_NETDRIVE

rem +----------------------------------------------
rem + Parameteruebergabe
rem +----------------------------------------------
set VERSION=%1
set STATE=%2
shift /1
shift /1

rem +----------------------------------------------
rem + Variablen deklarieren
rem +----------------------------------------------
set PROGRAMM=indiform


rem +----------------------------------------------
rem + Environment fuer %PROGRAMM% setzten
rem +----------------------------------------------
rem copy setting-files into application data
set INDI_APPDATA_LOCAL=%APPDATA%\IndiForm
set INDI_APPDATA_REMOTE=!CAE_HOME!\%PROGRAMM%\_common\appdata_default
set INDI_APPDATA_REMOTE_PROCESS=%INDI_APPDATA_REMOTE%\Settings\Process
set INDI_APPDATA_REMOTE_STEP=%INDI_APPDATA_REMOTE%\Settings\Step


rem +----------------------------------------------
rem + Copy default Settings to User-Workstation
rem +----------------------------------------------
if not exist "%INDI_APPDATA_LOCAL%" (  
	echo / Initial-Settings werden kopiert ...
	mkdir "%INDI_APPDATA_LOCAL%" >NUL  
	xcopy %INDI_APPDATA_REMOTE% "%INDI_APPDATA_LOCAL%" /E /Y >NUL  
) else (
	echo / Settings werden kopiert ...
	xcopy %INDI_APPDATA_REMOTE_PROCESS% "%INDI_APPDATA_LOCAL%\Settings\Process\" /S /E /Y >NUL  
	xcopy %INDI_APPDATA_REMOTE_STEP% "%INDI_APPDATA_LOCAL%\Settings\Step\" /S /E /Y >NUL  
	echo / Materialverzeichnis in Configfiles anpassen
	@call :REMOVE_INDEED_MATLIB_DIR
)

:MAIN
rem + Architektur bestimmen
echo /---------------------------------------------
echo / Architektur wird bestimmt ...
call :SET_ARCH
rem + Programm starten
echo / %PROGRAMM% %VERSION% wird gestartet ...
echo /---------------------------------------------
call :RUN

goto :eof


rem +----------------------------------------------
rem + Subroutinen
rem +----------------------------------------------

rem +----------------------------------------------
rem + Aufruf des Programmes
rem +----------------------------------------------
:RUN
call :VER_SWITCH
pushd !PROG_PATH!
sleep 2
call %PROG_EXEC% %*
if errorlevel 1 call :Error "Fehler beim Starten von %PROG_EXEC%" 1>NUL  
rem popd
call :FINAL_CHECK
goto :eof


rem +----------------------------------------------
rem + Switch fuer unterschiedliche Versionen
rem +----------------------------------------------
:VER_SWITCH
if /i "%VERSION%"=="default" set VERSION=0.4.0000  

if "%VERSION%"=="0.2.4702" (  
	set PROG_PATH=!CAE_HOME!\%PROGRAMM%\%STATE%\%VERSION%_%ARCH%\IndiForm
	set PROG_EXEC=indiform.exe
	goto :eof
)
if "%VERSION%"=="0.2.4897" (  
	set PROG_PATH=!CAE_HOME!\%PROGRAMM%\%STATE%\%VERSION%_%ARCH%\IndiForm
	set PROG_EXEC=!CAE_HOME!\%PROGRAMM%\%VERSION%_%ARCH%\IndiForm\indiform.exe
	goto :eof
)
if "%VERSION%"=="0.2.4931" (  
	set PROG_PATH=!CAE_HOME!\%PROGRAMM%\%STATE%\%VERSION%_%ARCH%\IndiForm
	set PROG_EXEC=indiform.exe
	goto :eof
)
if "%VERSION%"=="0.2.5501" (  
	set PROG_PATH=!CAE_HOME!\%PROGRAMM%\%STATE%\%VERSION%_%ARCH%\IndiForm
	set PROG_EXEC=indiform.exe
	goto :eof
)
if "%VERSION%"=="0.3.0000" (  
	set PROG_PATH=!CAE_HOME!\%PROGRAMM%\%STATE%\%VERSION%_%ARCH%
	set PROG_EXEC=IndiForm.exe
	goto :eof
)
if "%VERSION%"=="0.4.0000" (  
	set PROG_PATH=!CAE_HOME!\%PROGRAMM%\%STATE%\%VERSION%_%ARCH%
	set PROG_EXEC=IndiForm.exe
	goto :eof
)
goto :eof

rem +----------------------------------------------
rem + Subroutine entfernen der Config-Zeile fuer
rem + die MatLib in ProgramSettings.conf
rem +----------------------------------------------
:REMOVE_INDEED_MATLIB_DIR
set SETTINGS_FILE_ORIG=%APPDATA%\IndiForm\Settings\ProgramSettings.conf
set SETTINGS_FILE_COPY=%TEMP%\ProgramSettings.conf.orig
set SETTINGS_FILE_TEMP=%TEMP%\ProgramSettings.conf.tmp

copy /Y "%SETTINGS_FILE_ORIG%" %SETTINGS_FILE_COPY% >NUL  
copy /Y NUL "%SETTINGS_FILE_TEMP%" > NUL  

for /F "tokens=*" %%i in (%SETTINGS_FILE_COPY%) do (  
    echo %%i | find /i "INDEED_Executables" >NUL  
    if errorlevel 1 (
	echo %%i | find /i "INDEED_Material_Library" >NUL  
	if errorlevel 1 (
	  echo %%i >> "%SETTINGS_FILE_TEMP%"  
       )
    )
)

move /Y "%SETTINGS_FILE_ORIG%" "%SETTINGS_FILE_ORIG%.old" >NUL  
move /Y "%SETTINGS_FILE_TEMP%" "%SETTINGS_FILE_ORIG%" >NUL  
del /F "%SETTINGS_FILE_COPY%" >NUL  

goto :eof

rem +----------------------------------------------
rem + Subroutine zum herausfinden der Architektur
rem +----------------------------------------------
:SET_ARCH
  rem # Prozessorarchitektur bestimmen
  if "%PROCESSOR_ARCHITECTURE%"=="x86" (  
    set ARCH=win32
	goto :eof
  ) 
  if "%PROCESSOR_ARCHITECTURE%"=="AMD64" (  
    set ARCH=win64
	goto :eof
  )
  call :Error "Architektur wird nicht unterstuetzt!"  
  )
goto :eof


:CREATE_NETDRIVE
for %%i in (z y x w v u t s r) do (
	if not exist %%i:\ net use %%i: !CAE_HOME! /PERSISTENT:NO >NUL
	if not errorlevel 1 exit /b 0
)
call :CHECK_APPL_DRIVE
goto :eof


rem +----------------------------------------------
rem + CHECK_APPL_DRIVE
rem +----------------------------------------------
:CHECK_APPL_DRIVE

net use | find "cae-samba\appl" > %TEMP%\indi_tmp.tmp  
if errorlevel 1 exit /b 1
for /F "tokens=1,2 delims=: " %%i in (%TEMP%\indi_tmp.tmp) do (  
	if not "%%i" == "" (  
		echo %%i: > %TEMP%\indi_tmp_2.tmp
		for /F "tokens=1 " %%j in (%TEMP%\indi_tmp_2.tmp) do (  
			set CAE_HOME=%%j
		)
	)
)
del /F %TEMP%\indi_tmp_2.tmp >NUL
del /F %TEMP%\indi_tmp.tmp >NUL

goto :eof

rem +----------------------------------------------
rem + FINAL_CHECK
rem +----------------------------------------------
:FINAL_CHECK
rem check if indiform running
tasklist /FI "IMAGENAME eq IndiForm.exe" 2>NUL | find /I "indiform" >NUL  
if errorlevel 1 net use !CAE_HOME! /delete /yes

goto :eof



rem +----------------------------------------------
rem + Error-Sektion
rem +----------------------------------------------
:Error
echo /--------------------------------------------/
echo / Fehler beim Aufruf von %PROGRAMM% %VERSION%
echo /
echo / Fehler:
echo / %1
echo /
echo / Bitte den CAE-Support kontaktieren
echo.
pause && exit 1
goto :eof

endlocal

Sollten Fragen aufkommen, einfach fragen face-smile
LG Knums