2017-07-26 94 views
1

所以我创建一个批处理文件到选定文件夹的路径存储到一个文本文件中提及它后面使用另一个批处理脚本...%〜1%和1自动第一个空间后删除一切

我创建了注册表项以包含任何触发此特定批处理文件的文件夹的右键单击上下文菜单。

基本上当你右键单击一个文件夹,然后单击“发送到脚本”它应该复制右键单击的文件夹的整个路径/位置。

要做到这一点,我使用下面的命令:

SET TargetDir=%~1

我用%1也试过,我使用带分隔符

FOR /f "delims=;" %%a in ("%~1") do (
    @echo %%a 
) 

问题是下面的代码也尝试CMD自动修剪第一个空格后的所有内容,并且由于这是我正在复制的路径,因此我想保留所有空格和路径,原因是

Ex。如果我使用的文件夹上的命令如“C:/文件夹/子文件夹” copyng正确完成但如果我使用该命令上的文件夹如“C:/文件夹/子文件夹”复制是不正确的,只会给我“C:/文件夹/子”删除检测到第一个空格后发现的所有其余部分。

注册表项

[HKEY_CLASSES_ROOT\Directory\shell\send-to-script] 
"MUIVerb"="Send To Script" 
"SubCommands"="sendscript" 


[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\sendscript] 
@="Send To Script" 

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\sendscript\command] 
@="C:\\scripts\\pathtotext.bat %1" 

感谢您的帮助

+2

请显示您的注册表项。也许你只需要在'%1'附近添加引号'' – jeb

回答

2

你应该改变你的注册表键[...\sendscript\command]

@="C:\\temp\\blob.bat \"%1\"" 

而在你批你应该使用

REM The DisableDelayedExpansion is for preserve "!" in path names 
setlocal DisableDelayedExpansion 
SET "TargetDir=%~1" 

setlocal EnableDelayedExpansion 
(
    echo target is !TargetDir! 
) > C:\scripts\target.log 

if "reseverdFolder" == "!TargetDir!" echo This folder is reserved 
+0

尝试了但仍然得到相同的错误>>文件夹== xC:\ folder \ sub在这个时候是意外的。 – Eric

+1

@Eric正如所说,没有显示你的代码,我只能说你的代码中有一个bug – jeb

+0

刚刚解决它,你的解决方案是好的@jeb和事实上它的工作原理。我只是缺少一对双引号“”导致字符串未被包装,所以批处理文件打破了空格......但总体而言,您的注册表项修改和批处理代码起到了魅力的作用。谢谢 ! – Eric

1
SET "TargetDir=%*" 

因为显然正在提供的参数是C:\folder\sub folder然后%~1只选择什么cmd看到两个参数,第一个提供的参数。

%*的意思是“整条尾巴”

echo荷兰国际集团%*应该表现出你到底是什么cmd是看到。

+3

'%〜*'会抛出一个错误,删除代字号'%*' – jeb

+0

首先感谢您的快速回复...... *似乎在做没有〜所以我使用了SET“TargetDir =%*”而没有〜,我可以看到带有空格的完整路径,当我回显它时,由于路径中的空间与批处理一样,似乎正在发生某种错误脚本正在退出,下一步是将变量保存到文本文件中。只有当路径有空格时它才会退出。另一方面,如果没有空格,路径将被复制到文本文件...再次感谢您的帮助;) – Eric

+0

我得到的错误是>> 文件夹== xC:\ folder \ sub是在这个时候意外。 – Eric

2

批处理文件是不正确的注册。例如外观与注册表编辑器上的注册表键的值:

HKEY_CLASSES_ROOT\rtffile\shell\open\command 

该值显示为:

"%ProgramFiles%\Windows NT\Accessories\WORDPAD.EXE" "%1" 

因此有两个论据都包含在双引号:

  1. 参数是使用完整路径,文件名和文件扩展名运行的应用程序离子括在双引号中,因为路径包含空格字符。

  2. 参数是%1通过Windows资源管理器的完整路径,文件名和文件扩展,它当然也可以包含空格或任何字符&()[]{}^=;!'+,`~的这需要还附上通过引用的RTF文件的名称使用双引号引起的整个参数为cmd.exe,在上一个帮助页面的cmd /?上的命令提示符窗口中运行它。

使您在使用导入到注册表的* .reg文件需要:

@="\"C:\\scripts\\pathtotext.bat\" \"%1\"" 

此字符串值显示在注册表编辑器:

"C:\scripts\pathtotext.bat" "%1" 

然后你可以在批处理文件中使用%1%~1,如命令的帮助所解释的CALL输出在命令提示符窗口中运行执行call /?

+0

感谢这样的信息@Mofi。真的很有帮助,因为我在reg中搞了一些东西,导致显然不匹配批处理 – Eric