2017-01-20 5 views
4

を文字列を送信する際にこれが私のコードで倍増します:​​^バッチスクリプトで機能するpararmeterとして

set var1="`netsh int ipv4 show interface ^| findstr /I Network`" 

call:GetEles %var1% 
goto:eof 

:GetEles 
for /F "tokens=1 usebackq" %%F IN (%~1) do echo %%F 
goto:eof 

それが実行されている間、私はコマンドをチェックすると、^が機能:GetEles内で倍増してしまう:

for /F "token=1 usebackq" %%F IN (`netsh int ipv4 show interface ^^| findstr /I Network`) do echo %%F 

^が2倍になってしまったので、私のスクリプトが失敗しました。どのように解決できますか?

答えて

3

ように、これはcall commandの厄介な "機能" があります。

それを回避するには、いくつかのオプションがあります。

  1. は、単にサブルーチンで倍増キャレットを元に戻す:

    @echo off 
    set "VAR=caret^symbol" 
    call :SUB "%VAR%" 
    exit /B 
    
    :SUB 
        set "ARG=%~1" 
        echo Argument: "%ARG:^^=^%" 
        exit /B 
    
  2. callは、第二の解析フェーズを導入し、その第二を聞かせては1つは変数を展開する:

    @echo off 
    set "VAR=caret^symbol" 
    call :SUB "%%VAR%%" 
    exit /B 
    
    :SUB 
        echo Argument: "%~1" 
        exit /B 
    
  3. のパス値を参照(その変数名)によってではなく、値によって:

    @echo off 
    set "VAR=caret^symbol" 
    call :SUB VAR 
    exit /B 
    
    :SUB 
        setlocal EnableDelayedExpansion 
        echo Argument: "!%~1!" 
        endlocal 
        exit /B 
    
  4. ではなく、そこに(グローバル)変数を読んで、サブルーチンに変数の値を渡さないでください:

    @echo off 
    set "VAR=caret^symbol" 
    call :SUB 
    exit /B 
    
    :SUB 
        echo Argument: "%VAR%" 
        exit /B 
    
2

は(callは毒の文字を公開しますポイントに%var1%を展開しません)、このようにそれを試してみてください。

set "var1='netsh int ipv4 show interface ^| findstr /I Network'" 

call:GetEles "%%var1%%" 
goto:eof 

:GetEles 
for /F %%F IN (%~1) do echo %%F 
goto:eof 

あなたはtokens=1が必要とされなかったことに注意し、どちらも読むBuggy behaviour when using CALLusebackq

+0

+1ですが、このコマンドが第2の解析フェーズを開始するので、 'call'は'%var1% '変数を展開します。参照内の '%〜1'引数は1回だけ展開されます。証明: 'echo echo %% var1 %%'は、 'var1'の値を返します(私が間違っていた場合は、'%var1% 'に展開されます)... – aschipfl

+0

技術的に私のポイントを説明していないかもしれませんがそれは私の答えのために正しいままであり、_私の答えはそれに応じて更新されました。 – Compo

3

た:予想通り&|<>

リダイレクトは動作しません。

CALLコマンドは引用符で囲まれた文字列 "test^ing"内のキャレット文字が含まれている場合は、キャレットはを倍になります。コードスニペット以下

試してみてください。

@echo off 
SETLOCAL EnableExtensions 

set "var1=`netsh int ipv4 show interface ^| findstr /I "Network"`" 

call:GetEles "%var1%" 
goto:eof 

:GetEles 
echo variable "%var1%" 
echo parameter "%~1" 
for /F "tokens=1 usebackq" %%F IN (%var1%) do echo %%F 
goto:eof 

出力:他の人がすでに述べた

d:\bat> D:\bat\SO\41769803.bat 

variable "`netsh int ipv4 show interface ^| findstr /I "Network"`" 
parameter "`netsh int ipv4 show interface ^^| findstr /I "Network"`" 
関連する問題