【问题标题】:Reading data from a .txt file in BATCH file从 BATCH 文件中的 .txt 文件中读取数据
【发布时间】:2019-01-08 22:07:17
【问题描述】:

我一直在尝试制作一个程序(.bat,然后我将其转换为 .exe),该程序复制并运行软件安装程序以在大量计算机上安装特定程序,但我也制作它使用任何文件并制作一个 .txt 文件来告诉 .bat 文件如何执行 xcopy 命令...

所以...我需要帮助来读取 BATCH 文件中的 .txt 文件

这是我的代码的一部分,没有运行和删除的东西:

@echo off

echo Running...

for /f "Delims=1" %%a in (settings.txt) do (
set settings1=%%a
)
set file_org=%settings1%

for /f "Delims=2" %%b in (settings.txt) do (
set settings2=%%b
)
set file_dest=%settings2%

echo Copying %file_org% to %file_dest% ...
xcopy /y %file_org% %file_dest% >nul
echo Copied %file_org% to %file_dest% succesfuly!
pause

这就是 .txt 文件正确时的样子:

F:\test
C:\Users\%username%\Desktop

第一行是它将复制的文件的来源 第二行是将复制到的文件的目标

是的,这是要在U盘上运行,其实就像我之前说的,就是转移、运行、删除U盘的安装程序,让海量软件的安装速度快很多。

让我告诉你整个事情是如何运作的:

  1. 配置 settings.txt 文件
  2. 将摇杆插入带有所需程序和我的小 .bat 文件的 PC
  3. 运行它!
  4. 使用程序继续安装过程
  5. 我的软件删除了安装程序
  6. 从 PC 中取出记忆棒(为安全起见,请不要忘记弹出 USB ;))
  7. 在另一台计算机上重复这个非常短的过程

所有这些都节省了时间,因为您不必每次都去获取安装程序,只需配置一次并继续安装... :)

我也喜欢把东西弄得很漂亮所以...请不要给我乱七八糟的东西... :)

谢谢你,提前, 来自法国的爱, ILTP -_-

【问题讨论】:

  • 我打算将此添加到我的答案中,但从技术上讲,它与问题或答案无关。在您的settings.txt 文件示例中,如果您使用用户Desktop 位置的环境变量,我建议%UserProfile%\Desktop,而不是C:\Users\%username%\Desktop
  • 此外,如果源文件%file_org% 与批处理文件位于同一 USB 驱动器上,则无需对驱动器号进行硬编码。您可以改为查看修饰符,例如%~d0\test,无论分配给哪个字母,它都应该引用驱动器。
  • 最后的建议,不要使用一些无意义的包装器来假装你的批处理文件不是批处理文件。它不仅会将您的批处理文件提取到一个临时位置,可能在用户 PC 上,这可能会干扰我在之前的评论中提供的建议,它还可能导致他们的防病毒/反恶意软件出现问题.

标签: file batch-file copy paste delete-file


【解决方案1】:

您的代码遇到的主要问题是滥用Delims=。总之,这将告诉for loop 循环作为标记之间分隔的一部分。这方面的一个例子是 Hello1My1Name1Is1John... Delims=1 将删除 1 并允许您根据 tokens=1,2,3,4,5 将它们分开所以 %%A = Hello, %%B = My,除外

在这方面真正能帮助您的是一个名为skip= 的运算符。这将通过跳过 x 数量的第一个结果来限制结果。所以..

for /f "Tokens=*" %%a in (settings.txt) do (
    set file_org=%%a
)

for /f "Tokens=* Skip=1" %%a in (settings.txt) do (
    set file_dest=%%a
)

但是,有一种更简单的方法可以做到这一点。由于您可以控制文本文件的格式,我们可以通过从文本文件的一行中抓取字符串名称和数据来限制代码并使其更加专业。

为此,我们可以使用file_org=F:\test 格式。要在循环中调用它们,将使用带有tokens=1,2* delims== 的非常简单的for 循环。请记住,特别是对于文件夹/文件位置,您引用您的 set 语句。例如,set "file_dest=%settings2%"。进一步注意,不要害怕将主字符串设置在它自己的循环内。我明白您为什么要这样做,因为您想获取最新结果,但是通过正确的循环设置,您将不需要这样做!

复制.Bat:

@ECHO OFF

Rem | Set strings based of whats in config
for /F "tokens=1,2* delims==" %%A in (Settings.ini) do (
    Set "%%A=%%B"
)

echo Copying %file_org% to %file_dest% ...
xcopy /y %file_org% %file_dest% >nul
echo Copied %file_org% to %file_dest% succesfuly!

pause

Settings.ini:(命名为 .ini 用于自我偏好。.txt 也可以使用)

file_org=F:\test
file_dest=C:\Users\%username%\Desktop

有关任何命令的帮助,请执行以下操作:

  • call /?
  • set /?
  • for /?
  • if /?
  • find /?
  • 等等。

【讨论】:

  • 您的 for /F 示例演示了 skip 选项将为两个循环提供第二行(假设有两行),除非您在适用的行之后以 goto 离开循环阅读或者你会做if not defined file_org set file_org=%%a...
  • @aschipfl 是的,一旦找到结果,您将需要退出循环或使用 if 语句。这是纯粹的演示,我希望OP可以将两个和两个放在一起。
【解决方案2】:

我会尝试执行将文件的第一行和第二行读入如下变量的任务:

@Echo Off
Echo Running ...
(Set /P "file_org="
    Set /P "file_dest=")<"settings.txt"
Echo Copying %file_org% to %file_dest% ...
XCopy "%file_org%" "%file_dest%" /Y >Nul 2>&1 && (
    Echo Copied %file_org% to %file_dest% succesfully!)
Pause

希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 2018-11-23
    • 2012-02-08
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    相关资源
    最近更新 更多