【问题标题】:Batch File- Delete Folder contents and the parent folder批处理文件 - 删除文件夹内容和父文件夹
【发布时间】:2020-05-14 17:02:57
【问题描述】:

我在 BATCH FILE 的开头创建了以下目录来存储临时内容:

"%userprofile%\Downloads\VersionCheckWillDelete"

我希望删除此文件夹及其所有内容。

以下内容仅删除文件夹中的数据,而不删除文件夹本身:

RD /S /Q "%userprofile%\Downloads\VersionCheckWillDelete"

编辑:原来它没有删除它,因为 BATCH 文件仍在使用它。我考虑过 POWERSHELL 仍然打开并试图杀死它,但它没有打开。如何在后台关闭它。它不需要再运行了吗? “该进程无法访问该文件,因为它正被另一个进程使用。”

以下是我的代码:

 @echo off

:version_chk

SET USER_VER=1.1.2-RC

ECHO * * * * * * * * * * * * *
ECHO CHECKING FOR UPDATES...
ECHO * * * * * * * * * * * * *

cd "%userprofile%\Downloads"
    mkdir "%userprofile%\Downloads\VersionCheckWillDelete"

cd "%userprofile%\Downloads\VersionCheckWillDelete"

powershell -Command "Invoke-WebRequest https://github.com/KSanders7070/AIRPORT_ALIAS_CREATION/blob/master/Version_Check -OutFile 'version_check.HTML'"

findstr "VERSION-" "version_check.HTML" >> "GitHub_Version.txt"

cd "%userprofile%\Downloads\VersionCheckWillDelete"

for /f "delims=" %%x in (GitHub_Version.txt) do set GH_VER_STRING_ORIGINAL=%%x

for /f "tokens=2 delims=<" %%x in ("%GH_VER_STRING_ORIGINAL%") do set GH_VER_STRING_FIRST_HALF=%%x

SET "GH_VER=%GH_VER_STRING_FIRST_HALF:*VERSION-=%"

if %USER_VER% == %GH_VER% GOTO NORMAL_PROCESS

:UPDATE_AVAIL

CLS

START "" "https://github.com/KSanders7070/AIRPORT_ALIAS_CREATION/releases"

ECHO * * * * * * * * * * * * *
ECHO     UPDATE AVAILABLE
ECHO * * * * * * * * * * * * *
ECHO.
ECHO.
ECHO GITHUB VERSION: %GH_VER%
ECHO YOUR VERSION:   %USER_VER%
ECHO.
ECHO.
ECHO PLEASE CLOSE THIS BATCH FILE AND GO DOWNLOAD THE MOST RECENT UPDATE AVAILABLE:
ECHO.
ECHO https://github.com/KSanders7070/AIRPORT_ALIAS_CREATION/releases
ECHO.
ECHO.
ECHO OR YOU MAY PRESS ANY KEY TO CONTINUE USING THIS VERSION.
ECHO.
ECHO.

cd "%userprofile%\Downloads"
rd /S /Q "%userprofile%\Downloads\VersionCheckWillDelete\"
PAUSE

:NORMAL_PROCESS

CLS

cd "%userprofile%\Downloads"
rd /S /Q "%userprofile%\Downloads\VersionCheckWillDelete\"

ECHO Your BATCH file is the most up to date version.

PAUSE

