新手:需要找到一个文件,读取它,然后cd到它的目录

时间:2015-09-04 06:24:47

标签: batch-file

编辑:澄清我要做的是将一些文件移动到应用程序的数据文件夹中。该应用程序安装在Program Files中,但它将数据保存在app数据中。文件夹名称看起来像这样

  

76053ADAJSQDUC4975

问题在于它对于安装的每个应用程序实例以及将使用此批处理的每台计算机都是唯一的。所以我在目录中,它有

  

1AKDHCI4985HF55GHJKB G5586HJFRUK56885KOQQ

识别文件夹的唯一方法是在每个名为

的文件中使用.txt文件
origin.txt

在一行显示应用程序安装目录(C:/ Program Files(x86)/ ********)的文件路径。

我想我可以使用for循环,找到该文件,并阅读它。我不知道该怎么做,找到合适的文件,然后cd到它的目录。第二个问题是,这个批处理文件将由多个用户使用,并非所有安装路径都相同。所以在.txt里面它可能是C:/,D:/,Program Files或Program Files(x86)所以对我来说唯一有用的是最后几个单词。我将如何选择那样的选择性呢?

我目前正在旅行,所以无法立即回答,但如果你们帮助我或指出我正确的方向,我将不胜感激。谢谢

2 个答案:

答案 0 :(得分:0)

首先,如果应用程序安装了一个安装程序,该安装程序会向Windows注册表添加一些内容,以便在下次运行时知道自己(更新/升级/卸载)已安装了哪个版本的应用程序,如果安装了该目录,则最好在注册表中评估此信息,而不是在文件系统中搜索。请参阅Locate if the program exists and set a custom variable in batch windows上的答案。

其次,假设文本文件origin.txt可以在当前用户的应用程序数据目录中的任何位置找到,只包含一次(或最后一个)字符串:\作为目录的一部分,其中包含程序文件的文件应用程序,可以使用以下批处理代码获取目录路径并使其成为当前目录。

@echo off
set "ApplicationDirectory="
for /F "delims=" %%I in ('dir /A-D /B /S "%APPDATA%\origin.txt" 2^>nul') do (
    for /F "delims=" %%D in ('%SystemRoot%\System32\findstr.exe /C:":\\" "%%~I" 2^>nul' ) do (
        if exist "%%~D" (
            set "ApplicationDirectory=%%~D"
            goto ChangeDirectory
        )
    )
)
echo Could not determine directory of application.
goto :EOF

:ChangeDirectory
cd /D "%ApplicationDirectory%"
echo Directory is: %ApplicationDirectory%
set "ApplicationDirectory="

第一个 FOR 循环使用命令 DIR 在用户相关的应用程序数据目录的所有子目录中搜索文件origin.txt。如果找到至少一个这样的文件,则处理内部 FOR 循环。

内部 FOR 循环调用 FINDSTR 在已找到的origin.txt中搜索包含文字字符串:\的所有行,并处理所有找到的行。

对于 FINDSTR 返回的每一行,内部 FOR 循环使用包含:\的行的整个字符串检查是否存在目录(或文件)

在对存在目录(或文件)的肯定检查中立即退出两个循环,并跳转到标签ChangeDirectory,并使用命令在当前驱动器上独立切换当前目录并回显找到的应用程序目录。 / p>

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • cd /?
  • dir /?
  • findstr /?
  • for /?
  • goto /?
  • if /?
  • set /?

注意:如果文件:\可能包含多个路径,我强烈建议您使用更好的搜索字符串运行 FINDSTR ,甚至可以运行正则表达式,而不仅仅是origin.txt

答案 1 :(得分:0)

我最终使用

set "ApplicationDirectory="
for /r "%appdata%" %%a in (origin.txt*) do find "thewordsiwaslookingfor" <"%%a" >nul && set "ApplicationDirectory=%%~dpa"

然后我使用ApplicationDirectory将一些文件移动到该目录中。

对于我想要做的事情,这完美地运作了。