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

Does Window's Shell CopyHere method support redirection?

我使用Window的Shell CopyHere方法分批解压压缩文件。它通常有效,如下面的脚本示例所示,但在某些情况下会出错。特别是,我发现将存档解压缩到特殊系统文件夹(如 Downloads 时会出错,如果它被用户移动到新位置,尽管文件夹 symlink 由 OS 留在其在用户配置文件中的默认位置,并且用户对新位置具有写入权限。

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

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

CopyHere 方法似乎不支持特殊文件夹路径重定向。如果用户更改了 Enumerating Special Folders 文档中列出的特殊 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