我需要你的帮助,我在这种类型的脚本方面相当新,我需要你的帮助来尝试使这个脚本正常运行。
我有一个脚本在文件夹中搜索文件,并在文件第一个字符后将它们移动到文件夹名称。但是当文件被多个“。”分隔时,我遇到了一个问题。
setlocal EnableDelayedExpansion
set "IncomingFolder=D:\Test"
set "showsFolder=D:\Test\"
for %%F in ("%incomingFolder%\*.S*.*") do ( for /f "delims=.S" %%A in ("%%~nF") do (
if not exist "%showsFolder\%" md "%showsFolder%\%%A"
move "%%F" "%showsFolder%\%%A" ) )
例如: 如果文件是Hustle.SXX.XXX那么它会生成名为“Hustle”的正确文件夹。 但是如果它被命名为The.Hustle.SXXX.XXX那么它只创建一个名为“The”的文件夹,我需要它使用整个名称直到“.S”。
有谁可以帮我解决这个问题?
答案 0 :(得分:1)
@ECHO OFF
SETLOCAL
set "IncomingFolder=c:\sourcedir"
set "showsFolder=D:\Test"
for %%F in ("%incomingFolder%\*.S*.*") do (for /f "delims=." %%A in ("%%~nF") do (
ECHO md "%showsFolder%\%%A"
ECHO move "%%F" "%showsFolder%\%%A\"
)
)
GOTO :EOF
我已经更改了目录名称以适合我的系统。
我无法重新创建您描述的问题,但delims=.S
会使分隔符.
或 S
而不是.S
。这可能就是你所看到的。
所需的MD命令仅用于ECHO
用于测试目的。在确认命令正确后,将ECHO MD
更改为MD
以实际创建目录。附加2>nul
以禁止错误消息(例如,当目录已存在时)
此外,为了测试目的,所需的MOVE命令仅为ECHO
。在确认命令正确无误后,将ECHO MOVE
更改为MOVE
以实际移动文件。附加>nul
以取消报告消息(例如1 file moved
)
答案 1 :(得分:1)
您不能使用FOR / F从前面解析,因为您不知道名称中可能出现多少.
。我假设你期待像part1.part2.Spart3.part4
这样的名字,但不像part1.part2.Spart3.part4.part5
。换句话说 - 你不想在.S
之后有两个点。如果是这样,那么你可以安全地删除倒数第二个点之后的所有内容。这可以使用~n
修饰符两次轻松完成。
for %%F in ("%incomingFolder%\*.S*.*") do for %%A in ("%%~nF") do (
if not exist "%showsFolder%\%%~nA" md "%showsFolder%\%%~nA"
move "%%F" "%showsFolder%\%%~nA\"
)
(由Magoo发痒 - %
在“传入”上失踪,而~n
在移动目的地上需要
答案 2 :(得分:0)
这使用名为repl.bat
的帮助程序批处理文件 - 从https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat
将repl.bat
放在与批处理文件相同的文件夹中或放在路径上的文件夹中。
测试一下,看看它是怎么回事:
@echo off
set "IncomingFolder=D:\Test"
set "showsFolder=D:\Test"
for %%F in ("%incomingFolder%\*.S*.*") do (
for /f "delims=" %%A in (' echo "%%~nF"^|repl ".(.*)S\d\d.*" "$1" ') do (
md "%showsFolder%\%%A" 2>nul
move "%%F" "%showsFolder%\%%A"
)
)
答案 3 :(得分:0)
setlocal EnableDelayedExpansion
set "IncomingFolder=D:\Test"
set "showsFolder=D:\Test"
for %%F in ("%incomingFolder%\*.S*.*") do (
set "file=%%~nF"
for /F "delims=" %%A in ("!file:*.S=!") do set "folder=!file:.S%%~A=!"
if not exist "%showsFolder%\!folder!" md "%showsFolder%\!folder!"
move "%%F" "%showsFolder%\!folder!"
)
set "file=%%~nF"
获取文件名,例如:set "file=The.Hustle.SXXX.XXX"
!file:*.S=!
是第一个“.S”之后的部分,例如XXX.XXX
,所以set "folder=!file:.S%%~A=!"
是没有“.SXXX.XXX”的文件名,例如:“The.Hustle”