Laufwerksbuchstaben ständig ändern

Hier hab ichs im Netzwerkbereich mit Verknüpfung auf diesen Fred noch mal beschrieben.

https://www.computerbase.de/forum/t...32-und-64bit-emulieren.1174409/#post-13493749

Eine Hardwarelösung gibts. Nur Softwaretechnisch siehts mau aus.

Ich will halt ein Netzlaufwerk zu einem Ordner auf meinem Rechner erstellen, obwohl mein Rechner nicht im Netzwerk ist.

Sowie ich in irgendeinem Netzwerk bin, klappts ja.
edit@ Hatte ja ne super Vorlage! Nur, dass die Netzlaufwerke "leer" sein müssen beim trennen, das leuchtet mir nicht so ein. Ist doch nur ne Zuweisung ?!?
Ergänzung ()

Gabbadome schrieb:
... Natürlich kann ein Netzlaufwerk nur eingebunden werden, wenn du auch mit dem Netzwerk verbunden bist is dem die Laufwerke bereit gestellt werden.

Wenn ich das Netzwerkkabel reinstöpsel, läufts ja alles (bin dann im Büronetzwerk).
Wenn ich das Kabel ziehe, bin ich so zu sagen offline. Der Datenpfad, dem ich dann das Laufwerk zuweisen möchte, liegt ja auf der lokalen Platte. Ich muss Ihm halt nur ein bspw. R: zuweisen, damit die Projektpfade alle stimmen. Via Netzlaufwerken geht das ja super. Nur muss ich dafür Windows ja ein Netzwerk "vorgaukeln", bspw. einfach nen Switch anstecken. Schon klappt alles.
Nur wollte ich Hardwaretechnisch nichts erweitern, sondern will Windows auch ohne Netzwerk dazu verleiten, ein Netzwerklaufwerk zu verbinden. Gibts da denn ev. einen Dienst, den man (vorübergehend lokal) deaktivieren kann, der so etwas prüft ?
Nuja, da sehe ich jedenfalls momentan leider keine besseere Lösung, als nen kleinen Switch ...
 
Zuletzt bearbeitet:
Ah du willst einen Ordner als Laufwerk einbinden. Sag das doch gleich :D
Ich schau mal eben was sich mit AutoIt machen lässt, sonst musst du auf die guten alten Batch-Scripte zurück greifen.
Ergänzung ()

HDScratcher schrieb:
Im anderen Thread hast Du doch schon den Tipp mit subst bekommen, damit mappt man einen lokalen Ordner (oder Laufwerk) als lokales Laufwerk. Das ganze auch unabhängig vom Netzwerkstatus.
also z.B:
subst x: N:\Projekte\2013\xxx
dabei bleibt das Laufwerk N: weiter/zusätzlich verwendbar und Du sparst Dir
zum Löschen dann
subst x: /d

Jegliche Berechtigungen auf Freigabeebene entfallen, dass dürfte aber eher für weniger Probleme sorgen.

Ich habe allerdings keine Ahnung wie das mit Autoit geht.

Hier ist die Lösung doch schon ^^
Ergänzung ()

Eine kleine Lernaufgabe für dich samt Lösung:

Code:
_Rundos ("subst R: Beispiel\Ordner\Unterordner")

Das hier muss als Befehl eingefügt werden, um einen Ordner als lokales Laufwerk zu mappen.
Einem Programm sollte es herzlich egal sein ob das Zugriffslaufwerk ein lokales oder eines im Netz ist. Hauptsache der Pfad passt.

Um das Laufwerk dann wieder zu dismounten musst du folgenden befehl einbauen oder den Rechner neu starten:

Code:
_Rundos ("subst R: /D")


Wenn du noch mehr darüber wissen willst, ruf doch einmal die Windows-Konsole (cmd.exe) auf und gebe hier "subst /?" ein.
 
Ha klingt gut, _Rundos .... in Verbindung mit subst, daran bin ich bei AutoIt gescheitert.
Netzlaufwerke kann ich so lassen, die lokalen verbinde un dtrenne ich dann via Rundos - subst in Autoit.
Ich hoffe, ich schaffs heute noch (Schreibtisch ist ZU voll....................). Melde mich, wenn ichs eingepflegt und getestet hab.

