2016-07-29 31 views
-3

Ich verwende Windows Shell CopyHere Methode, um Archive in einigen Stapeln zu entpacken. Im Allgemeinen funktioniert es, wie in dem folgenden Skriptbeispiel gezeigt, gibt aber in einigen Fällen einen Fehler. Insbesondere habe ich festgestellt, es gibt einen Fehler beim Entpacken eines Archivs in einen speziellen Systemordner wie Downloads, wenn es von einem Benutzer an einen neuen Speicherort verschoben wurde, trotz der Ordner Symlink wurde von OS in seiner Standardposition in das Benutzerprofil, und der Benutzer hat Schreibberechtigungen für den neuen Standort.Unterstützt die CopyHere-Methode von Windows Shell die Umleitung?

Gibt es eine Möglichkeit, diese Einschränkung zu umgehen oder den folgenden Code zu ändern, ohne den allgemeinen Batch-Hybrid-Ansatz zu ändern?

<!-- : Begin batch script 
@echo off 
set "dir=%temp%" & set "file=%USERPROFILE%\Backup\archive.zip\" 
cscript //nologo "%~f0?.wsf" "%dir%" "%file%" 
exit /b 

----- Begin wsf script ---> 
<job><script language="VBScript"> 
set fso = CreateObject("Scripting.FileSystemObject") 
Set Ag=Wscript.Arguments 
If NOT fso.FolderExists(Ag(0)) Then 
fso.CreateFolder(Ag(0)) 
End If 
set objShell = CreateObject("Shell.Application") 
set FilesInZip = objShell.NameSpace(Ag(1)).items 
objShell.NameSpace(Ag(0)).CopyHere(FilesInZip) 
set fso = Nothing 
set objShell = Nothing 
</script></job> 

:: Error if user profile's Downloads folder was moved from default location 

\test.bat?.wsf(15, 3) Microsoft VBScript runtime error: Object required: 'objShell.NameSpace(...)' 
+0

@ Dummy00001 Warum denken Sie Shell-Tag auf meine Frage nicht relevant ist, wenn es direkt über die fragt Shell-Methode im Stapel verwendet? IMO ist ein typisches Beispiel für unnötige geringfügige Bearbeitung, die durch SO-Regeln verboten ist, die gemacht wurden, um Downvote zu rechtfertigen, ohne dass versucht wird, die Frage zu beantworten. – sambul35

+0

Der Stapel ist ein Hybrid, bitte entfernen Sie das Shell-Tag nicht. Leider wird jedes Tag, das sich auf Shell-Methoden bezieht, vom Site auf das Shell-Tag gekürzt. – sambul35

+1

Das Shell-Tag wird für Unix/Linux/POSIX-Shells verwendet, nicht für Windows. Lesen Sie einfach die Beschreibung des Tags. – Dummy00001

Antwort

0

Es scheint, CopyHere-Methode unterstützt keine spezielle Ordnerpfadumleitung. Wenn ein Benutzer Ort eines speziellen Ordner in den Enumerating Special Folders Dokument wie Eigenen Dateien aufgeführten Windows-geändert, ein einfaches VBS-Konstrukt würde es ermöglichen aktuelle Ordner und Dateipfad zu finden:

set objShell = CreateObject("Shell.Application") 
set objFolder = objShell.Namespace(&H5&) 
set FilesInZip = objShell.NameSpace(Ag(1)).items 
objShell.NameSpace(objFolder).CopyHere(FilesInZip) 

Andernfalls wird VBS nicht bieten Methode, um den aktuellen speziellen Ordnerpfad zu finden. Der einzige Weg, ich fand es in einem Hybrid-Batch & VBS-Skript ist durch Abfragen der Registrierungsschlüssel HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Shell-Ordner. Der aktuelle .zip-Dateipfad wird dann als cscript-Argument mit dem fraglichen Skript gesendet.

Zum Beispiel, wenn archive.zip- Ordner zu aktuellen Downloads dekomprimiert werden:

@echo off 
setlocal EnableDelayedExpansion 
set "key=HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" 
for /f "tokens=* Skip=2" %%g in ('reg query "%key%" 2^>nul') do (
    echo %%g | find /i "Downloads" >nul && for %%o in (%%g) do (
     set "disk=%%o" & if exist "!disk:~0,3!" set dir=%%o)) 
echo !dir! 

K:\Downloads