需要根据文件中的字符串移动文件的Windows脚本

问题描述 投票:0回答:1

根据 Windows 服务器上的文件中的关键字或内容复制数百个纯文本、ANSI 文件,因此我想创建一个可以运行或计划的 .bat 文件。有问题的文件在第一行都有不同的关键字,所以我想用它来将它们分类到不同的文件夹中。我一直在单独打开文件并根据第一行移动,但它越来越累了!我尝试向 chatgpt 询问脚本,这就是输出:

@echo off
setlocal enabledelayedexpansion
set "keyword=SAECH"
set "sourceFolder=C:\Path\To\Source"
set "destinationFolder=C:\Path\To\Destination"
for %%F in (%sourceFolder%\*.txt) do (
set "firstLine="
set /p firstLine=<"%%F"
echo !firstLine! | find /i "%keyword%" >nul && (
   move "%%F" "%destinationFolder%" ))

这是文件第一行的示例,就好像我正在搜索字符串 THIS:

    {1:F01XXXXAXXX2190532184}{2:O5352145231127ISAECHNCXXX622XXXXN} 

“SAECH”是我正在查看并根据第二个括号部分中的字符串手动移动文件的字符串。该括号中的其他数据根据文件创建或发送的日期和时间而变化。文件中的其余信息可能匹配,但只有第二个括号中的字符串很重要。

但是源文件夹没有输出。这个脚本是错误的还是缺少什么?我不知道它是否真的在查看文件的内容...或者也许它不能用基本的 Windows 脚本来完成?

我不需要更改文件内容或文件名,也不需要保留原始日期。我只需要将它们复制到不同的文件夹,我可以多次运行脚本并手动更改搜索字符串

尝试运行上述脚本,但没有输出到目标文件夹。

windows batch-file
1个回答
0
投票
@ECHO OFF
SETLOCAL
rem The following settings for the directories are names
rem that I use for testing and deliberately includes spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.

SET "sourcedir=u:\your files"
SET "destdir=u:\your results"
SET "searchstrings=SAECH WXYZQ PLUMS"

FOR %%e IN ("%sourcedir%\*.txt") DO (
 rem %%e has filename found
 SET "firstline="
 FOR /f "usebackqdelims=" %%y IN ("%%e") DO IF NOT DEFINED firstline (
  rem %%y has contents of first line
  SET "firstline=n"
  FOR %%o IN (%searchstrings%) DO (
   ECHO "%%y"|FIND /i "%%o">NUL
   IF NOT ERRORLEVEL 1 ECHO MOVE "%%~fe" "%destdir%\whatever %%o \something\"
  )
 )
)

GOTO :EOF

困难在于破译目标字符串是如何确定的。我们有一个例子,不清楚

this
是否涉及到任何地方,并且我们没有任何关于第一行内的唯一性或第一行中(多个)目标字符串的唯一性的线索。

所以 - 这个解决方案依赖于第一行中唯一的目标字符串。

%%e
依次设置为每个文件的名称。

firstline
用作标志,并为每个文件初始化为 nothing

从文件中读取第一行至

%%y
usebackq
告诉
for
带引号的名称是文件名,而不是字符串。
delims=
指示没有分隔符,因此整行都分配给
%%y

由于

firstline
未定义,我们处理该行。
firstline
立即设置为一个值,因此已定义并且不会处理更多行。

%%o
依次设置到每个目标字符串。
%%y
中的行被
echo
编辑为
find
,它看起来(
/i
=不区分大小写)目标字符串。

如果找到目标字符串,则

errorlevel
设置为
0
,因此它不是
1 or greater than 1
,因此
move
命令将
echo
发送到控制台。

所需的 MOVE 命令仅用于测试目的。

确认命令正确后
,将 ECHO 更改为
ECHO MOVE
以实际移动文件。附加
MOVE
以抑制报告消息(例如
>nul
    

© www.soinside.com 2019 - 2024. All rights reserved.