使用批处理文件删除文件夹中文件的最后 4 个字符

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

这应该很简单,我只想要一个bat文件,当放置在文件夹中时,它将重命名文件夹中的所有文件并删除最后4个字符,但不删除扩展名

例如。

img (1).jpg

成为

img.jpg

我试过了

@echo off
setlocal enabledelayedexpansion
if not exist %1 goto :eof
for /f %%A in ('find /V /C "" ^<%1') do set lines=%%A
for /f "tokens=1,* delims=[]" %%A in ('find /V /N "" ^<%1') do (
if %%A LSS %lines% (
echo %%B
) else (
set rec=%%B
echo !rec:~0,-4!
)
)

但它不起作用。没有错误,它运行了,它只是没有做任何事情

batch-file
3个回答
1
投票

我修改了你的代码如下:

1/切换到测试目录(PUSHD testdirectoryname)并返回(POPD)
2/将

%1
更改为固定文件名
3/插入一些调试行

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
rem The following setting for the source directory 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"

PUSHD  "%sourcedir%"

if not exist q71992787.txt goto :eof
TYPE "%sourcedir%\q71992787.txt"
for /f %%A in ('find /V /C "" ^<q71992787.txt') do set lines=%%A
SET li
find /V /N "" <q71992787.txt
for /f "tokens=1,* delims=[]" %%A in ('find /V /N "" ^<q71992787.txt') do (
 if %%A LSS %lines% (
  echo %%B
 ) else (
  set rec=%%B
  echo !rec:~0,-4!
 )
)

POPD

GOTO :EOF

除了调试行之外,结果是文件中的文件名列表

q71992787.txt
,除了最后一个文件名,它被缩短了 4 个字符。

这与您的结果“它只是没有做任何事情”不同。这就是我提到它的原因。

那么 - 你的解决方案:

我看不出有什么理由计算文件中的行数。例如,如果有 10 行,则使用“find /v /n”再次读取同一文件仍将找到 10 行。

如果

if %%A LSS %lines%
(行号)
LESS
(
echo %%B
) 小于 10,则 %%A 将为
LSS
(文件名);也就是说,从 1 到 9 - 仅显示文件名。

仅当

else
为 10 或更大时才会处理
%%A
子句,因此仅在最后一行处理。

我确信这不是你想要做的。

我建议您使用

set "var1=value"
来设置 STRING 值 - 这可以避免尾随空格引起的问题。设置算术值不需要引号
(
set /a`)

在更改文件名时,将

rec
设置为
%%B
表示整个 文件名,
%%B
。您没有向我们展示文件中的样本
%1
,所以我假设它是
img (1).jpg
,正如您的叙述中提到的那样。因此,
rec
将变为
img (1).jpg
,然后通过删除字符串的最后 4 个字符来缩短为
img (1)

由于您似乎想删除 name 部分的最后 4 个字符并保留扩展名,那么您需要阅读

for
的文档(提示中的 for /?),它会告诉您

set "rec=%%~nB"

将仅分配 name 部分,然后您就可以

set "rec=!rec:~0,-4!%%~xB"

echo !rec:~0,-4!%%~xB

设置或显示操作的名称。

至于为什么你根本没有得到结果;这可能是因为

%1
的文件编码是 unicode 或 *nix 格式(不是行结尾)

我确实希望您没有使用像

cygwin
这样的 *nix 模拟器,其中
find
成为文件定位器,而不是字符串分析器。


0
投票

当前目录下所有文件名以空格和圆括号内的一位数字结尾的 *.jpg 和 *.jpeg 文件的文件重命名任务可以通过批处理文件完成,命令行如下:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "eol=| delims=" %%I in ('dir "* (?).jpg" "* (?).jpeg" /A-D /B /ON 2^>nul ^| %SystemRoot%\System32\findstr.exe /I /R /C:" ([0123456789])\.jpe*g$"') do (
    set "FileName=%%~nI"
    setlocal EnableDelayedExpansion
    ren "!FileName!%%~xI" "!FileName:~0,-4!%%~xI"
    endlocal
)
endlocal

该代码也适用于在要删除的文件名最后四个字符之前包含一个或多个感叹号和一个或多个圆括号的图像文件名。

注意: 如果当前目录包含两个文件 photo (1).jpg

photo (2).jpg
将第二个文件重命名为
photo.jpg
,则命令
REN
会输出错误消息,因为在第一个文件已重命名为 后这是不可能的
photo.jpg
。同一目录下不能有两个同名文件。

要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。

  • dir /?
  • echo /?
  • endlocal /?
  • findstr /?
  • ren /?
  • set /?
  • setlocal /?

阅读有关 使用命令重定向运算符的 Microsoft 文档,了解

2>nul
|
的说明。重定向运算符
>
|
必须在
FOR
命令行上使用脱字符号 ^ 进行转义,以便在 Windows 命令解释器在执行执行嵌入命令的命令 FOR 之前处理此命令行时将其解释为文字字符与使用在后台启动的单独命令进程一致。


-1
投票

在 PowerShell 中执行会容易得多

 ls *.jpg |% { ren $_ -ne ($_.BaseName.Substring(0, $_.BaseName.Length - 4) + $_.Extension) -wi }

-wi
-WhatIf
是空运行的选项。检查新名称是否正确后,您可以删除该选项。没有别名的完整命令行:

Get-ChildItem -File *.* | ForEach-Object { Rename-Item -WhatIf -Path $_ `
    -NewName ($_.BaseName.Substring(0, $_.BaseName.Length - 4) + $_.Extension) }
© www.soinside.com 2019 - 2024. All rights reserved.