我最近在这里得到了很好的帮助,我非常感激。由于我们在这个网站上的广泛知识,我已经能够拼凑出一些代码,这些代码在其目的上是微不足道的,但对我的环境很重要。
简化的目的和我的问题:
目标:对于当前用户,在登录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%
谢谢!
答案 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。我的代码就是这样做的。mkdir -Force
选项,它可以一次创建两个级别的文件夹,如果它们已经存在则不会执行任何操作。不需要IF NOT EXIST ...测试,尽管你可以使用Test-Path
进行测试。您可以在批处理文件中使用此方法,mkdir也可以在那里创建多个嵌套文件夹。"%G%\Archives"
但mkdir "%G%\%ARCH%
。如果%ARCH%是可配置的,它们可能会有所不同。这个版本会移动您正在询问您的代码尚未执行的文件夹,并且需要再次滥用for
循环来处理。
这个脚本是代码量的一半,更具可读性,因为它可以直接执行它所需要的而不是漫游到wmi和字符串操作以及用于字符串处理的for
循环,它更正确更多情况,更有弹性,和做你原来没有的额外的事情。
是的,它是一种更大,更复杂的语言 - 它是如何让事情变得更容易,因为它可以直接做更多事情。