2017-03-15 98 views
0

我正在编写代码以便将文件夹中的* .mp3文件重新命名为上级文件夹,并将文件夹名称添加到文件名中。此代码似乎适用于不包含空格的文件夹名称,但不以其他方式工作。我该怎么办?包含用作批处理文件脚本中变量的空格的文件和文件夹名称

的Windows 8 - bathfile 我的代码:

@ECHO OFF 
for /D %%f in (*.) do call c:\users\sina\documents\renamemp3.bat "%%f" 

这个调用(renamemp3.bat):

cd %1 
if ERRORLEVEL 1 goto end 
for %%f in (*.mp3) do move %%f "..\%1(%%f).mp3" 
cd .. 
:end 
+0

我应该在哪里加引号?移动“%% f”“.. \%1(%% f).mp3”不起作用! – Sina

回答

0
@ECHO OFF 
for /D %%f in (*.) do call c:\users\sina\documents\renamemp3.bat "%%~ff" 

这个调用(renamemp3.bat):

@Echo off&Setlocal 
cd /d "%~1" 
if ERRORLEVEL 1 goto end 
for %%f in (*.mp3) do move "%%f" "..\%~n1(%%~nxf).mp3" 
cd .. 
:end 

你应该采取看看在/精氨酸变量'~call /?for /?

0

A到脚本一些改动本已提供

主要脚本:

@For /D %%A In (*) Do @Call "%UserProfile%\Documents\renamemp3.bat" "%%~fA" 

renamemp3.bat

@Echo Off 
If /I Not "%CD%"==%1 (PushD %1 2>Nul && (Set _=T)||Exit/B) 
For %%A In (*.mp3) Do Move "%%A" "..\%~n1(%%~nA)%%~xA" 
If "%_%"=="T" (Set "_=" & PopD) 
GoTo :EOF 
0

下面是一些可能有所帮助的建议:

  • 在文件和目录路径周围加上引号""
  • 使用~修饰符for变量(如%%~f)和论点引用(如%~1)时,他们可能含有封闭""
  • 避免相对路径,尤其是涉及多个批处理文件时(例如,运行于call)。考虑使用~f修饰符for变量和参数引用来返回完整的绝对路径。
  • 要检索纯基本名称和文件或目录的扩展名,请始终分别指定~n~x修饰符(或组合:~nx),for变量或参数引用。
  • 考虑使用pushdpopd临时更改工作目录。 (尽管如此,如果您坚持使用cd,请添加/D开关以便在必要时更改驱动器。)
  • 使用以下set语法:set "VAR=Value";所以引号不是价值的一部分。只有在读取时才用引号将值包围。 (我知道你没有在你的代码中使用set,但我想提到这一点。)

已经应用这些规则,以你的代码,它可能是这样的:

主要批处理文件:

@echo off 
for /D %%f in (*.) do call "c:\users\sina\documents\renamemp3.bat" "%%~ff" 

子脚本renamemp3.bat

rem // This replaces `cd /D "%~1"`: 
pushd "%~1" 
if ErrorLevel 1 goto end 
for %%f in (*.mp3) do move "%%~f" "..\%~nx1(%%nxf).mp3" 
rem // This replaces `cd ..`: 
popd 
:end 

文件renamemp3.bat可以简化:

rem /* The `&&` operator lets the following command (block) execute only in case 
rem the preceding one succeeded, hence its exit code equals zero: */ 
pushd "%~1" && (
    for %%f in (*.mp3) do move "%%~f" "..\%~nx1(%%nxf).mp3" 
    popd 
) 
:end 

甚至是这样的:

rem // Using absolute paths directly prevents from having to change the working directory: 
for %%f in ("%~1\*.mp3") do move "%%~f" "%~f1(%%nxf).mp3" 
:end 
相关问题