2015-03-03 17 views
0

(編輯於04.03.2015) 這是工作正確的代碼版本。 此代碼的目的是獲取某些目錄和子目錄的路徑,其結構如下所示,以製作一個列表。批文件從一個位置到一個長度的字符串獲取子字符串

C:\ __ Genus1 \ _Species1 \目錄

C:\ __ Genus1 \目錄

C:\目錄

C:\ _家庭\目錄

C:\ _家庭\ __ Genus1 \ _Species1 \目錄

@ECHO off 
setlocal enabledelayedexpansion 
SET "_sDr=" 
SET "_sPt0=" 
SET "_sPt1=" 
SET "_sPt2=" 
SET "_sPt1st=" 
SET "_sPt2nd=" 
SET "_sDirYo=" 
SET "_sDirMo=" 
SET "_iLengthDir=" 
SET "_iFound1=" 
SET "_iFound2=" 
SET "_stri=" 
SET "_cBckslsh=" 
SET "_iStart=" 
SET "_cTab= " 
FOR /d %%a IN (*) DO (
    SET "_sDr=%%a" 
    SET "_sPt0=!_sDr:~0,1!" 
    SET "_sPt1=!_sDr:~1,1!" 
    SET "_sPt2=!_sDr:~2,1!" 
    SET "_sPt1st=%%~dpa" 
    IF "!_sPt0!"=="[" (
     ECHO 1. %%a>>List.txt 
    ) ELSE IF "!_sPt2!"=="_" (
     ECHO 2. %%a>>List.txt 
    ) ELSE IF "!_sPt1!"=="_" (
     FOR /d %%a IN (!_sPt1st!!_sDr!\*) DO (
      SET "_sPt2nd=%%a" 
      SET "_cBckslsh=\" 
      SET "_iStart=3" 
      CALL :instrc !_sPt2nd!, !_cBckslsh!, !_iStart! 
      SET "_iFound1=!_resulti!" 
      SET /A _iLengthDir=!_iFound1!-!_iStart! 
      CALL :substr !_sPt2nd!, !_iStart!, !_iLengthDir! 
      SET "_sDirYo=!_results:~2!" 
      SET "_sDirYo=!_sDirYo:_= !" 
      SET /A _iFound1=!_iFound1!+1 
      CALL :instrc !_sPt2nd!, !_cBckslsh!, !_iFound1! 
      SET "_iFound2=!_resulti!" 
      SET /A _iLengthDir=!_iFound2!-!_iFound1! 
      CALL :substr !_sPt2nd!, !_iFound1!, !_iLengthDir! 
      SET "_sDirMo=!_results!" 
      SET "_sDirMo=!_sDirMo:_= !" 
      ECHO !_sDirYo!%_cTab%!_sDirMo!>>List.txt 
     ) 
    ) ELSE IF "!_sPt0!"=="_" (
     ECHO 4. %%a>>List.txt 
    ) ELSE (
     ECHO NA!_cTab!!_sDr:_= !>>List.txt 
    ) 
) 
goto :eof 

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
::Function name: instrc           :: 
::_resulti: returns the position of a character in a string  :: 
::parameters:             :: 
::_sStringfi: a string which a caharacter will be found in it :: 
::_cToBeFoundfi: a caharacter of which position will be found :: 
::_iStartfi: position at which to start looking for _cToBeFoundfi:: 
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
:instrc 
SETLOCAL 
SET "_sStringfi=%1" 
SET "_cToBeFoundfi=%2" 
SET "_iStartfi=%3" 
SET "_iLocAc=" 
SET "_cLocAc=" 
FOR /L %%a IN (%_iStartfi%,1,255) DO (
    SET "_iLocAc=%%a" 
    SET "_cLocAc=!_sStringfi:~%%a,1!" 
    IF "!_cLocAc!"=="!_cToBeFoundfi!" GOTO ENDF 
) 
:ENDF 
ENDLOCAL & SET "_resulti=%_iLocAc%" 

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
::Function name: substr            :: 
::_results: returns a substring of a string, of which start point  :: 
::and length given              :: 
::parameters:               :: 
::_sStringfs: a string which a substringwill be taken from it   :: 
::_iStartfs: an integer value for starting position     :: 
::_iLengthfs: an integer value for length of substring     :: 
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
:substr 
setlocal 
set "_sStringfs=%1" 
set "_iStartfs=%2" 
set "_iLengthfs=%3" 
set "_substr_res=!_sStringfs:~%_iStartfs%,%_iLengthfs%!" 
endlocal & set "_results=%_substr_res%" 

回答

0

你不是目前爲止:

@ECHO off 
setlocal enabledelayedexpansion 
SET "_string=abcdefghij" 
SET "_length=3" 
SET "_substr=" 

REM See below: 
SET "_substr=!_string:~4,%_length%!" 

ECHO !_substr! 

對於您的原始代碼,您可以使用其他函數來執行此操作。相反的:

SET /A _ptkYou=!_ptke!-24 
::::Here is the original problem:::: 
SET "_ptkYo=!_ptkY!:~24,!_ptkYou!" 
ECHO !_ptkYo!>>Liste.txt 

用途:

CALL :substr !_ptkY!, !_ptkYou! 
SET "_ptkYo=!_result2!" 
ECHO !_ptkYo!>>Liste.txt 

然後添加以下結尾:

:substr 
setlocal 
set "_a=%1" 
set "_b=%2" 
set "_substr_res=!_a:~4,%_b%!" 
endlocal & set "_result2=%_substr_res%" 
+0

這工作。但在原始代碼中它不起作用。 'for'循環中原始代碼中的'_length'變量,並且在每個循環中由其他變量計算;像'SET/A _length =!_ location!-24' – 2015-03-03 13:41:57

+0

你可以編輯你的問題,包括 爲 循環,幷包括 位置 變量? – Rubik 2015-03-03 13:56:41

+0

代碼hes被編輯。 – 2015-03-03 14:14:36

相關問題