2

我正在创建一个将在服务器上运行的 GPO。在批处理中,我设置了SourcePath=%~0\..一个可以很好地工作的变量,以允许我从与批处理本身运行的位置相同的位置访问文件。

%sourcepath%\Sigcheck\sigcheck.exe /accepteula -q -n "c:\path\file.exe" >fileversion
set /p filever= < fileversion

此代码可以很好地检查file.exe将其放入fileversion. fileversion然后读入变量filever.

所以这段代码做了我想做的一切,但有一个问题。fileversion在 GPO 文件夹 ( %sourcepath%)中创建了一个名为的文件。这没关系,除非多个服务器同时执行批处理,它们都将尝试同时创建此文件并可能覆盖文件或导致错误。一旦值被读入变量filever,就不再需要它,但删除它是不够的,因为两个系统应该能够同时执行脚本。

是否有另一种方法可以将值捕获到不会出现此问题的变量中?我考虑过在前面放置一条本地路径,fileversion以便将其存储在本地,但我不喜欢这个选项。

4

1 回答 1

1

然后不要使用文件,FOR /F而是使用循环直接读取命令的输出。这是一个例子:

FOR /F "delims=" %%L IN (
  '%sourcepath%\Sigcheck\sigcheck.exe /accepteula -q -n "c:\path\file.exe"'
) DO (
  SET "filever=%%L"
)

单引号表示要运行和读取输出的命令。运行命令后,它的输出被循环逐行迭代。

如果输出只包含一行,那么上面的内容就足够了:变量被赋值并且循环终止。如果可能有更多行(并且您只想记住第一行并防止其他行覆盖第一个值),您至少有两个选择:

  1. 仅当变量尚未设置(定义)时才存储值:
SET filever=
FOR /F "delims=" %%L IN (
  '%sourcepath%\Sigcheck\sigcheck.exe /accepteula -q -n "c:\path\file.exe"'
) DO (
  IF NOT DEFINED filever SET "filever=%%L"
)

请注意,需要先取消设置变量(第一行)。

  1. 存储值并跳出循环:
FOR /F "delims=" %%L IN (
  '%sourcepath%\Sigcheck\sigcheck.exe /accepteula -q -n "c:\path\file.exe"'
) DO (
  SET "filever=%%L"
  GOTO out
)

:out

这会记住第一行并强制退出循环,以防止迭代其他行。

FOR /F您可以在内置帮助(FOR /?HELP FOR)中阅读有关循环的更多信息。

于 2013-01-04T17:56:59.980 回答