変数からパスとファイル名を抽出するにはどうすればよいですか?
Setlocal EnableDelayedExpansion
set file=C:\Users\l72rugschiri\Desktop\fs.cfg
関数やGOTOを使用せずにそれを行いたいです。出来ますか?
変数からパスとファイル名を抽出するにはどうすればよいですか?
Setlocal EnableDelayedExpansion
set file=C:\Users\l72rugschiri\Desktop\fs.cfg
関数やGOTOを使用せずにそれを行いたいです。出来ますか?
@ECHO OFF
SETLOCAL
set file=C:\Users\l72rugschiri\Desktop\fs.cfg
FOR %%i IN ("%file%") DO (
ECHO filedrive=%%~di
ECHO filepath=%%~pi
ECHO filename=%%~ni
ECHO fileextension=%%~xi
)
「機能」がないという意味がよくわからない
明らかに、に変更ECHO
しSET
て、変数をエコーするのではなく、変数を設定します...
完全なリストについては、for
ドキュメントを参照してください。
ceztkoのテストケース(参照用)
@ECHO OFF
SETLOCAL
set file="C:\Users\ l72rugschiri\Desktop\fs.cfg"
FOR /F "delims=" %%i IN ("%file%") DO (
ECHO filedrive=%%~di
ECHO filepath=%%~pi
ECHO filename=%%~ni
ECHO fileextension=%%~xi
)
コメント:コメントをご覧ください。
パスとファイル名は、(1)BAT自体のパラメーター、%1
(2)CALLのパラメーター、%1
または(3)ローカルFOR変数からのみ抽出できます%%a
。
HELP CALL
またはでHELP FOR
、より詳細な情報を見つけることができます:
%~ 1-%1を展開して周囲の引用符を削除します( ")
%~ f1-%1を完全修飾パス名に展開します
%~ d1-%1をドライブ文字のみに
展開します%~ p1-%1をパスのみに展開します
%~ n1-%1をファイル名のみに展開します
%~ x1-%1をファイル拡張子のみに
展開します%~s1-展開されたパスには短い名前のみが含まれます
%~a1-%1をファイル属性に展開します
%~ t1-%を展開します1からファイル
%〜z1の日付/時刻-%1をファイルのサイズに拡張します
そして、次のことを試してください。
解析する文字列をパラメータとしてCALLに渡します。
call :setfile ..\Desktop\fs.cfg
echo %file% = %filepath% + %filename%
goto :eof
:setfile
set file=%~f1
set filepath=%~dp1
set filename=%~nx1
goto :eof
または同等のもので、ファイル名をローカルFOR変数として渡します
for %%a in (..\Desktop\fs.cfg) do (
set file=%%~fa
set filepath=%%~dpa
set filename=%%~nxa
)
echo %file% = %filepath% + %filename%
これはすべて私にとってはうまくいきます:
@Echo Off
Echo Directory = %~dp0
Echo Object Name With Quotations=%0
Echo Object Name Without Quotes=%~0
Echo Bat File Drive = %~d0
Echo Full File Name = %~n0%~x0
Echo File Name Without Extension = %~n0
Echo File Extension = %~x0
Pause>Nul
出力:
Directory = D:\Users\Thejordster135\Desktop\Code\BAT\
Object Name With Quotations="D:\Users\Thejordster135\Desktop\Code\BAT\Path_V2.bat"
Object Name Without Quotes=D:\Users\Thejordster135\Desktop\Code\BAT\Path_V2.bat
Bat File Drive = D:
Full File Name = Path.bat
File Name Without Extension = Path
File Extension = .bat
実際に実行中のバッチファイルから情報が必要な場合は、これを試してください:
@echo off
set myNameFull=%0
echo myNameFull %myNameFull%
set myNameShort=%~n0
echo myNameShort %myNameShort%
set myNameLong=%~nx0
echo myNameLong %myNameLong%
set myPath=%~dp0
echo myPath %myPath%
set myLogfileWpath=%myPath%%myNameShort%.log
echo myLogfileWpath %myLogfileWpath%
もっとサンプル?C:> ヘルプコール
%0 = パラメータ 0 = バッチファイル %1 = パラメータ 1 - 第 1 パー。バッチファイルに渡されます...そのため、パラメーターについても、最初(「%」など)と最後(「1」など)の間でそのようなもの(「〜dp」など)を試すことができます
遅い答え、私は知っていますが、私にとって次のスクリプトは非常に便利です-そして、それは質問にも答え、1つのフラグで2つのハエを打ちます;-)
次のスクリプトは、ファイル エクスプローラーのコンテキスト メニューでSendToを展開します。
@echo off
cls
if "%~dp1"=="" goto Install
REM change drive, then cd to path given and run shell there
%~d1
cd "%~dp1"
cmd /k
goto End
:Install
rem No arguments: Copies itself into SendTo folder
copy "%0" "%appdata%\Microsoft\Windows\SendTo\A - Open in CMD shell.cmd"
:End
このスクリプトをダブルクリックしてパラメータなしで実行すると、それ自体が SendTo フォルダにコピーされ、名前が「A - Open in CMD shell.cmd」に変更されます。その後、「SentTo」コンテキストメニューで利用できます。
次に、Windows エクスプローラーで任意のファイルまたはフォルダーを右クリックし、 [ SendTo] > [A - Open in CMD shell.cmd]を選択します。
スクリプトは、ドライブとパスを、選択したファイルまたはフォルダーを含むパスに変更し、そのパスを使用してコマンド シェルを開きます。これは、「code」と入力するだけでよいため、Visual Studio Code に役立ちます。プロジェクトのコンテキストで実行します。
それはどのように機能しますか?
%0
- バッチ スクリプトのフル パス -
%~d1
最初の引数に含まれるドライブ (例: "C:")
%~dp1
- 最初の引数に含まれるパス
cmd /k
- 開いたままのコマンド シェルを開きます
ここでは使用しません%~n1
が、最初の引数のファイル名です。
これが誰かの役に立てば幸いです。