2016-07-29 1 views
-3

J'utilise la méthode Shell CopyHere de Windows pour décompresser les archives dans certains lots. Il fonctionne généralement, comme indiqué dans l'exemple de script ci-dessous, mais donne une erreur dans certains cas. En particulier, j'ai trouvé qu'il donne une erreur lors de décompresser une archive dans un dossier système spécial comme Téléchargements, si elle a été déplacée par un utilisateur à un nouvel emplacement, malgré le dossier symlink a été laissé par OS dans son emplacement par défaut dans le profil utilisateur et l'utilisateur dispose d'autorisations d'écriture pour le nouvel emplacement. Existe-t-il un moyen de contourner cette limitation ou de modifier le code ci-dessous sans modifier son approche hybride globale par lots?La méthode Shell CopyHere de Windows prend-elle en charge la redirection?

<!-- : 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 Pourquoi pensez-vous que Shell tag ne concerne pas à ma question, si elle demande directement sur le Méthode Shell utilisée dans le lot? OMI est un exemple typique de modification mineure inutile interdite par les règles SO faites pour justifier downvote sans aucune tentative de répondre à la question. – sambul35

+0

Le lot est un hybride, les pls ne suppriment pas l'étiquette de la méthode Shell. Malheureusement, toute balise liée à l'utilisation des méthodes shell est tronquée à Shell par le site. – sambul35

+1

La balise 'shell' est utilisée pour les shells Unix/Linux/POSIX, pas pour Windows. Il suffit de lire la description de l'étiquette. – Dummy00001

Répondre

0

Il semble que la méthode CopyHere ne prenne pas en charge la redirection de chemin de dossier spécial. Si un utilisateur a changé l'emplacement d'un dossier spécial Windows répertoriés dans le document Enumerating Special Folders comme Mes documents, une construction simple VBS permettrait de trouver le dossier actuel et le chemin du fichier:

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

Sinon, VBS ne fournit aucune méthode pour trouver le chemin du dossier spécial actuel. La seule façon que j'ai trouvé pour l'obtenir dans un lot hybride & Script VBS est en interrogeant la clé de Registre HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Dossiers Shell. Le chemin actuel du fichier .zip est alors envoyé sous la forme cscript en utilisant le script en question.

Par exemple, si archive.zip à décompressé en cours Téléchargements dossier:

@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