3

txt からパスを取得し、最後のフォルダー名を取得してから使用する必要があります。

setlocal EnableDelayedExpansion

set InputFile=somar.txt
for /f "tokens=* delims=" %%x in ('Type "%InputFile%"') do (
set path=%%x
:shift
for /f "tokens=1* delims=\/" %%i in ( "!path!" ) do (
    set folder=%%i
    set path=%%j
    )
if not [!path!] == [] goto :shift

echo folder: !folder!
)
endlocal

問題は、txt の最初の行でしか機能しないことです。問題はどこだ?

4

3 に答える 3

2

あなたにはいくつかの問題があります:

1)GOTOを発行した瞬間に、FORループが壊れます。GOTOの後で、これ以上FORループの反復を取得することはありません。これを修正するには、GOTOループをサブルーチンに移動してから、DOループ内からサブルーチンを呼び出します。

2)PATH環境変数は、Windows用に予約された意味を持っています。その変数名は、ローカライズされている場合でも、自分の目的で使用しないでください。運命を誘惑する価値はありません。別の変数名を使用するだけです。

3)おそらくデータの問題ではありませんが!、ファイル名またはフォルダー名の有効な文字です。FOR変数を展開すると!、遅延展開が有効になっているかどうかを含む名前が破損します。これは、必要に応じて遅延拡張のオンとオフを切り替えることで修正できます。

また、わずかな非効率性もあります。FORループでTYPEを使用する必要はありません。FORにファイルを直接読み取らせるだけです。(ファイルがUnicodeでない場合)

上記のすべての推奨事項を採用することもできますが、はるかに簡単な解決策があります:-)

編集-で終わるパスを処理するために行われた変更\

@echo off
set "InputFile=somar.txt"
for /f "usebackq eol=: delims=" %%A in ("%inputFile%") do (
  for %%F in ("%%A\.") do echo folder: %%~nxF
)

FOR変数修飾子は~nx、パスの終わりの名前と拡張子を直接提供します。コマンドラインから入力HELP FORして、FOR変数で使用できるすべての修飾子について確認します。

于 2012-12-06T11:56:21.563 に答える
0

可変ファイル名の場合:

@Echo OFF

:: By Elektro H@cker

set "File=File.ext"
Call :Get_paths "%InputFile%"

Pause&exit

:Get_paths
Set "AbsolutePath=%~dp1"
set "AbsolutePath=%AbsolutePath:\= %"
FOR %%# in (%AbsolutePath%) do (
    Set "LastFolder=%%#"
    Echo Folder: %%#
)
Echo Last Folder: %LastFolder%
GOTO:EOF

出力

Folder: C:
Folder: Users
Folder: Administrador
Folder: Desktop

Last Folder: Desktop

ファイルの場合:

@Echo OFF

:: By Elektro H@cker

set "File=test.txt"

For /F "Tokens=* usebackq" %%# in ("%FILE%") DO (   
    Set "AbsolutePath=%%~dp#"
    Call set "AbsolutePath=%%AbsolutePath:\= %%"
    CMD /Q /C "@FOR %%@ in (%%AbsolutePath%%) do (Echo Folder: %%@)"
)

Pause&Exit
于 2012-12-06T22:29:55.327 に答える
0

InputFile コンテンツには、ファイル名またはフォルダーが含まれている必要があります。
元)

D:\Test1  <= folder
D:\Test2\file.txt  <= file

D:\Test3\01. folder <= folder but recognize file. that contain extension.

私のコードは次のとおりです。

SETLOCAL EnableDelayedExpansion

SET lastFolder=
SET InputFile=somar.txt

FOR /F %%F IN (%InputFile%) DO (
    CALL :__GetFolderName "%%F"
    @ECHO lastFolder: !lastFolder!
)

後藤 :EOF


:: ******************** 内部バッチ
:__GetFolderName
IF "%~x1"=="" SET lastFolder=%~n1 & GOTO :EOF

設定 dp=%~dp1

CALL :__GetFolderName "%dp:~0,-1%"

後藤 :EOF
:: ********************

エンドローカル

結果は次のとおりです。

最後のフォルダー: テスト 1
最後のフォルダー: テスト 2
最後のフォルダー: Test3
于 2014-05-12T07:24:48.663 に答える