edit, weils keine Ruhe läßt...

RunWait(@ComSpec & " /c subst R: C:\_Server_Daten")

so klappts lokal.
Trennen geht auch.
Jetzt muss ich das ganze Proggi nochmal umschreiben und die Buttons neu zuweisen, daber jetzt rufen wirklich erstmal andere Projekte ...
Monster Dickes Danke @Gabbadom und auch alle anderen Helfenden !
Problem prinzipiell gelöst. :D
Für den Spaßfaktor: mal sehen, ob ich da auch so schöne Prüfroutienen hinbekomme wie bei Drivemapadd Zeilen.
 
Zuletzt bearbeitet:
So, bzgl dieser Aufgabe um es ordentlich abzuschließen das Resultat:
__________________________________________________________
Code:
#NoTrayIcon	
#include <GUIConstantsEx.au3>

GUICreate("Laufwerke ändern", 370, 200)

$verbindenl = GUICtrlCreateButton("lokal", 10, 150, 100, 35)
$verbindenn = GUICtrlCreateButton("Server", 130, 150, 100, 35)
$ende 		= GUICtrlCreateButton("Ende", 250, 150, 100, 35)

GUICtrlCreateLabel (" +   Dieses Programm ändert die Pfade der Laufwerke  R: und S:.   + ", 10, 10)
GUICtrlCreateLabel ("Prj. zuvor einmal im Netz öffnen -> keine lokalen Datenpfade (kein C:\...)" , 10, 35)
GUICtrlCreateLabel ("Vor der Umstellung sind immer alle Projekte zu schließen!" , 10, 50)
GUICtrlCreateLabel ("""lokal"" verbindet R: und S: mit dem lokalen Projektverzeichniss", 10, 80)
GUICtrlCreateLabel ("""Server"" verbindet  R: und S: mit dem Büroserver", 10, 100)
GUICtrlCreateLabel ("""Ende"" hab ich vergessen, testet selbst :) ", 10, 120)

GUISetState()

Do
	$msg = GUIGetMsg()

		Select

			Case $msg = $verbindenl
				  DriveMapDel("S:")
				  Sleep(500) ;0,5 seconds
				  DriveMapDel("R:")
				  Sleep(500) ;0,5 seconds
				  RunWait(@ComSpec & " /c subst S: C:\_Server_Daten\CAD")
				  Sleep(500) ;0,5 seconds
				  RunWait(@ComSpec & " /c subst R: C:\_Server_Daten")
				  MsgBox (64, "LW-Info", "Die Laufwerke ""R:"" und ""S:"" wurden lokal verbunden")
				  Exit
			Case $msg = $verbindenn
				  RunWait(@ComSpec & " /c " & "subst S: /D")
				  Sleep(500) ;0,5 seconds
				  RunWait(@ComSpec & " /c " & "subst R: /D")
				  Sleep(500) ;0,5 seconds
				  DriveMapAdd("S:", "\\SRV\Daten\CAD", 1)
				  Sleep(500) ;0,5 seconds
				  DriveMapAdd("R:", "\\SRV\Daten", 1)
				  MsgBox (64, "LW-Info", "Die Laufwerke ""R:"" und ""S:"" wurden mit dem Server verbunden")
				  Exit
		EndSelect	
Until $msg = -3 or $msg = $ende
Exit


Die Meldungen werden hier zwar ohne Prüfung einfach ausgegeben, aber das ist für die benötigten Zwecke ausreichend.
Geht super fix, funktioniert tadellos und ist auf User-Minimal-klickaufwand ausgelegt.

Auf zur nächsten Herausforderung! Vielen Dank für´s Helfen!

Bin schon über die nächste Optimierungsarbeit gestolpert. Aber ich vermute, das wird komplizierter.
Jetzt möchte ich in einfachen Asci-Dateien bestimmt Felder durch bestimmte andere Felder Zeile für Zeile ersetzen.
@Gabbadome, darf ich dich diesbezüglich mal anschreiben ?
 
Zuletzt bearbeitet:
Sind noch kleinere Programmierfehler drin, schon sehr gut allerdings.

1. "Sleep" brauchst du hier nicht, da er nach jedem Befehl wartet, bis dieser ausgeführt wurde (du nutzt doch schon extra "RunWait") .
2. Die Fehleranalyse und dessen Behebung wirst du schnell vermissen wenn etwas schief geht und beim Kunden sieht das dann schon etwas merkwürdig aus.
3. Finde ich gut, dass du "@ComSpec" benutzt
4. "Exit" in einer Schleife als allein stehende Operation zu benutzen ist gegen die Grundidee einer Schleife. Sie soll ja so lange laufen, bis die Laufbedigung ("Until ...") nicht mehr gegeben ist. Also dann doch lieber den "Ende-Knopf" oder das "x" nutzen. Du kannst vor dem Aufruf der "MsgBox" ein "Exit" schreiben, dann schließt das Programm sobald das Fenster weg gedrückt wird. Noch schöner wäre eine "If"-Abfrage ;)

Sonst sieht es doch recht stabil aus.

Natürlich kannst du mich auch gerne anschreiben. Ich bin ja nicht umsonst hier im Forum :daumen:

Hier nochmal der Code (du solltest hier im Forum auch die "Code"-Funktion nutzen und dein Programmcode sortiert halten!):
Code:
#NoTrayIcon
#include <GUIConstantsEx.au3>

GUICreate("Laufwerke ändern", 370, 200)

$verbindenl = GUICtrlCreateButton("lokal", 10, 150, 100, 35)
$verbindens = GUICtrlCreateButton("Server", 130, 150, 100, 35)
$ende 		= GUICtrlCreateButton("Ende", 250, 150, 100, 35)

GUICtrlCreateLabel (" + Dieses Programm ändert die Pfade der Laufwerke R: und S:. + ", 10, 10)
GUICtrlCreateLabel ("Prj. zuvor einmal im Netz öffnen -> keine lokalen Datenpfade (kein C:\...)" , 10, 35)
GUICtrlCreateLabel ("Vor der Umstellung sind immer alle Projekte zu schließen!" , 10, 50)
GUICtrlCreateLabel ("""lokal"" verbindet R: und S: mit dem lokalen Projektverzeichniss", 10, 80)
GUICtrlCreateLabel ("""Server"" verbindet R: und S: mit dem Büroserver", 10, 100)
GUICtrlCreateLabel ("""Ende"" hab ich vergessen, testet selbst ", 10, 120)

GUISetState()

Do
	$msg = GUIGetMsg()

		Select

			Case $msg = $verbindenl
		
				DriveMapDel("S:")

				DriveMapDel("R:")

				RunWait(@ComSpec & " /c subst S: C:\_Server_Daten\CAD")

				RunWait(@ComSpec & " /c subst R: C:\_Server_Daten")
				
				MsgBox (64, "LW-Info", "Die Laufwerke ""R:"" und ""S:"" wurden lokal verbunden")
		
			Case $msg = $verbindens
		
				RunWait(@ComSpec & " /c " & "subst S: /D")
		
				RunWait(@ComSpec & " /c " & "subst R: /D")
		
				DriveMapAdd("S:", "\\SRV\Daten\CAD", 1)
		
				DriveMapAdd("R:", "\\SRV\Daten", 1)
				
				MsgBox (64, "LW-Info", "Die Laufwerke ""R:"" und ""S:"" wurden mit dem Server verbunden")
		
		EndSelect
	
Until $msg = -3 or $msg = $ende

Exit
 
Ha, das mit der Codefunktion ist Neuland für mich, aber habs oben hinbekommen. War keine böse Absicht, danke für den Hinweis :D.
zu 1.)Die Sleeps hatte ich drinn, da er sich ja ab und an zeitlich überschlagen hatte, mit dem Trennen und Verbinden auf einen Knopfdruck.
zu 2.)Zu nem Kunden geht so was nicht. Nicht´s, von dem was ich tue ist zur Herausgabe (so zu sagen) gedacht. Es sind einfache Arbeitsoptimierungen hier im Büro inkl. Wissensmehrung auf meiner Seite. Da ohne die Laufwerke eh nichts geht, kann auch nichts schiefgehen.
zu 3.)@ComSpec ist der Weg, mit dem ich es hinbekommen hab. :D
zu4.) Das exit habe ich eingefügt, dass man das PRogramm nicht noch schließen muss. Das kann es nach ausführung ja alleine.
Dein Vorschlag, das an die Textnachricht zu hängen, und nicht separat stehen zu lassen ist mir aber auch sehr sympatisch.

