Windows bat:没有扩展名的文件(名称中的点)

时间:2017-06-09 01:27:55

标签: batch-file

起初:这不是一个重复的问题(我希望)。我搜索了很多,发现How to find files with no file extension in directory tree with a batch file?Find and rename files with no extension?等等,但我有一个“小”的额外问题。

我正在尝试在Windows 10上重命名多个(数千个)jpg文件。名称格式为“Name(ABC).jpg”或“Multiple Names(ABC).jpg”。我需要“Some Name.jpg”。

你有什么尝试?这么多东西,没有一个是真正的解决方案,直到这个:

for /f "tokens=1-3 delims=)(" %%a in ('dir /b *.jpg') do @rename "%%a(%%b)%%c" "%%a"
for /R %%x in (*.) do ren "%%x" *.png

适用于大多数文件,,除非名称中有一个点。如果名称类似于“A Name.Supercool(ABC).jpg”,它将只是“A Name.Supercool”,没有扩展名。

我知道问题在于(*。),只是不知道如何解决......

2 个答案:

答案 0 :(得分:1)

您的问题是将文件重命名为“%% a”会产生“A Name.Supercool” - 并且“没有扩展名”。

啊,但确实如此。文件名为“A Name”,扩展名为“.Supercool”

如果您将文件重命名为“%% a %% c”,则名称将变为“A Name.Supercool.jpg”。

现在,为什么在尝试将文件重命名为无扩展名后,您将其重命名为*.png我不知道,不幸的是,您没有解释。为什么不简单地将.png添加到%%a - 如果这真的是你想要做的那样?

(顺便说一句 - for /f ... dir...方法构建文件的内存列表,然后重命名它们,这样就不会像for %%x in (*.jpg)...那样重新处理它们。

鉴于终端空间名称问题,

for /f "tokens=1-3 delims=)(" %%a in ('dir /b *.jpg') do rename "%%a(%%b)%%c" "%%a%%c"
SETLOCAL enabledelayedexpansion
for /f "delims=" %%a in ('dir /b "* .jpg"') do (
 SET "name=%%a"
 REN "%%a" "!name:~0,-5!.jpg"
)
endlocal

答案 1 :(得分:1)

Magoo的答案更接近我的要求,但文件名中的特殊字符存在问题。 TessellatingHeckler发布了最好的方法作为评论,所以在这里。批处理文件:

[TestMethod]
public void TestMethod(){
    var groupId = "ABC";
    var personId = 1;

    ver personInfo = new PersonInfo()
    {
      Id = personId,
      FirstName = "Sam",
      LastName = "Smith"  
    }

    var groupStub = new Mock<IGroupRepository>;
    groupStub.Setup(x=> x.GetById(groupId)).Returns(new Group(){
            Id = groupId,
            Persons = List<Person>()
            {
                new Person()
                {
                    Id = personId,
                    FirstName = "George",
                    LastName = "Bolton",
                }
            }
        }
    });

    var myClass = new MyClass();
    myClass.Execute(personInfo, groupId);

    var group = groupStub.GetById(groupId);
    var person = group.Persons.First(p=> p.Id == personId);

    Assert.AreEqual(personInfo.FirstName, person.FirstName);
}

有了这个,我可以立刻处理.jpg和.png,完美无缺。谢谢大家。