Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows .bat脚本,用于在所有驱动器中搜索现有子文件夹_Windows_Batch File_Scripting - Fatal编程技术网

Windows .bat脚本,用于在所有驱动器中搜索现有子文件夹

Windows .bat脚本,用于在所有驱动器中搜索现有子文件夹,windows,batch-file,scripting,Windows,Batch File,Scripting,目前我有: 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文件的

目前我有:

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:\文件夹中

非常感谢您的帮助

if exist "%programfiles(x86)%\Folder\subfolder\file" (

    echo it's alive!

)

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

在Windows中,您应该使用环境变量访问program files文件夹,这样就不必检查现有驱动器

查看或在命令提示下输入
set


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

您的代码有一些问题:

  • 冒号位于驱动器号之后
  • 如果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。

您有
程序文件(x86)
程序文件
变量,您不需要遍历所有字母…我将其放在注释中,因为您特别要求
.bat
文件,但是我鼓励你去考虑。文件可能不在其中之一,这是一个例子。出于安全原因,Powershell不允许在这些机器上使用:(如果是,我将使用它。我需要搜索每个驱动器,可能不知道它将运行的计算机上存在哪些驱动器。根据返回的响应,我需要将CD刻录到正确驱动器上的文件夹。该文件夹将不存在于任何其他驱动器上,因为它是一个安装位置--我需要确定程序安装在哪个驱动器上总计为。@VioletSmith-%SYSTEMDRIVE%将指向程序文件所在的驱动器。在这种情况下,文件所在的目录可能不是程序文件文件夹。例如,它也可能位于F:\folder\files中。如果文件存在于(drivelette)中,这是否可行\文件夹?因此它将是%Folder\subfolder\File这非常有用,谢谢!快速问题:如果文件夹不在program files\Folder中,而是在%%d:\Folder上,那么再次放入此循环是否有意义,或者我是否可以对两个可能的位置进行条件检查?您可以自己尝试,看看会发生什么;-)您应该尝试各种测试条件(有意创建各种测试场景)在你下结论之前。我会在一个循环中放置两个CD/D命令。你可以使用任意一种形式,带或不带条件GOTO:BREAK。我想出了一些可行的方法,然后在用户找不到正确的安装位置时提示用户。现在我需要弄清楚如何正确解决提示。。。