【问题讨论】:

    标签: batch-file


    【解决方案1】:

    解决方案: 删除 START“URL”行允许 BATCH 删除文件夹。不知道为什么它依赖于 Chrome,但它解决了这个问题。因此,将 RD 命令放在 START "" 命令之前可以让我一切正常。

    【讨论】:

      【解决方案2】:

      要删除目录,您需要使用此命令。

      rmdir path
      del -f path
      

      【讨论】:

      • 这不适用于 Windows cmd.exe。
      • 'rm' 不是内部或外部命令、可运行程序或批处理文件。
      【解决方案3】:

      首先绝对没有理由将目录更改为%UserProfile%\Downloads\VersionCheckWillDelete。此外,可能没有理由使用Downloads 位置,因为这是%Temp% 目录的用途之一。无论您选择哪个,您只需要它来解析您正在解析的version_check.html 文件,所以为什么不将它直接放入所选位置,而不是创建一个新目录并在之后将其删除。 (这样你只需要在必要时删除文件,我希望在每次运行时,文件都会被覆盖)

      也就是说,我可能会这样做:

      @Echo Off
      Set "USER_VER=1.1.2-RC"
      Echo * * * * * * * * * * * * *
      Echo CHECKING FOR UPDATES...
      Echo * * * * * * * * * * * * *
      Echo(
      If Not Exist "%UserProfile%\Downloads\VersionCheckWillDelete\" MD "%UserProfile%\Downloads\VersionCheckWillDelete"
      %__AppDir__%WindowsPowerShell\v1.0\powershell.exe -NoProfile -Command "Invoke-WebRequest -URI \"https://github.com/KSanders7070/AIRPORT_ALIAS_CREATION/blob/master/Version_Check\" -OutFile \"%UserProfile%\Downloads\VersionCheckWillDelete\version_check.html\""
      For /F "Tokens=3 Delims=><" %%G In ('%__AppDir__%findstr.exe ">VERSION-[0-9]" "version_check.html"') Do For /F "Tokens=1* Delims=-" %%H In ("%%G") Do Set "GH_VER=%%I"
      RD "%UserProfile%\Downloads\VersionCheckWillDelete"
      If "%USER_VER%" == "%GH_VER%" Echo Your batch file is the most up to date version.& GoTo Continue
      ClS
      Echo * * * * * * * * * * * * *
      Echo     UPDATE AVAILABLE
      Echo * * * * * * * * * * * * *
      Echo(
      Echo GITHUB VERSION: %GH_VER%
      Echo YOUR VERSION:   %USER_VER%
      Echo(
      Echo YOU ARE NOT USING THE LATEST VERSION!
      Echo(
      Echo 1. DOWNLOAD THE LATEST VERSION NOW
      Echo 2. CONTINUE USING THIS OUTDATED VERSION
      Echo(
      %__AppDir__%choice.exe /C 12
      If ErrorLevel 2 GoTo Continue
      Echo Your Web Browser will now open on the Releases page and this batch file will close.
      %__AppDir__%timeout.exe /T 5
      Start "" "https://github.com/KSanders7070/AIRPORT_ALIAS_CREATION/releases"
      GoTo :EOF
      
      :Continue
      Echo(
      Echo Continuing . . .
      Pause
      ClS
      

      【讨论】:

      • 请注意@KSanders,您当前的版本显示为1.1.2-RCX,而不是1.1.2-RC,因此您发布的脚本不适用于当前版本。我假设,为了让它工作,你也需要在每个版本中提供一个新版本的脚本。所以请确保你已经考虑到了这一点。同样由于不匹配,请确保您当前所做的任何修改都不是针对旧版本,而不是当前版本。
      • COMPO- 感谢您的这次重组,请原谅我的回复迟到,因为我是新手,没有考虑这类论坛的常见礼仪。我喜欢您的代码不需要将 FINDSTR 导出为文本文件和所有内容的方式。我将听取您关于更改为 TEMP 文件夹的建议。出于对我的其他 BATCH 文件脚本的连续性的原因,我对您提出的建议进行了一些更改,以及一些小的更改,例如考虑到 BAT 的版本可能不以数字开头。
      • 另外,由于某种原因,您的 Powershell webrequest 不喜欢我的变量,所以我已经返回使用我的 powershell。如果您对将来如何处理它有任何建议,我会全力以赴! :D 我确实对我的 BAT 流程创建的文件将被清理感到满意,所以我想我会把 RD 留在那里,除非你看到任何实际的缺点?我在剧本开头和 GH 上的 BAT 版本中特别感谢了你。在此处查看新脚本:github.com/KSanders7070/BATCH_FILE_VERSION_CHECK
      • 感谢@KSanders 的反馈。您能否详细说明“webrequest 不喜欢我的变量”的含义,它可能对我有所帮助,因为该行中使用的唯一变量是 %__AppDir__%,它将始终解析为 %SystemRoot%\System32\ ,(或 %SystemRoor%\SysWOW64\ on一个 64 位系统从一个 32 位 cmd.exe 实例运行),无论您的环境变量有任何更改,以及 %UserProfile%,如果您愿意,您可以允许 PowerShell 扩展,即 $Env:UserProfile。至于 RD 命令是你的决定,我把它留在上面的代码中给你不管。
      • 当我将您的 PS 代码行并用 URL 的变量替换确切的 URL 时,它返回以下错误:字符串缺少终止符:“。+ CategoryInfo : ParserError: ( :) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : TerminatorExpectedAtEndOfString