重命名 BAT 突然无法正常工作
Renaming BAT suddenly not working correctly
有点奇怪的事情发生在我身上。
几年前,我为我正在从事的项目整理了一个重命名批处理文件(得到了来自不同地方的很多帮助,包括 Whosebug)。
它会重命名一些文件并在它们前面加上父文件夹中的前 5 个字符(即“12345 - Site”)。
我已经好几个月没有使用 BAT 文件了,现在需要,但它不能正常工作。
它正在重命名文件,但它使用的是整个父文件夹,而不仅仅是前 5 个字符。我已经在另一台 PC 上测试过它,运行 它在它以前工作的文件夹中。
有人知道为什么会发生这种情况、如何修复它,或者我可以在批处理文件中添加什么来实现相同的结果吗?
需要指出的是,我是一个完全的新手,花了很多个晚上通过反复试验以及从网络上类似的批处理文件请求中剪切和粘贴来获得第一个批处理文件。
我当前的代码:
for %%z in ("%cd%") do (
for %%a in ("%%~dpz%\.") do (
for /f "delims=" %%i in ('dir /b /a-d *.pdf,*.xlsx,*.docx,*.xlsm') do move "%%i" "%%~nxz %%i"))
这应该适合你。
for %%z in ("%cd%") do (
for %%a in ("%%~dpz%\.") do (
for /f "delims=" %%i in ('dir /b /a-d *.pdf,*.xlsx,*.docx,*.xlsm') do call :renameStuff "%%i" "%%~nxz"
)
)
goto :eof
:renameStuff
set "originalName=%~1"
set "parentFolder=%~2"
echo move "%originalName%" "%parentFolder:~0,5% %originalName%"
exit /b
您要查找的特定位是 %parentFolder:~0,5%
,它采用 %parentFolder% 的子字符串,从字符 0 开始,在 5 个字符后停止。这为您提供了您要查找的前 5 个字符。
棘手的一点是你不能在那些 for
循环 %%z
类型的变量上使用它。因此,您必须将它传递给另一个变量。此外,因为你有一些嵌套循环延迟扩展使得这非常丑陋,所以我将变量传递给子程序(call :renameStuff "%%i" "%%~nxz"
),将它们变成 %1
和 %2
类型变量,然后将其传递给普通变量(set "originalName=%~1"
),这将与之一起使用。
有点奇怪的事情发生在我身上。 几年前,我为我正在从事的项目整理了一个重命名批处理文件(得到了来自不同地方的很多帮助,包括 Whosebug)。 它会重命名一些文件并在它们前面加上父文件夹中的前 5 个字符(即“12345 - Site”)。 我已经好几个月没有使用 BAT 文件了,现在需要,但它不能正常工作。
它正在重命名文件,但它使用的是整个父文件夹,而不仅仅是前 5 个字符。我已经在另一台 PC 上测试过它,运行 它在它以前工作的文件夹中。
有人知道为什么会发生这种情况、如何修复它,或者我可以在批处理文件中添加什么来实现相同的结果吗?
需要指出的是,我是一个完全的新手,花了很多个晚上通过反复试验以及从网络上类似的批处理文件请求中剪切和粘贴来获得第一个批处理文件。
我当前的代码:
for %%z in ("%cd%") do (
for %%a in ("%%~dpz%\.") do (
for /f "delims=" %%i in ('dir /b /a-d *.pdf,*.xlsx,*.docx,*.xlsm') do move "%%i" "%%~nxz %%i"))
这应该适合你。
for %%z in ("%cd%") do (
for %%a in ("%%~dpz%\.") do (
for /f "delims=" %%i in ('dir /b /a-d *.pdf,*.xlsx,*.docx,*.xlsm') do call :renameStuff "%%i" "%%~nxz"
)
)
goto :eof
:renameStuff
set "originalName=%~1"
set "parentFolder=%~2"
echo move "%originalName%" "%parentFolder:~0,5% %originalName%"
exit /b
您要查找的特定位是 %parentFolder:~0,5%
,它采用 %parentFolder% 的子字符串,从字符 0 开始,在 5 个字符后停止。这为您提供了您要查找的前 5 个字符。
棘手的一点是你不能在那些 for
循环 %%z
类型的变量上使用它。因此,您必须将它传递给另一个变量。此外,因为你有一些嵌套循环延迟扩展使得这非常丑陋,所以我将变量传递给子程序(call :renameStuff "%%i" "%%~nxz"
),将它们变成 %1
和 %2
类型变量,然后将其传递给普通变量(set "originalName=%~1"
),这将与之一起使用。