2012-08-09 31 views
17

我想運行批處理腳本,它需要一個參數(路徑)逃生批輸入內部「雙引號」參數

runas /user:abc "icacls %1 /grant Everyone:(F) /T" 

以下,但參數%1已經包含了"(因爲它是一個路徑,通過上下文菜單的Send To傳遞 - 我沒有太多的控制權)。 所以當命令在批處理腳本運行它運行這樣的:

runas /user:abc "icacls "c:\folder" /grant Everyone:(F) /T" 

所以,很顯然,我需要逃避%1創建的"秒。如何通過%1執行字符串處理以避免引號?

回答

20

你應該能夠使用\"Here是與其他一些轉義字符的網站,你可能會發現有用

要執行字符串替換:

set temp=%1 
set temp=%temp:"=\"% 
echo %temp% 
+0

我已經編輯了更清晰的問題 – laggingreflex 2012-08-09 23:33:54

+5

如果%1是一個包含空格的路徑,該怎麼辦? – 2014-05-14 14:59:18

+0

你什麼時候在''''上面使用'''''我發現真正的批處理文件只能用'''''轉義,而'\''版本只適用於非批處理程序('runas'用C++編寫或者識別\作爲轉義字符的語言)。所以,當傳遞變量到非批處理程序時,我們只使用'\「',當傳遞給其他批處理腳本(或批處理函數(例如'CALL:function」parameterWith「」EscapedQuote「'))時,我們只使用'\」' – 2014-11-19 17:16:08

1
SET myPath=%1 
SET myPath=%myPath:"=\"% 
runas /user:abc "icacls %myPath% /grant Everyone:(F) /T" 

編輯 - 變量名稱從path更改爲myPath。 PATH是一個保留的系統變量,不應該用於除了它所設想的目的之外的其他任何內容。

+2

不要使用「路徑」作爲你的變量 - 它被保留在Windows中的特殊用途。修改該值可能會在稍後的腳本中導致問題。將變量名稱從「路徑」更改爲其他內容,也許是「mypath」。編輯你的答案,然後我可以投票。 – dbenham 2012-08-10 00:10:24

0

在這種情況下甚至不需要搜索/替換。只需從您的論點中刪除原始引號(使用%~1) - 然後您可以再次添加任何您想要的內容,例如逃脫的報價。在您的例子:

runas /user:abc "icacls \"%~1\" /grant Everyone:(F) /T" 
5

每個響應覆蓋了部分答案。用反斜槓&報價將它們結合起來:\"你:

runas /user:abc "icacls \"%~1\" /grant Everyone:(F) /T" 

,或者您可以加倍(雙)援引逃脫他們:

runas /user:abc "icacls ""%~1"" /grant Everyone:(F) /T" 

作爲一個側面說明^爲逃避偶爾有用特殊字符如<,|,>,||,&&&對於e xample:

echo ^| 

但這是非常罕見的。

+0

加倍的雙引號對我來說不起作用,但反斜槓的確如此。 – SerG 2015-05-18 13:32:14