2017-06-28 2 views
2

Hallo allerseits erstes Mal Posting, Suche einer Überprüfung einer Batch-Datei, die ich nicht richtig an der Arbeit kann:Systemfehler 53 bei der Montage eines Netzlaufwerkes

@echo Mounting ServerName as local drive 
net use M: \\ServerName\"R Share" 
@echo Clearing IE Cache 
taskkill /im iexplore.exe /f 
M:\"R Share"\PSExec\psexec.exe -l c:\windows\system32\RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 32 
@echo Removing ServerName 
@net use M: /delete 
@echo IE Cleared 
@pause 

Der Punkt des Skripts zu montieren eine Freigabe als Laufwerk, schließen Sie alle geöffneten IE-Fenster, führen Sie dann psexec aus, um die gespeicherten IE-Anmeldeinformationen zu löschen, und trennen Sie dann das Laufwerk. Ich laufe immer wieder in einen Systemfehler 53, wenn ich versuche, das Laufwerk zu initialisieren und sicherstellen möchte, dass ich nichts in meinem Code verpasse. Ich habe versucht, das Laufwerk unter Verwendung des Namens und der IP-Adresse des Rechners zu mounten und so oder so liefere ich immer noch den SysError 53, obwohl die Freigabe im Explorer erreichbar ist. Vielen Dank für Ihre Hilfe. P.S. Ich habe auch versucht, PSExec direkt vom Netzwerk-Speicherort

+0

Nach 'net verwenden M: \\ ServerName \" R Share "' in einem _cmd_ Fenster erscheint das Laufwerk in _explorer_? Nach "net use M:/delete" verschwindet es? Wenn das obige Verfahren wiederholt wird, ist das Ergebnis dasselbe? Auch der Fehler ist es reproduzierbar? Was passiert, wenn 'psexec' direkt von einem entfernten Ort ausgeführt wird? – CristiFati

+0

Funktioniert 'pushd \\ ServerName \" R Share "? – SomethingDark

+1

Kostenlose Antwort: Wenn Sie 'M:' auf '\\ ServerName \" R Share "' dann sollten Sie versuchen, 'M: \ PSExec \ psexec.exe 'auszuführen – Compo

Antwort

0

Es ist falsch, nur einen Teil einer Argument-Zeichenfolge in Anführungszeichen um ein Leerzeichen oder eines der Zeichen &()[]{}^=;!'+,`~|<> enthalten. Die letzten 3 Zeichen können nicht in einem Datei-/Ordnernamen verwendet werden, nur in anderen Argument-Strings.

Windows-Befehlsinterpreter bzw. der Startup-Code der ausführbaren Datei (= Code der ausführbaren Datei vor main Parsen der Befehlszeile) muss eine Menge zusätzlicher Arbeit leisten, um automatisch eine falsche Zeichenfolge in Anführungszeichen zu korrigieren, wenn der Startcode der ausführbaren Datei dies tut eine Autokorrektur überhaupt.

Siehe Antwort auf batch file: list rar file in specific folder and write result into text file und antwort auf How to set environment variables with spaces? für Details zu was passieren könnte, falsch double eine Argument-String zitiert.

So falsch ist:

net use M: \\ServerName\"R Share" 

Richtig ist:

net use M: "\\ServerName\R Share" 

Argument 0 ist net, Argument 1 ist use, Argument 2 ist M: und Argument 3 "\\ServerName\R Share".

net.exe hat jedoch einen Startup-Code, der \\ServerName\"R Share" mit automatischer Korrektur als \\ServerName\R Share interpretiert. Dies ist also nicht der Codierungsfehler, der zu der Nachricht des Systemfehlers 53 führt.

Systemfehler 53 wird durch \\ServerName\R Share Zuordnung verursacht Brief zu fahren M: und mit weiter:

M:\"R Share"\PSExec\psexec.exe 

Der Anteil R Share ist bereits in M: enthalten. So ist die richtige Linie wäre:

"M:\PSExec\psexec.exe" 

Der gesamte Batch Code mit Korrekturen angewandt:

@echo off 
echo Mounting ServerName as local drive 
%SystemRoot%\System32\net.exe use M: "\\ServerName\R Share" 
echo Clearing IE Cache 
%SystemRoot%\System32\taskkill.exe /im iexplore.exe /f 
"M:\PSExec\psexec.exe" -l c:\windows\system32\RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 32 
echo Removing ServerName 
%SystemRoot%\System32\net.exe use M: /delete 
echo IE Cleared 
pause 

