BAT가 SENDTO에서 호출될 때 CMD 하위 문자열이 작동하지 않는 이유는 무엇입니까?

BAT가 SENDTO에서 호출될 때 CMD 하위 문자열이 작동하지 않는 이유는 무엇입니까?

파일 이름에서 선행 '@'을 제거하기 위해 BAT 파일을 작성했습니다. (이유는 묻지 마세요! ...왜 Windows인지, 왜 CMD인지...) :)

BAT 파일은 다음과 같습니다.

IF EXIST "%~1" (

    FOR /F %%F IN ("%~1") DO (

        CD /D "%%~dpF"
        IF ERRORLEVEL 1 (
            ECHO.  Failed to CD to folder: %%~dpF
        ) ELSE (
            SETLOCAL ENABLEEXTENSIONS
            SET A=%%~nxF

            IF "%A:~0,1%"=="@" (

                ECHO.   RENAME "%A%" "%A:~1%"
                    RENAME "%A%" "%A:~1%"
                REM   RENAME "%%A%" "%%A:~1%"
            ) ELSE (
                ECHO.   File does not start with @:  %A%
            )
            ENDLOCAL
        )
    )
) ELSE (
    ECHO.    File not found:  %1
)

pause

DOS 창의 명령줄에서 실행하면 작동하는 것 같습니다.

18:54:04.97>dir /b *foo*
@foo.txt

18:54:07.97>test@ "%cd%\@foo.txt"

18:54:18.75>IF EXIST "C:\Users\me\lbin\@foo.txt" (FOR /F %F IN ("C:\Users\me\lbin\@foo.txt") DO (
CD /D "%~dpF"
 IF ERRORLEVEL 1 (ECHO.  Failed to CD to folder: %~dpF )  ELSE (
SETLOCAL ENABLEEXTENSIONS
 SET A=%~nxF
 IF "@" == "@" (
ECHO.   RENAME "@foo.txt" "foo.txt"
 RENAME "@foo.txt" "foo.txt"
 REM   RENAME "%Afoo.txt"
)  ELSE (ECHO.   File does not start with @:  @foo.txt )
 ENDLOCAL
)
) )  ELSE (ECHO.    File not found:  "C:\Users\me\lbin\@foo.txt" )

18:54:18.77>(
CD /D "C:\Users\me\lbin\"
 IF ERRORLEVEL 1 (ECHO.  Failed to CD to folder: C:\Users\me\lbin\ )  ELSE (
SETLOCAL ENABLEEXTENSIONS
 SET [email protected]
 IF "@" == "@" (
ECHO.   RENAME "@foo.txt" "foo.txt"
 RENAME "@foo.txt" "foo.txt"
 REM   RENAME "%Afoo.txt"
)  ELSE (ECHO.   File does not start with @:  @foo.txt )
 ENDLOCAL
)
)
   RENAME "@foo.txt" "foo.txt"

18:54:18.80>pause
Press any key to continue . . .
18:54:20.74>

하지만 SENDTO 메뉴의 바로가기에서 BAT 파일을 실행하면 작업이 substring올바르게 확장되지 않습니다. 특히 "IF"가 오른쪽( IF "%A:~0,1%"=="@" ()으로 확장되지 않습니다.

C:\Users\me\lbin>IF EXIST "C:\Users\me\lbin\@foo.txt" (FOR /F %F IN ("C:\Users\me\lbin\@foo.txt") D
O (
CD /D "%~dpF"
 IF ERRORLEVEL 1 (ECHO.  Failed to CD to folder: %~dpF )  ELSE (
SETLOCAL ENABLEEXTENSIONS
 SET A=%~nxF
 IF "~0,1" == "@" (
ECHO.   RENAME "" "~1"
 RENAME "" "~1"
 REM   RENAME "%A~1"
)  ELSE (ECHO.   File does not start with @:   )
 ENDLOCAL
)
) )  ELSE (ECHO.    File not found:  C:\Users\me\lbin\@foo.txt )

C:\Users\me\lbin>(
CD /D "C:\Users\me\lbin\"
 IF ERRORLEVEL 1 (ECHO.  Failed to CD to folder: C:\Users\me\lbin\ )  ELSE (
SETLOCAL ENABLEEXTENSIONS
 SET [email protected]
 IF "~0,1" == "@" (
ECHO.   RENAME "" "~1"
 RENAME "" "~1"
 REM   RENAME "%A~1"
)  ELSE (ECHO.   File does not start with @:   )
 ENDLOCAL
)
)
   File does not start with @:

C:\Users\me\lbin>pause
Press any key to continue . . .

아이디어?

답변1

지연된 확장구문 분석 시간이 아닌 실행 시간에 변수가 확장되도록 하는 경우 이 옵션은 명령으로 켜집니다 SETLOCAL. 지연된 확장이 적용되는 경우 변수는 !variable_name!(normal 외에도 %variable_name%) 를 사용하여 참조할 수 있습니다.

따라서 , 대신 !A!, !A:~0,1!및 를 각각 다음과 같이 사용 하십시오 .!A:~1!%A%%A:~0,1%%A:~1%

        SETLOCAL ENABLEEXTENSIONS
        SET A=%%~nxF

        IF "!A:~0,1!"=="@" (

            ECHO.   RENAME "!A!" "!A:~1!"
                    RENAME "!A!" "!A:~1!"
        ) ELSE (
            ECHO.   File does not start with @:  !A!
        )
        ENDLOCAL

관련 정보