从上下文菜单复制文件的父目录路径

时间:2018-07-21 02:57:31

标签: batch-file cmd

我正在学习批处理脚本,因为它对于设置Windows用户选择的获取文件及其父目录路径的快速自定义上下文菜单选项非常有用。

现在我知道以下命令来获取传递的参数作为文件路径并将其复制到剪贴板:

cmd /c (echo.|set /p=""%1"") | clip

但是,为什么在“上下文”菜单中设置以下语法后,语法却无法按预期工作?

cmd /c (echo.|set /p=""%~dp1"") | clip

是可变扩展问题吗?请指导它为什么不起作用以及如何解决它,以使其正确扩展。

注册表项的示例,其中我将永久设置要运行的命令,包括开关,变量扩展等。

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Classes\*\shell\Copy File's Parent Path]
@="Copy File's Parent Path"

[HKEY_CURRENT_USER\Software\Classes\*\shell\Copy File's Parent Path\Command]
@="cmd.exe /c (echo.|set /p=\"\"%~dp1\"\") | clip"

3 个答案:

答案 0 :(得分:2)

%W ,通常保存工作目录的 ,当您右键单击文件时,将成为文件的父级。

因此,您可以尝试以下操作:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Classes\*\shell\HoldParent]
@="Parent to Clipboard"

[HKEY_CURRENT_USER\Software\Classes\*\shell\HoldParent\command]
@="Cmd /C \"Echo %W|Clip\""

您可以将其扩展一些以解决潜在的unicode /字符问题,但通常情况下,应根据需要进行操作。

修改

稍微扩展一下,(不包括换行符),也许:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Classes\*\shell\HoldParent]
@="Parent to Clipboard"

[HKEY_CURRENT_USER\Software\Classes\*\shell\HoldParent\command]
@="Cmd /Q /D /U /C \"Set/P \"=%W\"<Nul|Clip\""

答案 1 :(得分:2)

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Classes\*\shell\Copy Files Path\command]
@="cmd /c (echo. | set /p =\"\"%1\"\") | clip"

[HKEY_CURRENT_USER\Software\Classes\*\shell\Copy Files Parent Path\command]
@="cmd /c (echo. | set /p =\"\"%w\"\") | clip"

%1替换为%w。 2个注册表项来演示 %1Copy Files Path%wCopy Files Parent Path

来自页面底部Extending Shortcut Menus的引用。

%0 or %1  the first file parameter. For example “C:\Users\Eric\Desktop\New Text Document.txt”. Generally this should be in quotes and the applications command line parsing should accept quotes to disambiguate files with spaces in the name and different command line parameters (this is a security best practice and I believe mentioned in MSDN).
%N  (where N is 2 - 9), replace with the nth parameter
%*  replace with all parameters
%~  replace with all parameters starting with and following the second parameter
%d  desktop absolute parsing name of the first parameter (for items that don’t have file system paths)
%h  hotkey value
%i  IDList stored in a shared memory handle is passed here.
%l  long file name form of the first parameter. Note win32 applications will be passed the long file name, win16 applications get the short file name. Specifying %L is preferred as it avoids the need to probe for the application type.
%s  show command
%v  for verbs that are none implies all, if there is no parameter passed this is the working directory
%w  the working directory

答案 2 :(得分:1)

注册表中的变量%1%*%V是占位符,它们将被解析并由Windows Shell组件(Win32 Shell)取代。它们只是碰巧类似于Windows命令处理器(CMD.EXE)在命令提示符下或在批处理文件中使用的变量,但它们之间没有任何关联。

例如带有CMD.EXE %1的实例只能在批处理文件中使用,在命令提示符下或通过/C/K开关作为命令传递时,它没有任何意义。在您的注册表示例中,%1将由Windows Shell而不是CMD.EXE解析,因此您不能在注册表中使用诸如%~dp0%~dp1之类的东西,它们对Windows Shell没有任何意义。 / p>

因此,您必须将%1用CMD.EXE(已被其实际值自动替换),并在FOR循环中对其进行处理,以获得文件的目录路径。

这是实际的命令,将从文件名中提取路径信息:

cmd.exe /e:on /d /s /c "for %%a in ("%1") do @(set /p "=%%~dpa")<nul | clip"

可以在注册表编辑器中按原样输入相应密钥的(default)值,例如:对于当前用户,HKEY_CURRENT_USER\Software\Classes\*\shell\Copy Path to clipboard\Command,对于所有用户,HKEY_CLASSES_ROOT\*\shell\Copy Path to clipboard\Command

以及注册表脚本的字符串:

@="cmd.exe /e:on /d /s /c \"for %%a in (\"%1\") do @(set /p \"=%%~dpa\")<nul | clip\""

示例.REG脚本如下所示:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Classes\*\shell\Copy Path to clipboard\Command]
@="cmd.exe /e:on /d /s /c \"for %%a in (\"%1\") do @(set /p \"=%%~dpa\")<nul | clip\""

当您要传递包含百分比(%)的字符串时,必须通过将它们加倍来转义百分比,这与批处理文件中的操作几乎相同。