1

我正在制作一个简单的 *bat 文件,该文件具有拖放功能,用于替换空格()和点(。)作为下划线(_)。

我认为这应该有效,但它没有:

@ECHO OFF
setlocal enabledelayedexpansion
FOR %%f IN (%*) DO (
set filename=%%~nj
set filename=!filename:.=_!
set filename=!filename: =_!
if not "!filename!"=="%%~nf" RENAME "%%f" "!filename!%%~xf"
)

你知道发生了什么事吗?

4

2 回答 2

2

尝试这个:

@ECHO 关闭 &setlocal

FOR %%f IN (%*) DO (
设置“旧名称=%%~ff”
设置“旧名称=%%~nf”
设置“扩展=%%~xf”
setlocal enabledelayedexpansion
设置“文件名=!oldfname:.=_!”
设置“文件名=!文件名:=_!”
如果不是 "!filename!"=="!oldfname!" 重命名“!旧名!” “!文件名!!扩展名!”
本地端
)

将赋值set放在双引号中以保护您的代码免受丑陋字符的影响。稍后在 for 循环中设置delayed expansion以在文件名中保存感叹号和插入符号。

于 2013-05-23T12:22:24.423 回答
0

您的循环变量%%f位于第一行,您将其分配给filename您 use %%j

您的代码应如下所示:

@ECHO OFF
setlocal enabledelayedexpansion
FOR %%f IN (%*) DO (

rem corrected-begin
set filename=%%~nf
rem corrected-end

set filename=!filename:.=_!
set filename=!filename: =_!
if not "!filename!"=="%%~nf" RENAME "%%f" "!filename!%%~xf"
)

此外,您可能希望确保始终如一地去除最终报价。也就是说,循环的最后一行应该是:

if not "!filename!"=="%%~nf" RENAME "%%~f" "!filename!%%~xf"

然后,您不应该隐藏正在移动的文件的目录部分。

if not "!filename!"=="%%~nf" RENAME "%%~dpnxf" "!filename!%%~xf"

在放开代码之前,您可能希望将最后一行替换为以下内容:

if not "!filename!"=="%%~nf" ECHO RENAME "%%~f" "!filename!%%~xf" >> "%TEMP%\test.txt"

然后,在您的拖放操作之后,检查“%TEMP%\test.txt”以查看它是否包含操作,以及您所期望的文件。

作为参考,以下是所有更改后的完整文件:

@ECHO OFF
setlocal enabledelayedexpansion
FOR %%f IN (%*) DO (
    set filename=%%~nf
    set filename=!filename:.=_!
    set filename=!filename: =_!
    rem uncomment  for debugging.
    rem if not "!filename!"=="%%~nf" ECHO RENAME "%%~dpnxf" "!filename!%%~xf" >>     "%TEMP%\test.txt"
    rem comment for debugging.
    if not "!filename!"=="%%~nf" RENAME "%%~dpnxf" "!filename!%%~xf"
)
于 2013-05-23T11:41:22.120 回答