[英]Ignore percent sign in batch file
我有一個批處理文件,它將文件從一個文件夾移動到另一個文件夾。 批處理文件由另一個進程生成。
我需要移動的一些文件中包含字符串“%20”:
move /y "\\myserver\myfolder\file%20name.txt" "\\myserver\otherfolder"
這失敗了,因為它試圖找到一個名稱為:
\\myserver\myfolder\file0name.txt
有什么辦法可以忽略%
嗎? 我無法更改生成的文件以逃避這種情況,例如將百分號( %%
)、escaping 與/
或^
(插入符號)等加倍。
在這種情況下,您需要使用%%
。 通常使用^
(插入符號)會起作用,但對於%
符號,您需要加倍。
在%%1
或%%i
或echo.%%~dp1
,因為%
表示來自命令或變量的輸入(當用%
; %variable%
包圍時)
要實現您所需要的:
move /y "\\myserver\myfolder\file%%20name.txt" "\\myserver\otherfolder"
我希望這有幫助!
問題的標題很籠統,難免會吸引很多尋求通用解決方案的讀者。
相比之下, OP 的問題是奇特的:需要處理格式錯誤且無法修改的自動生成的批處理文件: %
符號在其中沒有正確轉義。
接受的答案為特定的和奇異的問題提供了一個巧妙的解決方案,但勢必會造成對通用問題的混淆。
如果我們關注一般問題:
%
作為文字字符? 在批處理文件中,無論是否在未加引號的字符串中,始終將%
轉義為%%
; 例如,以下產生My %USERNAME% is jdoe
:
echo My %%USERNAME%% is %USERNAME% echo "My %%USERNAME%% is %USERNAME%"
在命令行(交互)上 - 以及在使用腳本語言的shell 調用功能時-行為與批處理文件中的行為根本不同:從技術上講, %
不能在那里轉義,並且沒有一種解決方法適用於所有情況:
在未加引號的字符串中,您可以使用“ ^
name-disrupter”技巧:為簡單起見,在每個%
char 之前放置一個^
,但請注意,您在技術上並沒有以這種方式轉義%
(有關更多信息,請參見下文); 例如,以下再次產生類似My %USERNAME% is jdoe
:
echo My ^%USERNAME^% is %USERNAME%
在雙引號字符串中,您根本無法轉義%
,但有一些解決方法:
您可以像上面一樣使用不帶引號的字符串,然后需要您另外^
-escape 所有其他 shell 元字符,這很麻煩; 這些元字符是: <space> & | < > "
<space> & | < > "
或者,除非您正在調用批處理文件, ,否則您可以單獨雙引號%
字符作為復合參數的一部分(大多數外部程序和腳本引擎將復合參數(例如"%"USERNAME"%"
解析為逐字字符串%USERNAME%
):
some_exe My "%"USERNAME"%" is %USERNAME%
從腳本語言來看,如果你知道你正在調用一個二進制可執行文件,你可以通過放棄調用shell 的函數來支持“無殼”變體,例如使用execFileSync
而不是execSync
來避免整個問題。節點.js。
在此部分感謝 jeb的幫助。
在命令行(交互)上, %
在技術上根本無法轉義; 而^
一般cmd.exe
的轉義字符,它不適用於%
。
如前所述,沒有雙引號字符串的解決方案,但有針對未引用字符串的解決方法:
“ ^
name-disrupter”技巧(類似於^%USERNAME^%
)起作用的原因是:
它“破壞”了變量名; 也就是說,在上面的示例中cmd.exe
查找名為USERNAME^
的變量,它(希望)不存在。
在命令行上 - 與批處理文件不同 - 對未定義變量的引用按原樣保留。
從技術上講,變量名稱中的單個^
- 在其中的任何位置,只要它不與另一個^
相鄰 - 就足夠了,例如%USERNAME^%
就足夠了,但我建議采用有條不紊地放置的約定^
為簡單起見,在每個%
之前,因為它也適用於諸如up 20^%
,其中中斷甚至沒有必要,但是是良性的,因此您可以有條不紊地應用它,而無需考慮輸入字符串。
開頭%
之前的^
雖然不是必需的,但它是良性的,因為^
轉義下一個字符,無論該字符是否需要轉義 - 或者,在這種情況下,可以轉義 - 與否。 最終效果是這樣的^
實例最終會從未加引號的字符串中刪除。
很大程度上假設性的警告: ^
實際上是變量名中的合法字符(請參閱注釋中的 jeb 示例); 如果您的變量名兩端^
,只需將“破壞性” ^
別的地方的變量名,只要它不直接旁邊另一^
(因為這將導致^
出現在結果字符串中)。
也就是說,在(極不可能的)事件中,您的變量具有諸如^b^
類的名稱,您就不走運了。
在批處理文件中,可以使用雙百分號 ( %% ) 來“轉義”百分號。 這樣,命令行中將使用一個百分號。 來自http://www.robvanderwoude.com/escapechars.php
我想我有一個部分的解決方案。 如果您只想傳輸名稱中包含“%20”字符串的文件,而不是尋找更廣泛的解決方案,您可以使用 %%2 作為第二個參數調用第一個批處理文件。 這樣,當您的程序在遇到文本名稱中的 %2 時嘗試獲取第二個參數時,它將用轉義的 %2 替換 %2,保持文件名不變。
希望這有效!
如何在不修改文件的情況下在批處理文件中“轉義”** 原始問題是關於生成的文件,該文件無法修改,但包含以下行:
move /y "\\myserver\myfolder\file%20name.txt" "\\myserver\otherfolder"
這可以通過使用適當的參數( %1
、 %2
、...)調用腳本來部分解決
@echo off
set "per=%%"
call generated_file.bat %%per%%1 %%per%%2 %%per%%3 %%per%%4
這只是將參數設置為:
arg1="%1"
arg2="%2"
...
如何在命令行上添加文字百分號
mklement0 描述了這個問題,在命令行上轉義百分號很棘手,在引號內似乎是不可能的。
但與往常一樣,它可以通過一個小技巧來解決。
for %Q in ("%") do echo "file%~Q20name.txt"
%Q
包含"%"
並且%~Q
擴展為僅%
,與引號無關。
或者為了避免%~
使用
for /F %Q in ("%") do echo "file%Q20name.txt"
您應該能夠使用插入符號 (^) 來轉義百分號。
編者注:鏈接現已失效; 無論哪種方式:轉義%
是%
本身,但僅在批處理文件中,而不是在命令提示符下; ^
永遠不會轉義%
,但在命令提示符下,它可以間接用於防止變量擴展,僅在未加引號的字符串中。
%2
消失的原因是批處理文件正在替換傳入的第二個參數,而您似乎沒有第二個參數。 解決該問題的一種方法是實際嘗試foo.bat ^%1 ^%2...
以便在命令中遇到%2
時,它實際上被替換為文字%2
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.