Es ist besser ausführbare Dateien im Systemverzeichnis von Windows mit vollständigem Pfad angeben und mit der Dateierweiterung, weil dann auf Windows Der Befehlsinterpreter darf nicht nach diesen ausführbaren Dateien mit lokalen Umgebungsvariablen suchen PATH und PATHEXT.Eine Batch-Datei, so viel wie möglich unabhängig zu aktuellen Werten dieser beiden Umgebungsvariablen ist eine Batchdatei arbeitet beispielsweise auch, siehe falsch aktualisiert PATH System ist Why does the command "Timeout" in a batch file suddenly not work anymore?

könnte Dieser Batch Code mit dem Befehl PUSHD optimiert werden, die den aktuellen Verzeichnispfad auf dem Stapel verschiebt und das angegebene Verzeichnis als aktuelles Verzeichnis setzt, wobei bei aktivierten Befehlserweiterungen ein UNC-Pfad automatisch dem nächsten freien Laufwerksbuchstaben zugeordnet wird. Befehlserweiterungen sind standardmäßig aktiviert, aber es ist natürlich möglich, sie explizit für die Sicherheit zu aktivieren. Der Befehl POPD entfernt das durch PUSHD vorgenommene Mapping und setzt das aktuelle Verzeichnis zurück in das Verzeichnis, das zuvor auf den Stapel geschoben wurde.

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 
pushd "\\ServerName\R Share" 
%SystemRoot%\System32\taskkill.exe /im iexplore.exe /f 
echo Current directory is: %CD% 
PSExec\psexec.exe -l c:\windows\system32\RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 32 
popd 
echo IE Cleared 
endlocal 
pause 

Hinweis:PUSHD und POPD kann nicht verwendet werden, wenn Benutzername und/oder Passwort muss auch auf der Kommandozeile verwendet werden, erfolgreich zu einem Laufwerksbuchstaben der Netzwerkfreigabe zu verbinden und den Zugriff auf die Verzeichnisse und Dateien auf dieser Freigabe, da die Stapeldatei mit einem Benutzerkonto ausgeführt wird, das keinen Zugriff auf die Netzwerkfreigabe benötigt.

Hinweise in Bezug auf Beenden gegen IE Tötung

denke ich TASKKILL ohne /f verwenden würde hier besser sein. Internet Explorer sollte nicht vom Betriebssystem gelöscht werden, wie bei Verwendung der Option /F. Es wäre besser, TASKKILL ohne /f zu verwenden, was dazu führt, dass IE die Ereignismeldung sendet, um sich zu schließen/zu beenden/zu beenden, die IE normalerweise verarbeitet und sich selbst anmutig beendet. Natürlich sollte eine Verzögerung von ungefähr 1 bis 2 Sekunden hinzugefügt werden, bevor der nächste Befehl ausgeführt wird, um dem IE die notwendige Zeit zu geben, um sich selbst ordentlich zu beenden.

Die optimale Lösung wäre mit TASKKILL ohne /f sein, die WM_CLOSE Nachricht an IE zu senden, 1 oder 2 Sekunden warten, überprüfen Sie mit TASKLIST wenn IE wirklich TASKKILL mit /f beendet und sonst nicht töten verwenden reagiert IE Prozess vom Betriebssystem.

Und zuletzt ist es möglich, dass mehrere Instanzen von Internet Explorer ausgeführt werden und daher wäre es besser, TASKLIST zu verwenden, um die Prozess-ID (PID) jede mit Internet Explorer-Instanz zu erhalten, wenn es eine IE-Instanz läuft an alle, TASKKILL ohne /F auf jede ausgeführte Instanz von IE PID verwenden, prüfen Sie nach 1 bis 2 Sekunden mit TASKLIST wenn alle Instanzen von IE ordnungsgemäß beendet und im Fall von 1 oder mehr Instanzen von IE sind immer noch Verwendung TASKKILL läuft mit /F, um die verbleibenden IE-Instanzen zu beenden, die in den 1 bis 2 Sekunden nicht mit der Beendigung selbst reagieren.