批量删除字符串末尾字符

21

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

示例

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

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

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

6
%string:~0,-5%,试试看。 该语句是针对字符串的一个操作,它表示从字符串的第一个字符开始(索引为0),截取到倒数第5个字符,返回截取后的结果。 - Krii
4个回答

66

子字符串

Batch支持从字符串中截取子字符串的语法。其一般语法为:

%string:~start,end%

基本用法:

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

这对你的问题有什么影响呢?当一个负数被用作结束索引时,子字符串会在字符串结尾之前停止那么多个字符。这种行为使得从字符串末尾删除字符变得容易。

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

只要字符串中没有冒号,就可以正常工作。 - Christopher Broderick
甚至用冒号也可以。 - Michel de Ruiter

7
如果启用了扩展,这应该可以工作:
@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

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设置为新找到的名称并将其echo


0

您的规范非常不精确。您说需要删除名称的最后一个字符,但实际上您删除了扩展名以及前面的两个字符(下划线和数字)。

如果您有一个名为ABC_12.jpg的文件呢?

如果您有一个名为ABC.jpg的文件呢?

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

您可以使用我的JREN.BAT实用程序获取与模板匹配的所有文件列表,并剥离掉最后两个字符以及扩展名。您可以将其导入到我的JSORT.BAT实用程序中进行排序和去重。这两个实用程序都是混合JScript /批处理脚本,可在任何Windows机器上从XP开始本地运行。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接