Mein neues Projekt:

Änderungen/Ersetzungen in asci-Dateien, wenn es sich denn so umsetzen lassen sollte...
Der Hintergrund: etliche verschiedene Asci-datein, welche Koordinaten etc. enthalten mit unterschiedlichen Formaten auf ein gemeinsames Format schieben.
Wenn ich das einmal mit (viel) Hilfe hinbekomme, solle ich das für andere leicht abgewandelte Formate, alleine schaffen.
Das Ganze wieder in ner kleinen GUI, die krieg ich schon hin!

vorher:
test.www
Zeilenstruktur:
"--ijklmnop253101 xyz abcd420.352 efgh393.499 "" "



via Autoit Programm:
Code:
Schaltfläche [www zu yyy umsetzen] (später ev. noch andere Button´s mit anderen Umsetzungen)
öffne *.www Datei (entweder im selben Verzeichniss, oder besser noch aus einem Auswahlbaum)
            
mehrfache "unabhängige" Umsetzungen:
ersetze "-" durch " "  (Leerzeichen), sollte generell durch die ganze Datei gehen

dann Zeilenweise
            für Zeile 1 bis Ende
            gehe in Zeile 1
            ersetze den Wert an der 3.-8. Stelle durch ein "+"
            ersetze den Wert an der 9. Stelle durch den Wert an der 25.Stelle
            ersetze den Wert an der 10. Stelle durch den Wert an der 26.Stelle
            ab in die nächste Zeile
            ende, wenn die Datei durch ist

