2017-08-24 157 views
2

當給定一個可能或不可以引用的環境變量時,我需要刪除引號。批處理文件 - 如何查找字符串中的引號?

例如,我可以給出:

  1. JAVA_HOME=C:\Program Files\Java\jdk1.8.0_144
  2. JAVA_HOME="C:\Program Files\Java\jdk1.8.0_144"

我試圖用findstr,它似乎從CMD.EXE很好地工作,但不是從我的批處理文件。這是我在test1.bat

@echo off 

echo.%JAVA_HOME% | findstr \^" 1>nul 
if ERRORLEVEL 0 (
    echo Found Quotes 
) 
if ERRORLEVEL 1 (
    echo No Quotes found 
) 

我的問題是,ERRORLEVEL似乎總是0,當我運行test1.bat我總是得到消息「發現行情」。

我有此代碼刪除引號for /f "delims=" %%G IN (%JAVA_HOME%) DO SET JAVA_HOME=%%G哪些作品發現,但只有當有引號,因此需要獲得上述findstr條件正常工作。

+0

三個答案,直到現在和每一個處理不同的方面。你的代碼的主要問題是你必須首先比較[最高錯誤級別](https://ss64.com/nt/if.html)你可以通過條件執行來避免這種情況:'echo:%AJVA_HOME%|雖然我不得不將''JAVA_HOME = %%〜G \'''改成''JAVA_HOME ='&'(回聲沒有找到引號)' – LotPings

回答

1

批處理文件已經能夠刪除for上的引號 - 例如%%G這樣的回調變量,所以你不需要任何findstr邏輯。 for不起作用的原因是因爲您沒有引用%JAVA_HOME%。你總是必須引用具有空格的參數。

help for,語法是:

FOR/F [ 「選項」] IN( 「串」)%可變DO命令 [命令參數]

而就自動像%%G這樣的變量,波形符號運算符會刪除引號(如果它們存在)。

help for來自:

此外,用於可變的引用替換已被 增強。您現在可以使用下列選項語法:

%~I   - expands %I removing any surrounding quotes (") 

所以這些2條信息,你for循環改變這種從%JAVA_HOME%刪除引號。

for /f "delims=" %%G IN ("%JAVA_HOME%") DO SET "JAVA_HOME=%%~G" 
+0

謝謝, %%〜G「' – adamretter

+0

@adamretter:哎呀,我以爲我已經複製並粘貼了它,但看起來我自己介紹了這個錯字,我編輯了刪除斜槓的答案。 – indiv

1

在測試0,IIRC之前,您通常必須測試ERRORLEVEL的其他值。這完美的作品對我來說:

@echo off 

echo.%JAVA_HOME% | findstr \^" 1>nul 
if ERRORLEVEL 1 (
    echo No quotes found 
    goto :eof 
) 
if ERRORLEVEL 0 (
    echo Found quotes 
) 

注意:刪除goto :eof意味着你通過echo得到兩條線路輸出,如果沒有匹配。

0
@ECHO OFF 
SETLOCAL 

SET JAVA_HOME=C:\Program Files\Java\jdk1.8.0_144 
SET "java_home=%java_home:"=%" 
SET j 
ECHO ------------------------------------------- 
SET JAVA_HOME="C:\Program Files\Java\jdk1.8.0_144" 
SET "java_home=%java_home:"=%" 
SET j 

GOTO :EOF 

無論哪種方式,java_home結束了 「裸體」。

相關問題