编辑:为了澄清我要做的是将一些文件移动到应用程序的数据文件夹中。应用程序被安装到程序文件中,但它将数据保存在应用程序数据中。文件夹名看起来像这样
76053 adajsqduc4975
问题是它对于安装的应用程序的每个实例和将使用此批处理的每台计算机都是唯一的。在目录中,有
1 akdhci4985hf55ghjkb G5586HJFRUK56885KOQQ
识别文件夹的唯一方法是在每个文件夹中都有一个名为
的。txt文件。origin.txt
显示了应用程序安装目录(C:/Program Files(x86)/********)的文件路径。
我想我可以使用for循环,找到文件,并读取它。我不知道怎么做,是找到正确的文件,并cd到它的目录。第二个问题是,由于该批处理文件将由多个用户使用,因此并非所有用户的安装路径都相同。所以在。txt中,它可以是C:/, D:/, Program Files或Program Files(x86),所以对我唯一有用的是最后几个单词。我怎么能这么有选择性呢?
我现在正在旅行,所以不能马上回答,但如果你们能帮助我或给我指出正确的方向,我会很感激。由于
首先,如果应用程序安装了一个安装程序,它会在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%System32findstr.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在found origin.txt
中搜索包含文字字符串:
的所有行,并处理所有找到的行。
对于FINDSTR返回的每一行,内部 For 循环检查是否有一个目录(或文件)使用了包含:
的行的整个字符串。
两个循环在检查目录(或文件)是否存在时立即退出,并跳转到标签ChangeDirectory
,使用命令切换当前目录独立于当前驱动器,并回显找到的应用程序目录。
为了理解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。
-
cd /?
-
dir /?
-
findstr /?
-
for /?
-
goto /?
-
if /?
-
set /?
注意:我强烈建议运行FINDSTR,如果文件origin.txt
可以包含多个路径,则使用更好的搜索字符串或甚至正则表达式而不仅仅是:
。
最后使用
set "ApplicationDirectory="
for /r "%appdata%" %%a in (origin.txt*) do find "thewordsiwaslookingfor" <"%%a" >nul && set "ApplicationDirectory=%%~dpa"
然后我使用ApplicationDirectory将一些文件移动到该目录中。
对于我想做的事情来说,它工作得很好。