ファイル名の先頭の「@」を削除する 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!
(通常のに加えて%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