我正在创建一个可在服务器上运行的GPO。
在批处理中,我设置了变量SourcePath=%~0\..
,它可以很好地允许我从与批处理本身运行的位置相同的位置访问文件。
%sourcepath%\Sigcheck\sigcheck.exe /accepteula -q -n "c:\path\file.exe" >fileversion
set /p filever= < fileversion
此代码可以很好地检查将文件file.exe
放入fileversion
的版本。
然后将fileversion
读入变量filever
。
所以这段代码可以完成我想要它做的所有事情,但是有一个问题。在GPO文件夹(fileversion
)中创建名为%sourcepath%
的文件。这可能没问题,除非多个服务器同时执行批处理,他们都会同时尝试创建此文件,并可能覆盖文件或导致错误。一旦将值读入变量filever
,就不再需要它,但删除它是不够的,因为两个系统应该能够同时执行该脚本。
还有另一种方法可以将值捕获到一个不会出现此问题的变量中吗?我想在fileversion
前面放一条本地路径,所以它存储在本地,但我并不热衷于这个选项。
答案 0 :(得分:1)
不要使用文件,而是使用FOR /F
循环来直接读取命令的输出。这是一个例子:
FOR /F "delims=" %%L IN (
'%sourcepath%\Sigcheck\sigcheck.exe /accepteula -q -n "c:\path\file.exe" >fileversion'
) DO (
SET "filever=%%L"
)
单引号表示运行和读取输出的命令。运行该命令后,其输出将逐行循环迭代。
如果输出只包含一行,则上述内容就足够了:变量被赋值并且循环终止。如果可能有更多行(并且您只想记住第一行并阻止其他行覆盖第一个值),则至少有两个选项:
1)仅在变量尚未设置(已定义)时存储该值:
SET filever=
FOR /F "delims=" %%L IN (
'%sourcepath%\Sigcheck\sigcheck.exe /accepteula -q -n "c:\path\file.exe" >fileversion'
) DO (
IF NOT DEFINED filever SET "filever=%%L"
)
请注意,首先需要取消设置变量(第一行)。
2)存储值并跳转到循环外:
FOR /F "delims=" %%L IN (
'%sourcepath%\Sigcheck\sigcheck.exe /accepteula -q -n "c:\path\file.exe" >fileversion'
) DO (
SET "filever=%%L"
GOTO out
)
:out
这会记住第一行并强制退出循环,以防止迭代其他行。
您可以在内置帮助(FOR /F
或FOR /?
)中详细了解HELP FOR
循环。