schreibe das Ergebniss in Datei *.yyy im selben Verzeichniss wie die Ausgangsdatei (oder fülle die Datei *.yyy parallel mit den Daten, wobei er dann alle restlichen Daten 1:1 übernehmen müsste. Vermutlich wird es so was wie speichere *.www als *.xxx und dann editiere in xxx)    
Exit- Button

nachher:
test.yyy
Zeilenstruktur:
" ++++++dh253101 xyz abcd420.352 efgh393.499 "" "


Die test.www kann gerne erhalten bleiben.

Momentan mache ich so etwas laufend per Hand mit einem Spalteneditor (Notepad++).
Es geht mir natürlich auch darum, diese bescheiden interessante Handarbeit abzustellen.
Hauptsächlich beschäftigt mich dergleichen immer mal wieder in leicht abgewandelten Formen (Dateiumstellungen) und ich habe dafür noch nie eine
"generelle" Umsetztungslösung gefunden. Notepad + Exel (2000ender) helfen zwar hier und da zu erleichtern, aber jedesmal mach ich da alles von vorn.
Anderes Format ? Pech, wieder neu ... Mein Wunsch ist, das ich ähnlich wie mit den Laufwerksbuchstaben mein Wissen diesbezüglich erweitern kann und
in Zukuft alleine in der Lage bin, derartige Umsetzungen umzusetzen :). Ein großes Ziel in weiter Ferne ...
Ist es sinnvoll, so an meine Problemstellung heranzugehen? Oder gibts bessere Wege?
 
Zuletzt bearbeitet:
Ach stimmt wenn du die Sicherheitsabfragen von mir dazwischen raus nimmst, dann verschluckt er sich hin und wieder. Hab ich so jetzt nicht dran gedacht ;)

