Window的Shell CopyHere方法是否支持重定向?

时间:2016-07-29 12:55:59

标签: windows batch-file unzip windows-shell

我使用Window的Shell CopyHere方法在一些批次中解压缩档案。它通常有效,如下面的脚本示例所示,但在某些情况下会出错。特别是,我发现在将存档解压缩到特殊系统文件夹(例如下载)时会出现错误,如果用户将其移动到新位置,尽管文件夹符号链接

有没有办法解决这个限制或修改下面的代码而不改变其整体批处理混合方法?

<!-- : 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(...)'

1 个答案:

答案 0 :(得分:0)

看来CopyHere方法不支持特殊文件夹路径重定向。如果用户更改了{{3>}文档中列出的特殊Windows文件夹(如我的文档)的位置,则可以使用简单的VBS结构查找当前文件夹和文件路径:

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

否则,VBS不提供任何方法来查找当前的特殊文件夹路径。我发现在混合批次中获得它的唯一方法是VBS脚本是通过查询注册表项 HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Shell Folders 来实现的。然后使用相关脚本将当前.zip文件路径作为 cscript 参数发送。

例如,如果 archive.zip 要解压缩到当前 Downloads 文件夹:

@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