【问题标题】:.bat script to Search all drives for existing subfolder.bat 脚本在所有驱动器中搜索现有子文件夹
【发布时间】:2015-05-05 20:21:05
【问题描述】:

目前我有这个:

for %%d in (c d e f g h i j k l m n o p q r s t u v w x y z) do (
   if exist "%%d\Program Files (x86)\Folder": (
        cd "%%d\Program Files (x86)\Folder\subfolder\file"
         )
)

但它似乎不起作用。我希望批处理脚本搜索驱动器中是否存在某个程序的子文件夹,然后 cd 到 .ini 文件的位置(如果有的话)。该文件也可能位于 /program files/ 以外的位置,即它可能位于 driveletter:\Folder。

非常感谢任何帮助!

【问题讨论】:

  • 你有programfiles(x86)programfiles变量,你不需要遍历所有字母...
  • 我将其放入 cmets 是因为您特别要求提供 .bat 文件,但我建议您改为考虑使用 powershell
  • 该文件可能不在其中任何一个中,这是一个示例。
  • 出于安全原因,这些机器上不允许使用 Powershell :( 如果是我会使用它。

标签: windows batch-file scripting


【解决方案1】:

您的代码存在一些问题:

  • 冒号位于驱动器号之后。
  • 如果您的 CD 命令正在更改活动驱动器,则必须使用 /D 选项。
  • 如果“文件夹”结果是文件名而不是文件夹名,您的逻辑将失败
  • 您无需费心去验证子文件夹是否存在
  • 您不能像伪代码所暗示的那样将 CD 写入文件

以下更改应该有效:

for %%d in (c d e f g h i j k l m n o p q r s t u v w x y z) do (
  if exist "%%d:\Program Files (x86)\Folder\subfolder\" (
    cd /d "%%d:\Program Files (x86)\Folder\subfolder"
  )
)

但是有一个更好的方法 - 您可以简单地尝试 CD 而不验证文件夹的存在,并将任何错误消息重定向到 null。

for %%d in (c d e f g h i j k l m n o p q r s t u v w x y z) do (
  cd /d "%%d:\Program Files (x86)\Folder\subfolder" 2>nul
)

如果要检测CD最终是否成功,可以使用&&有条件地跳出循环,成功时ERRORLEVEL为0,失败时为1。

for %%d in (c d e f g h i j k l m n o p q r s t u v w x y z) do (
  cd /d "%%d:\Program Files (x86)\Folder\subfolder" 2>nul && goto :break
)
:break
if %errorlevel% equ 0 (
  echo SUCCESS
) else (
  echo FAILURE
)

除了检测成功/错误之外,如果子文件夹存在于两个不同的驱动器上,则与最后一个选项还有另一个区别。前两个选项最终 CD 到最后找到的子文件夹。最后一个选项将 CD 放入第一个找到的子文件夹。

【讨论】:

  • 这非常有帮助,谢谢!快速提问:如果该文件夹不在程序文件\文件夹中,而是在 %%d:\文件夹中,那么再次放入此循环是否有意义,或者我可以对两个可能的位置进行条件检查吗?
  • 您可以自己尝试一下,看看会发生什么;-) 您应该先尝试各种测试条件(有意创建各种测试场景),然后再下结论。我会将两个 CD /D 命令放在一个循环中。您可以使用任何一种形式,带或不带条件 GOTO :BREAK。
  • 我想出了一些可行的方法,然后如果找不到它会提示用户提供正确的安装位置。现在我需要弄清楚如何正确解决提示...
【解决方案2】:
if exist "%programfiles(x86)%\Folder\subfolder\file" (

    echo it's alive!

)

这行得通吗?为什么要遍历所有这些字母?

【讨论】:

  • 我需要搜索每个驱动器,并且可能不知道将运行它的机器上存在的所有驱动器。根据返回的响应,我需要 CD 到正确驱动器上的文件夹。该文件夹不会存在于任何其他驱动器上,因为它是一个安装位置——我需要确定程序安装到哪个驱动器。
  • @VioletSmith - %SYSTEMDRIVE% 将指向程序文件所在的驱动器。
  • 在这个用例中,文件所在的目录可能不是程序文件夹。例如,它也可以在 F:\Folder\files 中。
【解决方案3】:

在 Windows 中,您应该使用环境变量来访问程序文件夹,因此您不必检查现有驱动器。

查看http://ss64.com/nt/syntax-variables.html 或在命令提示符中输入set

在您的情况下,您应该使用%ProgramFiles(x86)%

【讨论】:

  • 如果文件存在于 (driveletter)\Folder 中,这会起作用吗?所以它将是 %folder\subfolder\file
猜你喜欢
  • 2017-07-29
  • 2015-10-21
  • 2011-12-07
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-04
相关资源
最近更新 更多