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

Batch file DOS批处理脚本工作——几乎:将选定的文件和文件夹移出桌面,batch-file,Batch File,我最近在这里得到了很好的帮助,我非常感激。多亏了这个网站的广博知识,我才能够拼凑出一些代码,这些代码的目的虽然微不足道,但对我的环境来说却很重要 简化的目的和我的问题: 目标:对于当前用户,登录Windows后,将所有文件和文件夹移动到名为“存档”的桌面文件夹中[必要时创建后者]。(移动的内容将根据时间戳放入动态创建的子文件夹中。) 存在的问题:代码无法将桌面文件夹移动到(deskstop)存档文件夹中。(我显然不想移动存档文件夹本身。) 任何见解/解决方案都会非常有用。(PS如果可能的话,我希

我最近在这里得到了很好的帮助,我非常感激。多亏了这个网站的广博知识,我才能够拼凑出一些代码,这些代码的目的虽然微不足道,但对我的环境来说却很重要

简化的目的和我的问题:

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

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

任何见解/解决方案都会非常有用。(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%
::为主桌面存档文件夹建立所需的基本名称
设置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\
    。如果操作系统是用外语安装的,那么在瑞典语中它是
    %USERPROFILE%\Skrivbord
    。询问Windows桌面在哪里每次都获取正确的位置。我的代码就是这样做的
  • PowerShell可以正常处理日期。无需字符串操作,无需WMI调用,只需一个格式化字符串即可获得所需的格式
  • 我使用
    mkdir-Force
    选项,它可以一次将文件夹设置为两个深度,如果文件夹已经存在,它什么也不做。如果不存在,则不需要进行测试,尽管您可以使用
    Test Path
    进行测试。您可以在批处理文件中使用这种方法,mkdir也可以在那里创建多个嵌套文件夹
  • 注意:您的代码有一个bug,您检查
    “%G%\Archives”
    ,但您检查
    mkdir“%G%\%ARCH%
    。如果%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