%~1和%1在第一个空格

时间:2017-07-26 08:29:04

标签: batch-file cmd

所以我创建了一个批处理文件,用于将选定文件夹的路径存储到文本文件中,以便稍后使用其他批处理脚本引用它...

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

基本上当您右键单击文件夹并单击"发送到脚本"它应该复制右键单击文件夹的整个路径/位置。

为此,我使用以下命令:

SET TargetDir=%~1

我也尝试使用%1,我也尝试使用以下代码和分隔符

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

问题是CMD在第一个空格后自动修剪所有内容,因为这是我正在复制的路径,我想保留所有空格和路径

例如 如果我在文件夹上使用该命令,例如&#34; C:/ folder / subfolder&#34; copyng正确完成但如果我在文件夹上使用该命令,例如&#34; C:/ folder / sub文件夹&#34; ,则复制操作不正确,只会给我 < em>&#34; C:/ folder / sub&#34; 删除检测到第一个空格后找到的所有其余部分。

注册表项

[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"

感谢您的帮助

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

批处理文件未正确注册。例如,使用 regedit 查看注册表项的值:

HKEY_CLASSES_ROOT\rtffile\shell\open\command

该值显示为:

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

所以有两个参数都用双引号括起来:

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

  2. 参数 1 是Windows资源管理器传递的%1引用的RTF文件的名称,包含完整路径,文件名和文件扩展名,当然也可以包含空格或者&()[]{}^=;!'+,`~中的任何字符cmd.exe,在cmd /?上在@="\"C:\\scripts\\pathtotext.bat\" \"%1\"" 的命令提示符窗口中运行它时,需要将整个参数括在双引号中作为输出。

  3. 因此,您需要在用于导入Windows注册表的* .reg文件中:

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

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

    %1

    然后您可以在批处理文件中使用%~1call /?,如命令 CALL 的帮助所解释的那样在执行{{}时在命令提示符窗口中运行1}}。

答案 2 :(得分:1)

SET "TargetDir=%*"

由于显然提供的参数是C:\folder\sub folder,因此%~1仅选择cmd视为两个参数的第一个提供参数。

%*表示“整个尾巴”

echo %* cmd应该明确显示int FinalDays = int.TryParse(dt.Rows[0][0], out FinalDays) ? FinalDays : 0; 正在看到的内容。