如何创建一个批处理脚本,创建一个文本文件并获取另一个文件夹中的所有文件的名称并将其存储在原始文本文件中

如何创建一个批处理脚本,创建一个文本文件并获取另一个文件夹中的所有文件的名称并将其存储在原始文本文件中

说明如下:脚本必须创建一个名为 files.txt 的文件并显示其内容。该文件必须包含 %windir%\system32 目录中所有符合以下条件的名称(仅此而已): - 文件名为 4 个字母,扩展名为 .com(例如:mode.com) - 文件名的第 2 个字母为“i”,扩展名为 .dll(例如:windows.dll)

我是个初学者,现在我唯一拥有的是:break>“C:\Users\username\Desktop\Folder\files.txt”(创建文本文件)我想我可能必须用''for''做一个循环,因为我不太确定条件

答案1

您可以使用 dir 命令和通配符来实现这些目的。您可以使用两个通配符来实现这些模式。首先,我们有 * 通配符,它​​可以匹配任何字符序列。我们还有 ?,这个通配符只匹配一个字符。

现在,如果您想将命令输出到文件,您可以使用 > 或 >>。区别在于 >> 将附加到现有文件,但当您使用 > 时,文件将仅包含命令的输出。如果文件不存在,则在这两种情况下都会创建该文件。

下面是一个示例,如果我们要列出第二个字母为 i 且扩展名为 .dll 的所有文件。我使用 /b 参数仅列出文件而不显示 dir 通常显示的其他信息。我将输出放在桌面上。

cd %windir%\system32
dir ?i*.dll /b >> %userprofile%\desktop\files.txt

我不会为你写整个脚本。你应该能够利用这些信息自己编写脚本。

答案2

* 请参阅粘贴链接以获取更新的代码 *

瞧。新年快乐。对于 3 个月前才开始学习批处理,没有其他值得注意的编码经验的人来说,这还不错。

但我必须问,这有什么意义呢?这样对数据进行排序有什么用呢?

* 已更新,包含详细的备注 *

@ECHO OFF

REM - Required to access variables used during for loops:
SETLOCAL EnableDelayedExpansion

REM - Remove Old Log if Exists
IF exist "files.txt" (
DEL /Q "files.txt"
)

REM - Variable used to Establish the Array:
Set Val=0

REM - Not strictly necessary, A variable used for the PATH to be Processed.
Set Home_Dir=%windir%\system32

REM - Assign Extensions For processing and call Function.
Set "ext=com" && CALL :process
Set "ext=dll" && CALL :process

REM - Opens the Results of Processing for review.
Start notepad.exe files.txt

REM - For /R Loop Searches the Directory for Files matching the extension
REM - %%~na expands to the name of %%a.
REM - %%~xa expands to the extension of %%a.
REM - %%~dpa expands to the directory %%a is in (drive letter and path).
REM - Note: Only the Filename has been stored in this script.
REM - If you wish to store the whole path, change the >> store to:
REM - !filepath[%val%]!!name[%val%]!!EXT[%val%]! >>files.txt

REM - The below is a recursive Option. OP did not state explicitely if Subfolders needed or Not.
REM - If Recursive Option Is NOT needed, Refer to the Linked paste for the Method
REM - Of Setting the Array For CD files Only.
:process
FOR /R "%Home_Dir%" %%a IN (*.%ext%) DO (
    Set name[!val!]=%%~na
    Set EXT[!val!]=%%~xa
    Set filepath[!val!]=%%~dpa
    Set /a Val+=1
    CALL :extFilter
)
GOTO :EOF

:extFilter
ECHO !name[%val%]!

REM - Call sub function to test .com filelength
IF "!EXT[%val%]!"==".com" CALL :Filter_com

REM - Call sub function to test 2nd letter in .dll filename
IF "!EXT[%val%]!"==".dll" CALL :Filter_dll
GOTO :EOF

:Filter_dll
Set "testletter=!name[%val%]!"

REM - Breaks the string down ~offsetFromStringLeft,HowManyCharactersToUse%
Set testletter=%testletter:~1,1%

REM - Test the Isolated letter against the desired Value and Store if true.
IF /I "!testletter!"=="i" ECHO !name[%val%]! >>files.txt
GOTO :EOF

:Filter_com

REM - Call Function to determine the String's Length.
Call :strlen result !name[%val%]!

REM - Test if String Length of Name Matches Desired Value and Store if true.
IF !result!==4 ECHO !name[%val%]! >>files.txt
GOTO :EOF

REM - strlen - Function that progressively tests String length using a temporary
REM - string to offset the string length by %%P, then Comparing the result
REM - of the offset to see if the string is empty.
REM - Once the Offset returns an empty string, the cumulative value of %%P
REM - becomes the Stringlength (%len%), and the value is returned as result.

:strlen <resultVar> <stringVar>
set tmp=%~2
If defined tmp (
        set "len=1"
        for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
            if "!tmp:~%%P,1!" NEQ "" ( 
                set /a "len+=%%P"
                set "tmp=!tmp:~%%P!"
            )
        )
    ) ELSE (
        set len=0
)
( 
    set "%~1=%len%"
    exit /b
)

***** Strlen 函数来自如何获取批处理文件中的字符串长度?经过杰布*****
粘贴可以找到:这里

相关内容