如何通过资源管理器中的右键菜单项使用批处理文件创建文件夹或文件的虚拟副本?

问题描述 投票:0回答:1

因此,我想右键单击一个文件夹并使用 0 字节文件创建该文件夹的虚拟副本。我使用 robocopy 命令如下:

对于文件夹:

Robocopy /Create /Purge /S "%cd%" "%cd% Dummy"
Pause

对于文件:

Robocopy /Create /Purge "%cd%" "%cd%/Dummy"
pause

我用上面的命令行创建了两个批处理文件

folders.bat
files.bat
,将它们放入文件夹
C:\com
并将它们添加到注册表中,以便将其放在任何文件夹和任何文件的右键菜单中。

对于

HKEY_CLASSES_ROOT\Directory\shell\Dummy\command
中的文件夹作为
(Default)
类型值
REG_SZ
:

"C:\com\folders.bat" "%1"

所以,现在的问题是该文件夹的批处理文件创建了包含所有子文件夹和文件的父文件夹的虚拟文件 文件的批处理文件将文件夹中所有文件的虚拟文件创建到同一文件夹中的虚拟文件夹中。

如果我打开命令提示符并从命令提示符运行批处理文件,效果很好。

请使用 windows 检查此图像,通过资源管理器上下文菜单在文件和文件夹上运行批处理文件以及它们在注册表中的注册

batch-file command-prompt robocopy
1个回答
0
投票
注册表中的

"%1"
是用双引号括起来的右键单击文件/文件夹名称的占位符。您的批处理文件引用动态变量
CD
%CD%
扩展为 当前目录 的完整路径,不以反斜杠结尾,除非当前目录是驱动器的根目录。批处理文件应引用由
explorer.exe
作为最后一个参数字符串传递给注册批处理文件的文件/文件夹名称(在使用选项
%ComSpec%
启动
/C
时)以及用于处理适当的注册批处理文件的注册批处理文件名。

可以使用单个批处理文件

C:\com\CreateDummy.cmd
,并带有以下注释代码:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem Is the batch file called without any argument string
rem or with an empty string as first argument string?
rem Yes, exit the batch file processing as nothing to do.
if "%~1" == "" exit /B
rem Is the batch file called with the name of an existing folder?
if exist "%~1\" goto Folder
rem Is the batch file called with a string NOT referencing an existing file?
if not exist "%~1" exit /B

rem The batch file is called with the name of an existing file.
rem Create a subdirectory with name Dummy in the directory of the existing
rem file and create in subdirectory Dummy a zero byte file for each file in
rem the directory of the existing file and then exit the batch processing.
rem %~dp1 expands to fully directory path of the existing file always ending
rem with a backslash which must be considered here for the correct syntax.
%SystemRoot%\System32\robocopy.exe "%~dp1\" "%~dp1Dummy" /Create /Purge /NDL /NFL /NJH /NJS
exit /B

:Folder
rem ROBOCOPY interprets a backslash left to a backslash or a double quote
rem character as escape character for the following \ or " which must be
rem considered on processing a folder of which name ends already with a
rem backslash. Get the fully directory path of the passed folder without
rem a backslash at the end.
for %%I in ("%~1\.") do set "SourceFolder=%%~fI" & set "DestinationFolder=%%~fI Dummy"
rem The root directory of a drive ends always with a backslash. There must
rem be appended an additional backslash on drive letter, colon and backslash
rem for source path for ROBOCOPY and the destination directory path is in
rem this special case the subdirectory Dummy in the root directory of the
rem drive instead of the existing directory path with a space and Dummy
rem appended for a parallel created Dummy directory as no directory can
rem be created parallel to the root directory of a drive.
if "%SourceFolder:~-1%" == "\" set "SourceFolder=%SourceFolder%\" & set "DestinationFolder=%SourceFolder%Dummy"
rem The source directory path is now either with no backslash at the end or
rem with two backslashes at the end on being the root directory of a drive.
%SystemRoot%\System32\robocopy.exe "%SourceFolder%" "%DestinationFolder%" /Create /Purge /NDL /NFL /NJH /NJS

以命令

rem
开头的行描述了命令行。可以删除 rem 标记,以便更快地处理批处理文件。

批处理文件也适用于大多数但不是所有通过相对路径传递到批处理文件的文件/文件夹名称。 Windows 文件资源管理器 始终将右键单击的文件/文件夹名称与绝对路径传递到 Windows 命令处理器

注册应使用命令行:

C:\Windows\System32\cmd.exe /D /C C:\com\CreateDummy.cmd "%1"

这比仅使用占位符注册批处理文件的执行效率更高

"%1"

要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。

  • call /?
    ...解释
    %1
    %~1
    %~dp1
  • cmd /?
    ...解释了
    cmd
    选项
    /D
    /C
    以及如何通过 Windows 命令处理器 解释所有其他参数字符串,使用右键单击的文件/文件夹名称(包含在
    "
    中)处理指定的批处理文件经过
    explorer.exe
    cmd.exe
    并进一步查看批处理文件。
  • echo /?
  • exit /?
  • for /?
  • goto /?
  • if /?
  • rem /?
  • robocopy /?
  • set /?
  • setlocal /?

使用 Windows 批处理文件的单行多个命令解释了无条件命令运算符

&
,在上面的批处理文件中使用了两次。

还应该阅读有关命名文件、路径和命名空间的 Microsoft 文档。

© www.soinside.com 2019 - 2024. All rights reserved.