46

作成中の Windows バッチ ファイルがありますが、大きな複雑な文字列を ECHO する必要があるため、両端に二重引用符を付ける必要があります。問題は、引用符を書き込んでいるファイルにも引用符がエコーされていることです。そのような文字列をどのようにエコーし、引用符を取り除きますか?

アップデート:

私はこれに取り組むために過去 2 日間を費やし、最終的に何かを一緒にまとめることができました。リチャードの答えは引用符を取り除くのに役立ちましたが、サブルーチンに ECHO を入れて文字列を直接出力しても、Windows は文字列内の文字にハングアップしました。尋ねられた質問に答えるので、リチャードの答えを受け入れます。

最終的に Greg の sed ソリューションを使用することになりましたが、sed/windows のバグ/機能のために変更する必要がありました (ドキュメントがないことは役に立ちませんでした)。Windows で sed を使用するには、いくつかの注意事項があります。単一引用符の代わりに二重引用符を使用する必要があります。文字列内の二重引用符を直接エスケープすることはできません。文字列を終了引用符で囲み、^ を使用してエスケープする必要があります (したがって ^" ) 次に、次のセクションの beqin 引用. また、誰かが、入力を sed にパイプすると、パイプが文字列に含まれるというバグがあることを指摘しました (私の最終的な解決策では、私はちょうど見つけたので、これを確認することはできませんでした)文字列の途中にすべての引用符を付けず、すべての引用符を削除する方法では、終了引用符を単独で削除することはできませんでした. ) 助けてくれてありがとう.

4

13 に答える 13

58

call コマンドにはこの機能が組み込まれています。 call のヘルプを引用するには:

 Substitution of batch parameters (%n) has been enhanced.  You can
 now use the following optional syntax:

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

以下は基本的な例です。

@echo off
setlocal
set mystring="this is some quoted text"
echo mystring=%mystring%
call :dequote %mystring%
echo ret=%ret%
endlocal
goto :eof

:dequote
setlocal
rem The tilde in the next line is the really important bit.
set thestring=%~1
endlocal&set ret=%thestring%
goto :eof

出力:

C:\>dequote
mystring="this is some quoted text"
ret=this is some quoted text

「環境変数トンネリング」手法 (endlocal&set ret=%thestring%) は、Tim Hill の「Windows NT Shell Scripting」の功績によるものです。これは、あらゆる深さのバッチ ファイルに対処する唯一の本です。

于 2009-04-29T23:36:25.967 に答える
27

次のアプローチを使用して、引用符なしで文字列を出力できます。

echo|set /p="<h1>Hello</h1>"

この文字列をファイルにプッシュします。

echo|set /p="<h1>Hello</h1>" > test.txt

この文字列をファイルにプッシュし、CR/LF を追加します。

echo|(set /p="<h1>Hello</h1>" & echo.) > test.txt`

チェックする:

type test.txt
于 2016-12-22T01:22:22.187 に答える
11

allを%var:x=y%に置き換える構文を使用できます。xy

次の例を参照してください。

set I="Text in quotes"
rem next line replaces " with blanks
set J=%I:"=%
echo original %I%
rem next line replaces the string 'in' with the string 'without' 
echo stripped %J:in=without%
于 2012-09-06T11:21:51.907 に答える
2

これは、次のようなケースを保持"C:\Program Files\somefile.txt"C:\Program Files\somefile.txt ながらにHeight=5'6"なりますSymbols="!@#

:DeQuote

SET _DeQuoteVar=%1
CALL SET _DeQuoteString=%%!_DeQuoteVar!%%
IF [!_DeQuoteString:~0^,1!]==[^"] (
IF [!_DeQuoteString:~-1!]==[^"] (
SET _DeQuoteString=!_DeQuoteString:~1,-1!
) ELSE (GOTO :EOF)
) ELSE (GOTO :EOF)
SET !_DeQuoteVar!=!_DeQuoteString!
SET _DeQuoteVar=
SET _DeQuoteString=
GOTO :EOF

SetLocal EnableDelayedExpansion
set _MyVariable = "C:\Program Files\ss64\"
CALL :dequote _MyVariable
echo %_MyVariable%
于 2009-04-29T23:17:08.103 に答える
2

実際には作成者向けではないことはわかっていますが、引用符なしでテキストをファイルに送信する必要がある場合は、以下の解決策が役立ちます。echo コマンドで引用符を使用する必要はありません。コマンド全体を角かっこで囲むだけです。

(
    echo first very long line
    echo second very long line with %lots% %of% %values%
) >"%filename%"
于 2015-05-29T08:51:01.740 に答える
2

次のバッチ ファイルは、一連のプログラムを開始するたびに遅れて開始します。

問題は、各プログラムのパラメーターを含むコマンド ラインを渡すことです。これには、プログラムの引数を引用符で囲む必要があり、呼び出し時に削除されます。これは、バッチ ファイル処理のいくつかの手法を示しています。

引用符で囲まれた引数がどのように渡され、引用符が削除されるかについては、ローカル サブルーチン :mystart を調べてください。

@echo off

rem http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/if.mspx?mfr=true

rem Start programs with delay

rem  Wait n seconds
rem  n number retries to communicate with the IP address
rem  1000 milliseconds between the retries
rem  127.0.0.1 is the LocalHost
rem  start /b (silent)  /min (minimized) /belownormal (lower priority)
rem  /normal provides a no-op switch to hold the place of argument 1

rem  start  /normal "Opinions"  %SystemRoot%\explorer.exe /e,d:\agar\jobs\opinion
rem  ping 127.0.0.1 -n 8 -w 1000 > nul

rem   Remove quotes in Batch
rem     http://ss64.com/nt/syntax-dequote.html
rem   String manipulation in Batch
rem     http://www.dostips.com/DtTipsStringManipulation.php
rem   ^ line continuation
rem   
rem   set p="One Two"      p has the exact value  "One Two" including the quotes           
rem   set p=%p:~1,-1%      Removes the first and last characters
rem   set p=%p:"=%         Removes all double-quotes
rem   set p=%p:cat=mouse%  Replaces cat with mouse

rem  ping 127.0.0.1 -n 12 -w 1000 > nul
rem        1       2            3                                                         4

@echo on
call :mystart /b/min  "Opinions"   "%SystemRoot%\explorer.exe  /e,d:\agar\jobs\opinion"   8  
@echo on
call :mystart /b/min  "Notepad++"  D:\Prog_D\Notepad++\notepad++.exe  14
@echo on
call :mystart /normal "Firefox"    D:\Prog_D\Firefox\firefox.exe      20
@rem call :mystart /b/min "ProcessExplorer"  D:\Prog_D\AntiVirus\SysInternals\procexp.exe  8
@echo on
call :mystart /b/min/belownormal "Outlook" D:\Prog_D\MSOffice\OFFICE11\outlook.exe  2
@echo off
goto:eof

:mystart
@echo off
 rem  %3 is "program-path  arguments" with the quotes. We remove the quotes
 rem  %4 is seconds to wait after starting that program
 set p=%3
 set p=%p:"=%
 start  %1  %2  %p% 
 ping 127.0.0.1 -n %4 -w 1000 > nul
 goto:eof
于 2012-04-22T15:44:25.760 に答える
2

FOR コマンドを使用して周囲の引用符を削除するのが、これを行う最も効率的な方法です。コンパクトな形式 (例 2) では、ワンライナーです。

例 1: 5 行 (コメント付き) のソリューション。

REM Set your string
SET STR=" <output file>    (Optional) If specified this is the name of your edited file"

REM Echo your string into the FOR loop
FOR /F "usebackq tokens=*" %%A IN (`ECHO %STR%`) DO (
    REM Use the "~" syntax modifier to strip the surrounding quotation marks
    ECHO %%~A
)

例 2: ワンライナーの実際の例。

SET STR=" <output file>    (Optional) If specified this is the name of your edited file"

FOR /F "usebackq tokens=*" %%A IN (`ECHO %STR%`) DO @ECHO %%~A

内部エコーがリダイレクト文字「<」と「>」を無視するのは興味深いことです。
実行ECHO asdfsd>asdfasdすると、標準出力ではなくファイル出力になります。

お役に立てれば :)

編集:

私はそれについて考え、同じことを達成するためのさらに簡単な (そしてハックの少ない) 方法があることに気付きました。次のように、拡張された変数置換/展開 (「 」を参照HELP SET)を使用します。

SET STR=" <output file>    (Optional) If specified this is the name of your edited file"

ECHO %STR:~1,-1%

これにより、最初と最後の文字 (引用符) を除くすべてが出力されます。私も使用をお勧めしSETLOCAL ENABLEDELAYEDEXPANSIONます。引用符が文字列のどこにあるかを把握する必要がある場合は、FINDSTR を使用して文字 # を取得できます。

于 2013-03-16T23:21:06.993 に答える
2

上記の回答 (:DeQuote で始まる) は、遅延環境変数展開がオンに設定されていることを前提としています。cmd /? から:

遅延環境変数展開は、デフォルトでは有効になっていません。/V:ON または /V:OFF スイッチを使用して、CMD.EXE の特定の呼び出しに対して遅延環境変数展開を有効または無効にすることができます。REGEDT32.EXE を使用して、次の REG_DWORD 値のいずれかまたは両方をレジストリに設定することにより、マシンまたはユーザー ログオン セッションでの CMD.EXE のすべての呼び出しの完了を有効または無効にできます。

HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion

    and/or

HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion

0x1 または 0x0 に設定します。ユーザー固有の設定は、マシンの設定よりも優先されます。コマンド ライン スイッチは、レジストリ設定よりも優先されます。

遅延環境変数展開が有効になっている場合、感嘆符を使用して、実行時に環境変数の値を置き換えることができます。

于 2009-04-29T23:33:48.420 に答える
0

http://unxutils.sourceforge.net/は、sed、gawk、grep、wget などの一連の GNU ユーティリティのネイティブ win32 ポートです。(これをコメントとして投稿するのに十分な担当者がいないことを申し訳ありません!)

于 2009-04-29T23:11:41.547 に答える
0

力ずくの方法:

echo "foo <3 bar" | sed -e 's/\(^"\|"$\)//g'

sedもちろん、これには の適切な Win32 バージョンを見つける必要があります。

于 2009-04-29T23:02:52.613 に答える