2017-07-26 87 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