删除最后一个字符串批处理

时间:2015-04-08 00:40:11

标签: batch-file

你好我需要在txt文件中生成图像列表,但我必须删除最后一个字符并删除重复项

示例

SDFDFDF_1.jpg
SDFDFDF_2.jpg
THGGHFG_1.jpg
THGGHFG_2.jpg

并且必须在txt列表中保持这种方式

SDFDFDF
THGGHFG

我的代码只删除了.jpg

@echo off
if exist "sku.txt" del "sku.txt"
for /f "delims=" %%f in ('dir *.jpg /b') do echo %%~nf >> sku.txt

4 个答案:

答案 0 :(得分:22)

子串

Batch支持从字符串中取出子字符串的语法。一般语法是

%string:~start,end%

基本用法:

set test=test
echo %test:~2,3%
::st

这如何适用于您的问题?当负数用作结束索引时,子字符串会在字符串结尾之前停止许多字符。此行为可以轻松地从字符串末尾删除字符。

set test=test
echo %test:~0,-1%
::tes

答案 1 :(得分:2)

如果启用了扩展程序,则应该可以使用:

@echo off
if exist "sku.txt" del "sku.txt"
setlocal enabledelayedexpansion
set list=
for /f "usebackq delims=" %%f in (`dir /b *.jpg`) do (
  set xx=%%~nf
  set candidate=!xx:~0,-2!
  set n=0
  for %%i in (!list!) do (
    if "!candidate!"=="%%i" (
      set n=1
    )
  )
  if !n! EQU 0 (
    set list=!list! !candidate!
    echo !candidate! >> sku.txt
  )
)

endlocal

答案 2 :(得分:0)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "prev="
(
 FOR /f "tokens=1delims=_" %%a IN (
    'dir /b /o:n /a-d "%sourcedir%\*.jpg" '
  ) DO (
  CALL :unique %%a
 )
)>u:\newfile.txt

GOTO :EOF

:unique
IF /i "%prev%"=="%1" GOTO :EOF
SET "prev=%1"
ECHO(%1
GOTO :EOF

您需要更改sourcedir的设置以适合您的具体情况。

制作u:\ newfile.txt

该过程执行源目录的目录列表,基本格式(仅限文件名),没有目录,按名称顺序,将每个名称指定给%%a,但delims选项仅指定该部分在分隔符(_

之前

unique子例程将其参数(部分文件名)与找到的先前名称(不区分大小写)进行比较,如果它们不同,则将prev设置为新找到的名称,{ {1}} es es。

答案 3 :(得分:0)

您的规格非常不精确。您声明需要删除名称的最后一个字符,但是删除了扩展名,加上前面两个字符(下划线和数字)。

如果您有一个名为ABC_12.jpg的文件怎么办?

如果你有ABC.jpg怎么办?

我假设您只想处理看起来像* _n.jpg的文件,其中n是数字。

您可以使用我的JREN.BAT utility获取与模板匹配的所有文件的列表,并删除最后两个字符和扩展名。您可以将其传输到我的JSORT.BAT utility以排序和删除重复项。这两个实用程序都是混合JScript /批处理脚本,可以在XP以后的任何Windows机器上本机运行。

jren ".{6}$" "" /list /rfm "_\d\.jpg$"|jsort /u /i >sku.txt