2013-10-22 46 views
3

很簡單的問題,更換「%」,沒有soloution尚未:在一個變量

C:\> Set var=^%test^% 
C:\> Echo %var% 
%test% 

C:\> Echo %var:^%=-% 
%test% 

C:\> Why is this not producing -test-? 

我想加倍和去除胡蘿蔔(^)收效甚微。任何建議(或解決方案)讚賞。

蒙娜麗莎

回答

8

使用SET搜索和替換替換%的唯一方法是使用延遲擴展。這是不可能逃脫%的方式,讓您使用正常擴展。

%的規則在批處理和命令提示符中是不同的。

從批處理腳本內,%通過加倍它轉義:

@echo off 
setlocal enableDelayedExpansion 
set "var=%%test%%" 
set var 
set "var=!var:%%=-!" 
set var 

--OUTPUT--

var=%test% 
var=-test- 

從命令提示,它實際上是不可能逃脫%。如果引號內的文字不等於變量名稱,則百分比留在原地。此外,未配對的百分比也留在原地。下面的代碼假定變量test不存在:

C:\test>cmd /v:on 
Microsoft Windows [Version 6.1.7601] 
Copyright (c) 2009 Microsoft Corporation. All rights reserved. 

C:\test>set "var=%test%" 

C:\test>set var 
var=%test% 

C:\test>set "var=!var:%=-!" 

C:\test>set var 
var=-test- 

C:\test> 

如果變量test確實存在,那麼你可以設置自己的初始var值使用類似:

c:\test>set "var=%^test%" 
var=%test% 

插入符號「逃逸」的下一個字符,所以它被消耗,留下正確的值。它可以放置在百分比內的任何地方。但是代碼假定變量^test不存在。如果是這樣,那麼它會簡單地擴大該值,如下所示:

C:\test>set "^test=Hello world" 

C:\test>set ^^ 
^test=Hello world 

C:\test>set "var=%^test%" 

C:\test>set var 
var=Hello world 

C:\test> 
1
@echo off&setlocal enabledelayedexpansion 
Set var=%%test%% 
set a=var:%%= 
echo var is %var% 
echo var%%= is !%a%! 

這應該工作... %% ^沒有逃脫%%的批處理文件。在一個批處理文件中,^%真的是在%之後轉義字符,在這裏是換行符。

+0

但是這可以只用一個'%'來完成嗎? – Monacraft

+0

'^%真的是在%之後轉義字符,在這種情況下是換行符 - 這是錯誤的'^%test ^%',第二個脫字符號將被用作變量名稱'test ^'的一部分,並且在擴展變量(或者在這種情況下,完整的部分將保持不變),兩個脫字符都逃避下面的字符,這在兩種情況下都是百分號,沒有任何進一步的效果。 – jeb

+0

嘗試行'set a = ^%test ^%'後跟行'hello world',a將被設置爲'hello world'。 – nephi12