Batch file DOS批处理脚本工作——几乎:将选定的文件和文件夹移出桌面
我最近在这里得到了很好的帮助,我非常感激。多亏了这个网站的广博知识,我才能够拼凑出一些代码,这些代码的目的虽然微不足道,但对我的环境来说却很重要 简化的目的和我的问题: 目标:对于当前用户,登录Windows后,将所有文件和文件夹移动到名为“存档”的桌面文件夹中[必要时创建后者]。(移动的内容将根据时间戳放入动态创建的子文件夹中。) 存在的问题:代码无法将桌面文件夹移动到(deskstop)存档文件夹中。(我显然不想移动存档文件夹本身。) 任何见解/解决方案都会非常有用。(PS如果可能的话,我希望保留DOS bat文件和更复杂的语言。) 我当前的.BAT文件[注意-许多变量用于初始调试]: ++++++++++++++++++++++++++++Batch file DOS批处理脚本工作——几乎:将选定的文件和文件夹移出桌面,batch-file,Batch File,我最近在这里得到了很好的帮助,我非常感激。多亏了这个网站的广博知识,我才能够拼凑出一些代码,这些代码的目的虽然微不足道,但对我的环境来说却很重要 简化的目的和我的问题: 目标:对于当前用户,登录Windows后,将所有文件和文件夹移动到名为“存档”的桌面文件夹中[必要时创建后者]。(移动的内容将根据时间戳放入动态创建的子文件夹中。) 存在的问题:代码无法将桌面文件夹移动到(deskstop)存档文件夹中。(我显然不想移动存档文件夹本身。) 任何见解/解决方案都会非常有用。(PS如果可能的话,我希
:: Establish desired base name for the primary desktop archive folder
set ARCH=Archives
:: Establish logged in user path to desktop
set G=%USERPROFILE%\Desktop
:: Now, if "Archives" folder does not yet exist on desktop, create it
if not exist "%G%\Archives" mkdir "%G%\%ARCH%
:: Consolidate pathname <user\desktop\Archives> into single variable (TARGET)
set TARGET=%G%\%ARCH%
:: Create [date+time specific] subfolder name -- two steps - build string, then assign
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%" & set "MS=%dt:~15,3%"
:: Set variable to hold new name Archives\Saved-<time-specific-subfolder> in final form
set "savedirname=Saved-%YYYY%-%MM%-%DD%-%HH%-%Min%-%Sec%"
:: Finally, append new foldername to user-specfic path (TARGET)
set MoveTo=%TARGET%\%savedirname%
:: Create final targeted destination folder - complete pathname
mkdir %MoveTo%
:: Move all desktop files/folders EXCEPT the Archives folder into the targeted destination
for %%i in (%G%\*.*) do move %%i %MoveTo%
::为主桌面存档文件夹建立所需的基本名称
设置ARCH=存档
::建立登录到桌面的用户路径
设置G=%USERPROFILE%\Desktop
::现在,如果桌面上还不存在“存档”文件夹,请创建它
如果不存在“%G%\Archives”mkdir“%G%\%ARCH%
::将路径名合并为单个变量(目标)
设置目标=%G%\%ARCH%
::创建[日期+特定时间]子文件夹名称--两个步骤-生成字符串,然后分配
对于/f“tokens=2 delims==”('wmic OS Get localdatetime/value')中的%%a,请设置“dt=%%a”
设置“YY=%dt:~2,2%”和设置“yyy=%dt:~0,4%”和设置“MM=%dt:~4,2%”和设置“DD=%dt:~6,2%”
设置“HH=%dt:~8,2%”和设置“Min=%dt:~10,2%”和设置“Sec=%dt:~12,2%”和设置“MS=%dt:~15,3%”
::设置变量以保存新名称存档\已保存-最终形式
设置“savedirname=已保存-%YYYY%-%MM%-%DD%-%HH%-%Min%-%Sec%”
::最后,将新foldername附加到用户指定路径(目标)
将MoveTo设置为=%TARGET%\%savedirname%
::创建最终目标文件夹-完整路径名
mkdir%MoveTo%
::将除存档文件夹外的所有桌面文件/文件夹移动到目标目标中
对于%%i in(%G%\*.*)请移动%%i%MoveTo%
谢谢大家!
set fldr="%userprofile%\desktop\archive\%date:/=%%time::=%"
md %fldr%
For /f "delims=" %A in ('dir /a-d /b "%userprofile%\desktop" ^| Findstr /I /v /c:"archive"') Do @echo move "%userprofile%\desktop\%A" %fldr%
以上就是你所需要的
Batch不是一种编程语言,尽管IBM工程师添加了类似编程的功能
它设计用于复制文件和启动程序。如果用作编程语言,它将成为一种愚蠢的语言
在批处理文件中使用%%A
。删除Echo
,使其实际移动文件
获取文档文件夹,该文件夹始终称为桌面(资源管理器通过desktop.ini文件将本地化名称替换为真实名称)
在批处理文件中使用%%A
(PS如果可能的话,我希望保留DOS bat文件和更复杂的语言。)
这不是您要求的答案,但这是PowerShell(v4)代码,用于实现代码的功能:
$arch = "Archives"
$desktop = [Environment]::GetFolderPath("Desktop")
$saveDirName = Get-Date -f "yyyy-MM-dd-hh-mm-ss"
$target = "$desktop\$arch\$saveDirName"
mkdir $target -Force
dir $desktop | where Name -ne $arch | Move-Item -Destination $target -Force
它真的比原始代码“更复杂”吗
- 您的原始代码猜测
是桌面-如果桌面被重定向,这是不正确的,它可能是%USERPROFILE%\Desktop
。如果操作系统是用外语安装的,那么在瑞典语中它是\\fileserver\users\username\Desktop\
。询问Windows桌面在哪里每次都获取正确的位置。我的代码就是这样做的%USERPROFILE%\Skrivbord
- PowerShell可以正常处理日期。无需字符串操作,无需WMI调用,只需一个格式化字符串即可获得所需的格式
- 我使用
选项,它可以一次将文件夹设置为两个深度,如果文件夹已经存在,它什么也不做。如果不存在,则不需要进行测试,尽管您可以使用mkdir-Force
进行测试。您可以在批处理文件中使用这种方法,mkdir也可以在那里创建多个嵌套文件夹Test Path
- 注意:您的代码有一个bug,您检查
,但您检查“%G%\Archives”
。如果%ARCH%是可配置的,则它们可能会有所不同mkdir“%G%\%ARCH%
for
循环来处理
这个脚本是代码量的一半,可读性更高,因为它直接执行它所需要的操作,而不是游荡到wmi和字符串操作以及for
循环以进行字符串处理,它在更多情况下更正确,更具弹性,并且做了原始脚本没有做的额外事情
是的,它是一种更大、更复杂的语言-这就是它使您的工作更简单的原因,因为它可以直接做更多的事情。它实际上不是“DOS”批处理文件,因为您在Windows上工作显然。。。无论如何,您使用的是一个只枚举文件的
for
循环;要枚举目录,请使用第二个for
循环,但要提供/D
开关(在命令提示符中键入for/?
以获取详细信息);这还将返回存档
文件夹,因此您需要使用if/I
语句将其排除(键入if/?
以获取帮助;我建议使用/I
开关以文件/dir的形式进行不区分大小写的比较。Windows上的名称也不区分大小写)感谢您5月6日提出的富有洞察力的建议。不幸的是,我已经离开了几天,现在才回到这个话题上。我一直在试图破译额外的for循环来获取目录(不是文件),但是我很难准确地理解如何指定“除FOLDERX之外的所有文件夹将文件夹移动到…”。你能再给我讲讲我需要的synatx吗?非常感谢-SaguaroI正在考虑中的/D%%j(“%G%\*”)如果/I不“%%j”==”归档文件“移动”%%~j”“%MoveTo%”的话怎么办;您应该对%%i
循环使用相同的报价;另一件事:在您的行中,如果不存在“%G%\Archives”mk
$arch = "Archives"
$desktop = [Environment]::GetFolderPath("Desktop")
$saveDirName = Get-Date -f "yyyy-MM-dd-hh-mm-ss"
$target = "$desktop\$arch\$saveDirName"
mkdir $target -Force
dir $desktop | where Name -ne $arch | Move-Item -Destination $target -Force