88

変数からパスとファイル名を抽出するにはどうすればよいですか?

Setlocal EnableDelayedExpansion
set file=C:\Users\l72rugschiri\Desktop\fs.cfg

関数やGOTOを使用せずにそれを行いたいです。出来ますか?

4

5 に答える 5

151
@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
)

「機能」がないという意味がよくわからない

明らかに、に変更ECHOSETて、変数をエコーするのではなく、変数を設定します...

完全なリストについては、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
)

コメント:コメントをご覧ください。

于 2013-03-22T10:32:41.343 に答える
144

パスとファイル名は、(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%
于 2013-03-22T10:33:08.657 に答える
14

これはすべて私にとってはうまくいきます:

@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
于 2018-01-02T23:02:30.087 に答える
2

実際に実行中のバッチファイルから情報が必要な場合は、これを試してください:

@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」など)を試すことができます

于 2017-10-27T15:08:22.550 に答える
1

遅い答え、私は知っていますが、私にとって次のスクリプトは非常に便利です-そして、それは質問にも答え、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が、最初の引数のファイル名です。

これが誰かの役に立てば幸いです。

于 2020-06-29T09:05:16.597 に答える