DOS批处理脚本工作 - 几乎:将选定的文件和文件夹移出桌面

时间:2016-05-06 22:54:39

标签: batch-file

我最近在这里得到了很好的帮助,我非常感激。由于我们在这个网站上的广泛知识,我已经能够拼凑出一些代码,这些代码在其目的上是微不足道的,但对我的环境很重要。

简化的目的和我的问题:

目标:对于当前用户,在登录Windows后,将所有文件和文件夹移动到名为" Archive"的桌面文件夹中。 [必要时创建后者]。 (移动的内容将根据时间戳放入动态创建的子文件夹中。)

现有问题:代码无法将桌面文件夹移动到(deskstop)存档文件夹中。 (我显然不想移动Archive文件夹本身。)

任何见解/解决方案都会非常有帮助。 (PS,如果可能的话,我希望保留DOS bat文件与更复杂的语言。)

我当前的.BAT文件[注意 - 许多变量用于初始调试]:

++++++++++++++++++++++++++++

:: 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%

谢谢!

2 个答案:

答案 0 :(得分:0)

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以使其实际移动文件。

获取doc文件夹,该文件夹始终称为桌面(资源管理器通过desktop.ini文件将本地化名称替换为实名)

for /f "skip=2 tokens=3" %A in ('Reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "Personal"') do set doc=%A

在批处理文件中使用%%A

答案 1 :(得分:0)

  

(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

真的是#34;更复杂&#34;比你的原始代码?

  • 您的原始代码猜测%USERPROFILE%\Desktop是桌面 - 如果桌面被重定向,那么它是错误的,可能是\\fileserver\users\username\desktop\。如果操作系统是用外语安装的,那就不正确了,瑞典语%UserProfile%\Skrivbord。询问桌面每次都能获得正确位置的Windows。我的代码就是这样做的。
  • PowerShell理智地处理日期。没有字符串操作,没有WMI调用,一个格式化字符串,你想要什么格式。
  • 我使用mkdir -Force选项,它可以一次创建两个级别的文件夹,如果它们已经存在则不会执行任何操作。不需要IF NOT EXIST ...测试,尽管你可以使用Test-Path进行测试。您可以在批处理文件中使用此方法,mkdir也可以在那里创建多个嵌套文件夹。
  • NB。您的代码有一个错误,您检查"%G%\Archives"mkdir "%G%\%ARCH%。如果%ARCH%是可配置的,它们可能会有所不同。

这个版本会移动您正在询问您的代码尚未执行的文件夹,并且需要再次滥用for循环来处理。

这个脚本是代码量的一半,更具可读性,因为它可以直接执行它所需要的而不是漫游到wmi和字符串操作以及用于字符串处理的for循环,它更正确更多情况,更有弹性,做你原来没有的额外的事情。

是的,它是一种更大,更复杂的语言 - 它是如何让事情变得更容易,因为它可以直接做更多事情。