Zu deinem Problem: Das lässt sich sogar sehr leicht lösen. Ich gebe dir mal eine Funktion mit auf den Weg und den Rest solltest du alleine schaffen. Solltest du mal Fragen zu einem Befehl haben, einfach einmal mit der Maus "in den Befehl" klicken und F1 drücken. Ein Beispiel folgt dann auch immer. Der besagte Befehl: "StringInStr".
Nun gut doch noch ein zweiter Hinweis, da man AutoIt doch schon ein wenig besser kennen muss hierfür: StringTrimLeft

Unter http://autoit.de wird dir sonst auch immer gerne geholfen. Hier die Suchfunktion zu nutzen führt auch meist zur Lösung ;)
 
Nach nem ganzen Tag dran arbeiten (nicht lachen ... ):

Code:
#NoTrayIcon	
#include <GUIConstantsEx.au3>	

GUICreate("Daten umwandeln", 370, 200)

$alte		= GUICtrlCreateButton("alt ein", 10, 150, 100, 35)  ; alt einlesen ( 3abcd efgh, Pkt.-Nr."3abcdefghX12345"  Koord. mit 3 = NAS)
$altzuneu	= GUICtrlCreateButton("alt zu neu", 130, 150, 100, 35) ; alt zu neu ändern ( 3abcd efgh, Pkt.-Nr."       dhX12345" Koord. ohne 3 = AD)
$ende		= GUICtrlCreateButton("Ende", 250, 150, 100, 35)

GUICtrlCreateLabel (" +   Dieses Programm ändert Koordinatendateien   + ", 10, 10)
GUICtrlCreateLabel ("Beschreibung" , 10, 35)
GUICtrlCreateLabel ("Beschreibung" , 10, 50)
GUICtrlCreateLabel ("""alt ein"" wählt Quelldatei im alt Format", 10, 80)
GUICtrlCreateLabel ("""alt zu neu"" schreibt um zu neu", 10, 100)
GUICtrlCreateLabel ("""Ende"" hab ich vergessen, testet selbst :)", 10, 120)

GUISetState()			;~ aktiviert das GUI (macht es sichtbar)

Do	;~ Anfang einer Schleife, Bedingung folgt weiter unten
	$msg = GUIGetMsg()	;~ merkt sich den gedrückten Knopf

	  Select

			Case $msg = $alte		;~ Ereignis 21, der Knopf "alt-ein" wird gedrückt 
			   Local $message = "Quelldatei wählen (NAS-Format)."

			   Local $avar = FileOpenDialog($message,  "S:\", "2013 (*.alt;*.123)", 1 + 4)

			   If @error Then
				  MsgBox(4096, "", "Keine Datei(en) ausgewählt")
				  Else
				  $avar = StringReplace($avar, "|", @CRLF)
				  MsgBox(4096, "", "Es wurde(n) " & $avar & " ausgewählt")
			   EndIf
; ab hier hakts, siehe Aufgabenstellung ... :(
			Case $msg = $altzuneu	;~ Ereignis 21, der Knopf "alt zu neu" wird gedrückt
			   Local $file = FileOpen("$avar", 0)
			   If $file = -1 Then	; Prüfen, ob Datei eingelesen wurde
				  MsgBox(0, "Fehler", "Die Datei konnte nicht geöffnet werden.")
				  Exit
			   EndIf
			   While 1	; Zeilen des Textes einlesen bis EOF
				  Local $line = FileReadLine($file)
				  If @error = -1 Then ExitLoop
				  MsgBox(0, "Zeile gelesen:", $line)
			   WEnd
			   FileClose($file)
			   
	  EndSelect			;~ Beende das Auswahlverfahren
Until $msg = -3 or $msg = $ende	
Exit

Suchen hilft mir leider zu wenig weiter. Werde mich demnächst wohl mal bei Autoit anmelden. Da fehlt mir noch ein schönes Stück Basiswissen...
Generell hab ich 2 Wege entdecken können. Zum einen, das direkte ersetzen, zum anderen die Einbindung von Exel, worin dann die Umstellung vollzogen wird. Mir wäre der erste Weg, ohne Exel lieber. Das müsst ich jetzt wohl in den 2. Button integrieren.
 
Zurück
Oben