簡體   English   中英

忽略批處理文件中的百分號

[英]Ignore percent sign in batch file

我有一個批處理文件,它將文件從一個文件夾移動到另一個文件夾。 批處理文件由另一個進程生成。

我需要移動的一些文件中包含字符串“%20”:

move /y "\\myserver\myfolder\file%20name.txt" "\\myserver\otherfolder"

這失敗了,因為它試圖找到一個名稱為:

\\myserver\myfolder\file0name.txt

有什么辦法可以忽略%嗎? 我無法更改生成的文件以逃避這種情況,例如將百分號( %% )、escaping 與/^ (插入符號)等加倍。

在這種情況下,您需要使用%% 通常使用^ (插入符號)會起作用,但對於%符號,您需要加倍。

%%1%%iecho.%%~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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM