1

Windows バッチ ファイルに「goto は現時点では予期されていませんでした」というエラーが表示されました。下のようなものです。何も思いつきません。誰でも私を助けることができますか?ありがとう

@setlocal EnableExtensions EnableDelayedExpansion
@echo off
SET TEMPERL=%TMP%\perlversion.txt
for /f "tokens=*" %%a in (%TEMPERL%) do (
  set line=%%a  
  if not "%line:subversion%"=="%line%" goto GETVERSION
)

:GETVERSION
set mainver=%line:*perl=%
set mainver=%mainver:~1,1%
echo This is perl %mainver%


:END
endlocal
4

2 に答える 2

2

これを試して:

@echo off
setlocal EnableExtensions
SET "TEMPERL=%TMP%\perlversion.txt"
for /f "usebackqdelims=" %%a in ("%TEMPERL%") do (
    set "line=%%a"
    SETLOCAL EnableDelayedExpansion
    if not "!line:subversion=!"=="!line!" (
        set "mainver=!line:*perl=!"
        set "mainver=!mainver:~1,1!"
        echo This is Perl !mainver!
    )
    ENDLOCAL
)

でループ コード ブロックを残すべきではありません。これにより不安定になります。forgotocmd

これを試すこともできます (ストロベリー Perl で動作します):

for /f "tokens=2delims=()" %%a in ('perl --version') do echo This is Perl %%a
for /f "tokens=4delims=(v)" %%a in ('perl --version') do echo This is Perl %%a
于 2013-08-05T06:37:23.950 に答える
1

ループ内でFOR、必要になります

set "line=%%a"
if not "!line:subversion=!"=="%%a" goto GETVERSION

また

set "line=%%a"
if not "!line:subversion=!"=="%%a" goto GETVERSION

BECAUSE %line%(または任意の%var %) は、変数の PARSE-TIME 値、つまり、FOR実行が開始される前の値を意味します。!var!は の RUN-TIME 値var、つまりループ中に変化する値を意味しますが、 が実行された場合のみsetlocal enabledelayedexpansion(この場合は実行されています)

=2 番目の前にも注意してください!。これにより、変数に置換文字列が導入されます。これは、ターゲット ( と の間:)を置換する文字列であり、構造体は[nothing] に置換された任意の文字列=で の値を計算します。linesubversion

%%aまた、行の の後に末尾のスペースがあることに注意してくださいset line=%%a。あなたが投稿したものは古典的に正しいように見えますが、末尾のスペースは割り当てられた値に含まれているため%%a!line!同じものではありません。enclose-the-statement-in-quotes メソッドにより、割り当てられた文字列に末尾の空白が含まれないようにします。その構造を使用するのが最善です-それは、目に見えないスペースを追いかけて頭を悩ませる多くのことを救うことができます.

最後にMAINVER、ターゲット行の構造を投稿していないため、のデコードが正しいことを保証できませんperlversion.txt

また、ターゲット行 (文字列を含む行subversionがファイル (またはファイル自体) に存在しない行) が欠落している場合、予期しない結果が生じる可能性があります。

于 2013-08-05T13:40:41.190 に答える