批处理文件搜索与本地文件同名的文件夹并将所述文件移动到定位的文件夹不起作用
Posted
技术标签:
【中文标题】批处理文件搜索与本地文件同名的文件夹并将所述文件移动到定位的文件夹不起作用【英文标题】:Batch file that searches for a folder with the same name as a local file and moves said file to the located folder not working 【发布时间】:2021-04-18 21:44:06 【问题描述】:所以我正在尝试创建一个批处理文件,该文件将在与批处理文件相同的目录中获取一个 pdf 文件并输出文件名(无扩展名)。我用这段代码来完成这个:
@echo off
for /r "C:\Users\me\Test Folder" %%G in (*.pdf) do set "name=%%~nG"
这很好用。下一步是搜索另一个目录,并在搜索到的目录中找到一个名称与上述代码输出匹配的目录(存储在 %name% 变量中)。这是我尝试过的:
dir "P:\Accounting\Acc Pay" | find %name% | set "loc=%%~dp"
上述代码的目标是只找到与原始 pdf 文件同名的目录,然后将输出的驱动器和路径设置为变量 %loc%。我想这是我搞砸的地方。
一旦文件夹的路径设置为 %loc%,我就应该以这一行结束:
move .\*.pdf %loc%
这将获取包含批处理文件的目录中的所有 pdf 文件(目录中一次只有一个)并将其移动到当前存储在 %loc% 变量中的路径。
整个代码如下所示:
@echo off
for /r "C:\Users\me\Test Folder" %%G in (*.pdf) do set "name=%%~nG"
for /r %%A in ('dir "P:\Accounting\Acc Pay" | find %name%') do set "loc=%%~dpA"
move .\*.pdf %loc%
但是,代码似乎将 pdf 文件移动到它已经存在的相同位置(即包含批处理文件的文件夹)。我假设 %loc% 变量不能正常工作。非常感谢任何帮助。
【问题讨论】:
要搜索的文件夹是否始终是"P:\Accounting\AccPay"
的直接子级,或者它可能被埋在“树下”的某个地方?
它始终是直接子代。在 AccPay 文件夹中有多个文件夹,每个供应商公司一个。这些文件夹中只有文件。
for /r "C:\Users\me\Test" %%G in (*.pdf) do move "%%G" "P:\Accounting\AccPay\%%~nG"
?
或者改用if exist
。例如@For /R "C:\Users\me\Test" %%G In (*.pdf) Do @If Exist "P:\Accounting\AccPay\%%~nG\" Move /Y "%%G" "P:\Accounting\AccPay\%%~nG"
感谢@Stephan,成功了!所以通常情况下,文件名不会与文件夹名完全匹配。相反,文件夹将被命名为这样的名称(示例公司),而 pdf 文件将被命名为这样的名称(示例公司-发票 12345)。无论如何,我仍然可以完成这项工作吗?
【参考方案1】:
就像@Magoo 所说的(^|
)。您肯定想为dir
命令添加以下开关:/b
用于“裸格式”(仅名称)和/ad
用于“属性目录”以仅返回文件夹名称。 find
需要引用它的参数,为了安全起见,move
命令的目的地也应该被引用。您的 find
可以从 /i
中受益,使其不区分大小写。
我个人会使用嵌套循环来避免创建 superflouos 变量:
@echo off
for /r "C:\Users\me\Test Folder" %%G in (*.pdf) do (
for /r %%A in ('dir /b /ad "P:\Accounting\Acc Pay" ^| find /i "%%~nG"') do (
move "%%G" "%%~dpA"
)
)
奖励:如果有多个 .pdf
文件(可能在周末或节假日之后),这将一次性正确处理所有文件。
根据您的命名结构,考虑将find /i "%%~nG"
替换为findstr /iblc:"%%~nG"
(请参阅findstr /?
以了解这些开关的含义)
(注意防止混淆:findstr
是唯一支持将开关连接为一个的命令(据我所知)。/iblc
与 /i /b /l /c
相同)
【讨论】:
以上是关于批处理文件搜索与本地文件同名的文件夹并将所述文件移动到定位的文件夹不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Oracle VirtualBox虚拟系统如何将虚拟硬盘内文件移到新建同名同系统硬盘上(系统无法启动,原硬盘已删除
批处理使用WinRAR压缩某类型的文件,一个文件压缩成一个压缩包,压缩后名称与原文件同名,压缩后删除原文件