41

このコードの何が問題になっていますか? それは言いECHO is offます。

@ECHO off
set /p pattern=Enter id:
findstr %pattern% .\a.txt > result
if %errorlevel%==0 (
set var2= <result
echo %var2%
set var1=%var2:~5,3%
echo %var1% > test.txt
echo %var1%
) else (
echo error
)
del result
pause

どんな助けでも大歓迎です。

4

5 に答える 5

64

変数がどこかで空の場合は、コマンド「echo」を単独で使用するのと同じになり、echoのステータスを出力するだけです。

これを回避するには、すべてのechoコマンドを次のようなものに置き換える必要があります。

echo var2: %var2%

そうすれば、%var2%空の場合、「echooff」ではなく「echovar2:」と出力されます。

于 2013-01-15T09:56:59.707 に答える
25

ローランが述べたように、それは の問題ではなく、ECHOコードの問題です。

バッチ ファイルでは、ブロックは実行前に完全に解析されます。
解析中、すべてのパーセント展開が行われるため、ブロック内で変数を変更できないようです。

ただし、これには遅延展開が存在するため、遅延展開はブロックの解析中ではなく実行時に評価されます。

デフォルトでは遅延拡張が無効になっているため、有効にする必要があります。

@ECHO off
setlocal EnableDelayedExpansion
set /p pattern=Enter id:
findstr %pattern% .\a.txt > result
if %errorlevel%==0 (
  set var2= <result
  echo(!var2!
  set var1=!var2:~5,3!
  echo(!var1! > test.txt
  echo(!var1!
) else (
  echo error
)
del result

ここでは、変数が空の場合でも空の行を確実にエコーするため、echo(代わりにコンストラクトを使用しました。echo

于 2013-01-15T11:54:16.083 に答える
12

この投稿がまだ読まれているかどうかはわかりませんが、それでも. 次のことを試してみてください@echo off:

 setlocal enabledelayedexpansion

さらに、角かっこのブロックで変更された変数を使用したい場所 (For-Loopsまたは などIf's) を取得するには、をに変更する必要があり %ます!!varname!

これは役立つはずです...

ご挨拶

geisterfurz007

于 2016-08-25T09:44:26.560 に答える
0

ここに画像の説明を入力してください最初に同じディレクトリにファイルa.txtを作成しますuこのバッチファイルがあります...その中にテキストを書き込みます...注:Windows 2000 Windows ME Windows XP Windows VistaWindows7のみがFINDSTRをサポートします

set /p pattern=Enter id:
findstr %pattern% a.txt > __query.tmp
set /p result=<__query.tmp
if %errorlevel%==0 (
set var2= %result%
echo %var2%
set var1= %var2:~5,3%
echo %var1% > test.txt
echo %var1%
) else (
echo error
)
del __query.tmp
pause

このバスファイルを実行します..新しく作成されたファイルtest.txtのa.txtにある文字列の最初の行のサブ文字列(start = 5、length = 3)が見つかります。ついに動作しました!

于 2013-01-15T10:33:23.330 に答える