如何使用批处理脚本将所有文件从所有子文件夹移动到父文件夹。在的代码中,我复制和粘贴,显示如何做到这一点,但我有多个父文件夹,我需要这样做。
原件
@echo off
set "source=C:\some dir\A"
set "dest=F:\other dir\B\"
for /r "%source%" %%d in (*) do move "%%d" "%dest%"
而是像这样。
@echo off
set "source=(Current Parent Folder\All Subfolders)"
set "dest=(Current Parent Folder)"
for /r "%source%" %%d in (*) do move "%%d" "%dest%"
目标是避免每次复制 / 移动时都要编辑批处理文件。
编辑 2:它应该是移动而不是复制。
最好的解决方案是只使用一个存储在用户选择的目录中的批处理文件,并使用SendTo
文件夹中的快捷方式文件为用户选择的文件夹运行批处理文件,方法是在Windows 文件资源管理器中的文件夹上单击辅助(通常是右)指向设备(鼠标)按钮以打开上下文菜单,然后根据子菜单中的主(通常是左)指向设备按钮文件的名称发送到
1.用于文件移动的批处理文件
可以使用以下单个命令行创建一个批处理文件%USERPROFILE%\MoveFilesToFolder.cmd
:
@if not "%~1" == "" for /F "delims=" %%I in ('dir "%~1\*" /AD-L /B /S 2^>nul') do @move "%%I\*" "%~1\"
命令if
和move
剩下的两个@
只是为了避免在执行之前输出解析的命令行,这是在多行批处理文件中完成的@echo off
在批处理文件的顶部。
IF条件评估为 false,如果批处理文件启动时没有将参数字符串传递给批处理文件,或者只将""
传递给批处理文件(空参数字符串),就像双击批处理文件本身一样。
for /F
循环导致在后台启动一个 Windows 命令处理器,除了cmd.exe
进程,该进程已经在处理批处理文件%ComSpec% /c
和命令行在'
作为附加参数。
C:\Windows\System32\cmd.exe /c dir "C:\Temp\Development & Test(!)_100%\*" /AD-L /B /S 2>nul
DIR搜索
在指定的目录C:\Temp\Development & Test(!)_100%
仅适用于包含具有隐藏属性的目录,由于选项/AD-L
(属性目录而不是链接)而忽略连接和目录符号链接
及其所有子目录,因为选项/S
和
由于选项/B
,这意味着由于选项/S
处理后台命令进程的STDOUT,因此只需具有完整路径的文件夹名称。
DIR可能无法找到任何匹配的文件系统条目,因为指定的目录根本没有子目录,或者批处理文件是通过向批处理文件传递文件名而不是目录名来启动的。在这种情况下,将输出到处理STDERR只是DIR的错误消息,该错误消息通过将错误消息重定向到来抑制。
有关2>nul
的说明,请阅读有关Using command redirection operators的 Microsoft 文档。重定向运算符>
必须在FOR命令行上使用插入符号^
转义,以便在 Windows 命令解释器在执行命令FOR之前处理此命令行,该命令使用单独的dir
处理批处理文件的 Windows 命令处理器实例捕获输出到后台命令进程STDOUT的句柄的所有行,并在for /F
逐行处理捕获的输出之前等待其自终止,忽略所有空行。
默认情况下,使用普通空格和水平制表符作为字符串分隔符将每个非空行拆分为子字符串,然后检查第一个空格 / 制表符分隔的子字符串是否以分号(默认行尾字符)开头,在这种情况下,该行被忽略以进行进一步处理,否则仅将第一个子字符串分配给指定的循环变量,然后FOR在其正文中运行命令。
具有完整路径的捕获的文件夹名称不能包含水平制表符,并且在具有完整路径的文件夹名称的开头不能有分号,但是在完全限定的文件夹名称中可以有一个或多个空格。因此,选项delims=
用于定义字符串分隔符的空列表,这会导致每个文件夹名称完全分配给指定的循环变量I
。
命令MOVEmoves 使用当前文件夹名称运行,并将该文件夹中的几乎所有文件移动到传递给具有第一个参数字符串的批处理文件的文件夹中。
命令MOVE不移动
设置隐藏属性或
当前由共享访问被拒绝的应用程序打开,或者
已存在于目标目录中,并且用户在提示时拒绝覆盖目标文件夹中的文件或
已存在于目标目录中,并且用户确认覆盖目标文件夹中的文件,但目标文件夹中的现有文件具有只读属性集。
使用MOVE选项/Y
将避免提示目标文件夹中已存在文件的第三种情况。但是,即使在目标文件夹中与子文件夹中的文件同名的现有文件上使用选项/Y
,也会出现覆盖提示。用户在提示时选择哪个选项并不重要,因为目标文件夹中的只读文件不是。
文件移动完成,只是更新驱动器文件系统的文件分配表。没有文件数据被复制和删除。
可以在 Windows Vista 和较新的 Windows 客户端版本以及 Windows Server 2003 和较新的 Windows 服务器版本上使用:
@if not "%~1" == "" for /F "delims=" %%I in ('dir "%~1\*" /AD-L /B /S 2^>nul') do @%SystemRoot%\System32\robocopy.exe "%%I" "%~1" /MOV /NDL /NFL /NJH /NJS /R:1 /W:1 >nul
ROBOCOPY因此,在使用选项的情况下,所有包含隐藏文件和只读文件的 BOb / i的目标路径都会被向上移动标记为目标文件夹中的现有文件的路径。COb>将所有文件作为参数字符串传递给批处理文件,但请注意,此处发布的使用ROBOi / i
2.文件移动的快捷方式文件
接下来,在用户帐户的SendTo
文件夹中需要一个文件扩展名为.lnk
的快捷方式文件。
可以通过单击批处理文件%USERPROFILE%\MoveFilesToFolder.cmd
上的“使用辅助指向设备”按钮并单击项目桌面(创建快捷方式)上的子菜单发送到中的“使用主指向设备”按钮来创建这样的快捷方式文件。
用户的桌面现在有一个名为MoveFilesToFolder.cmd.lnk
的快捷方式文件,因此文件扩展名.lnk
在桌面上不可见。应首先单击此快捷方式上的辅助指向设备按钮,然后使用上下文菜单重命名将文件名更改为移动文件,后者是子菜单中菜单项的名称。发送。
然后,需要一个辅助指向设备按钮单击快捷方式移动文件以再次打开上下文菜单,然后单击最后一个菜单项属性以打开快捷方式文件的属性窗口。
属性目标应修改为:
%SystemRoot%\System32\cmd.exe /D /E:ON /V:OFF /C "%USERPROFILE%\MoveFilesToFolder.cmd"
属性Start in应该被清除,因此这里指定的目录并不重要,也可以保持原样。它定义了执行cmd.exe
时的当前目录,这对批处理文件并不重要,它的工作与cmd.exe
处理批处理文件的当前目录无关。对于Start in,还可以使用%SystemRoot%\System32
fail
属性Run可以配置为选择Minimized运行cmd.exe
来处理具有最小化窗口的批处理文件。请注意,当最小化窗口没有消失时,命令MOVE会提示用户覆盖文件。在这种情况下,必须恢复窗口并回答提示。可以在批处理文件中使用
用户可以根据个人喜好配置所有其他属性。在单击按钮OK之前,选择一个漂亮的图标将是一个很好的评论。
现在可以使用Ctrl + X版本剪切快捷方式文件,并使用Ctrl + V将其粘贴到打开的文件夹中,方法是在Windows 文件资源管理器的地址栏中输入字符串 用户现在可以单击文件夹上的Windows 文件资源管理器中的辅助指向设备按钮,然后单击菜单项移动文件上的子菜单发送到中打开的上下文菜单。 用户可以控制 可能发生的情况是,用户单击文件上的辅助指向设备按钮,然后错误地单击上下文子菜单Send to中的菜单项Move files,而不是真正单击的菜单项。在这种情况下,批处理文件被设计为不执行任何操作,这是由于错误地使用完全限定的文件名作为参数字符串运行批处理文件造成的。%APPDATA%\Microsoft\Windows\SendTo
,然后在 Windows 上单击RETURN
3.如何使用快捷方式和批处理文件?
explorer.exe
现在调用 Windows 内核库函数CreateProcess,以运行cmd.exe
,其中所有参数都是在快捷方式文件中用属性Target指定的,并在末尾附加单击的文件夹的完全限定名称作为附加参数。属性Start in在快捷方式文件中定义了lpCurrentDirectory
中的其他cmd
如何开始处理批处理文件,使用快捷方式文件,这就是为什么我建议永远不要直接在桌面上使用批处理文件的原因,在 Windows 开始菜单中,或在特殊文件夹中,如SendTo
或Startup
。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(13条)