2017-06-18 54 views
3

當我使用註冊表項,如下所示添加到Windows資源管理器右鍵菜單項:運行位於%APPDATA%從上下文菜單.bat文件

[HKEY_CURRENT_USER\SOFTWARE\Classes\*\shell] 
[HKEY_CURRENT_USER\SOFTWARE\Classes\*\shell\Similar Files] 
[HKEY_CURRENT_USER\SOFTWARE\Classes\*\shell\Similar Files\command] 
@="%AppData%\\FindAlike\\AddRightClickFile.bat \"%1\"" 

我得到一個錯誤

Windows cannot access the specified device, path or file. You may not have the appropriate permissions to access the item. 

如果我將文件複製AddRightClickFile.bat到C:\ Windows \ System32下,並更改註冊表項來

[HKEY_CURRENT_USER\SOFTWARE\Classes\*\shell] 
[HKEY_CURRENT_USER\SOFTWARE\Classes\*\shell\Similar Files] 
[HKEY_CURRENT_USER\SOFTWARE\Classes\*\shell\Similar Files\command] 
@="AddRightClickFile.bat \"%1\"" 

沒有錯誤發生。但是,我想將AddRightClickFile.bat存儲在%Appdata%\ FindAlike中。在AddRightClickFile.bat

代碼是

reg add "HKEY_CURRENT_USER\Software\FindAlike" /f /v "TestFilePath" /t REG_SZ /d %1 

有什麼辦法,我可以得到.bat文件,同時將它存儲在%的應用程序數據%的子文件夾,從上下文菜單命令來運行?

編輯

我曾嘗試使用下面的代碼創建代碼中的註冊表項:

RegistryKey rk = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\Classes\*\shell\Similar Files\command"); 
     string sValue = @"%AppData%\FindAlike\AddRightClickFile.bat ""%1"""; 
     rk.SetValue("",sValue, RegistryValueKind.ExpandString); 

,並設置AddRightClickFile.bat如下:

start 
reg add "HKEY_CURRENT_USER\Software\FindAlike" /f /v "RightClickFileName"  /t REG_SZ /d %1 
exit 0 

這項工作確定,但創建在我右鍵單擊的文件目錄中的命令窗口。使用任務管理器查看進程我看到已創建cmd.exe和conhost.exe進程。如果我刪除命令窗口,兩個進程都會消失。有沒有什麼辦法可以自動終止這些進程而不用按名稱殺死它們,這可能會產生不良後果。

回答

3

您的主要問題是%AppData%被保存爲變量引用,但是當讀取註冊表值時,該變量未擴展爲其值。

原因是註冊表項的(default)值有REG_SZ類型。如果要存儲變量引用並自動擴展其值,則需要註冊表鍵爲REG_EXPAND_SZ類型。

所以,你有兩個選擇

  1. 不要使用變量,使用完整路徑。

  2. 更改註冊表項類型。

第一個選項沒有任何問題,但第二個選項不能從regedit完成。在命令行中您可以使用

reg.exe add "HKEY_CURRENT_USER\SOFTWARE\Classes\*\shell\Similar Files\command" /f /ve /t REG_EXPAND_SZ /d "\"%^AppData%\FindAlike\AddRightClickFile.bat\" \"%1\"" 

,或者從一個批處理文件

reg.exe add "HKEY_CURRENT_USER\SOFTWARE\Classes\*\shell\Similar Files\command"^
     /f /ve /t REG_EXPAND_SZ^
     /d "\"%%AppData%%\FindAlike\AddRightClickFile.bat\" \"%%1\"" 

:在兩者之間唯一的區別是變量引用

1

我沒有看到的轉義任何需要在運行時擴展變量的所有,所以我只需輸入命令爲:

在批處理文件中:

@REG ADD "HKCU\Software\Classes\*\shell\Similar Files\command" /VE /D "\"%APPDATA%\FindAlike\AddRightClickFile.bat\" \"%%~1\"" /F>NUL 

從命令提示符:

REG ADD "HKCU\Software\Classes\*\shell\Similar Files\command" /VE /D "\"%APPDATA%\FindAlike\AddRightClickFile.bat\" \"%~1\"" /F>NUL 

[編輯]

如果這是你的AddRightClickFile.bat內把所有那麼你可以只完全文件並輸入信息旁路直接作爲命令運行:

從批處理文件:

@REG ADD "HKCU\Software\Classes\*\shell\Similar Files\command" /VE /D "CMD /C \"REG ADD \"HKCU\Software\FindAlike\" /V \"TestFilePath\" /D \"\\\"%%L\\\"\" /F^>NUL\"" /F>NUL 
+0

我認爲動態擴展的唯一原因是在用戶重新定位配置文件時保持一切正常工作,否則你是對的,這是不需要的。 –

+0

感謝您的一些偉大的建議 - 非常有幫助 – SimonKravis

+0

當我將@Compo建議的字符串添加到註冊表項時,它會嘗試打開我右鍵單擊並選擇了類似文件但不寫入TestFilePath註冊表項的文件 – SimonKravis