Я в группе, которая строит машины с использованием исходного компьютера и копирует определенные c программные пакеты на целевой компьютер. Это сделано для миграции обновления ОС. Машины собираются за пару месяцев до миграции, и иногда программное обеспечение в исходном коде обновляется без предварительного уведомления, что делает целевую машину устаревшей. Я пытаюсь создать инструмент для проверки исполняемых версий на исходном и целевом компьютерах и сравниваю их. Если исходный компьютер отличается от целевого компьютера, то я записываю в специальный файл ошибок, а также в файл, указанный машиной c. Причина этого заключается в том, что пользователь инструмента будет иметь только один файл для работы вместо сотен, а также хранить отдельные файлы машин.
Когда я запускаю пакетный файл с именем машины, жестко закодированным в циклах это прекрасно работает Ниже приведен пример этого:
if exist "\\MachineName\C$\!source!\Software\Software.exe" (
cls
echo Checking XXX 64 Bit for MachineName and MachineName2
echo.>>%FileVersions%\MachineName2_Versions.txt
For /F "Tokens=1* Delims==" %%A In (
'WMIC /NODE:"MachineName" DataFile Where "Name='C:\\!source!\\Software\\Software.exe'" Get Version /Value 2^>Nul'
) Do For /F "Tokens=*" %%C In ("%%B") Do Set "val1=%%C"
For /F "Tokens=1* Delims==" %%A In (
'WMIC /NODE:"MachineName2" DataFile Where "Name='C:\\!target!\\Software\\Software.exe'" Get Version /Value 2^>Nul'
) Do For /F "Tokens=*" %%C In ("%%B") Do Set "val2=%%C"
if %val1% == %val2% (
echo "XXX 64 Bit %mydate%%mytime%">>%FileVersions%\MachineName2_Versions.txt
echo MachineName XXX 64 Bit Version = %val1%>>%FileVersions%\%%h_Versions.txt
echo MachineName2 XXX 64 Bit Version = %val2%>>>>%FileVersions%\MachineName2_Versions.txt
echo.>>%FileVersions%\MachineName2_Versions.txt
) else (
echo "XXX 64 Bit %mydate%%mytime%">>%AllFailures%\VersionFailures.txt
echo MachineName XXX 64 Bit Version = %val1%>>%AllFailures%\VersionFailures.txt
echo MachineName2 XXX 64 Bit Version = %val2%>>%AllFailures%\VersionFailures.txt
echo.>>%FileVersions%\%AllFailures%\VersionFailures.txt
echo MachineName XXX 64 Bit Version = %val1%>>%FileVersions%\%%h_Versions.txt
echo MachineName2 XXX 64 Bit Version = %val2%>>>>%FileVersions%\MachineName2_Versions.txt
echo.>>%FileVersions%\MachineName2_Versions.txt
)
)
Когда я вкладываю этот l oop в другой для l oop для оценки нескольких машин, происходит сбой с «Синтаксис команды неверен». Я предполагаю, что ошибка касается строки кода WMI C. Я пробовал много способов использования кавычек (или не используя их), но все равно получаю ту же ошибку. Чего мне не хватает в этом? У кого-нибудь есть идеи, как заставить этот l oop работать на нескольких машинах?
for /f "Tokens=1,2,3 delims=," %%g in (%file%) do (
if exist "\\%%g\C$\!source!\Software\Software.exe" (
cls
echo XXX 64 Bit for %%g and %%h
echo.>>%FileVersions%\%%h_Versions.txt
For /F "Tokens=1* Delims==" %%A In (
'WMIC /NODE:"%%g" DataFile Where "Name='C:\\!source!\\Software\\Software.exe'" Get Version /Value 2^>Nul'
) Do For /F "Tokens=*" %%C In ("%%B") Do Set "val1=%%C"
For /F "Tokens=1* Delims==" %%A In (
'WMIC /NODE:"%%h" DataFile Where "Name='C:\\!target!\\Software\\Software.exe'" Get Version /Value 2^>Nul'
) Do For /F "Tokens=*" %%C In ("%%B") Do Set "val2=%%C"
if %val1% == %val2% (
echo "XXX 64 Bit %mydate%%mytime%">>%FileVersions%\%%h_Versions.txt
echo %%g XXX 64 Bit Version = %val1%>>%FileVersions%\%%h_Versions.txt
echo %%h XXX 64 Bit Version = %val2%>>>>%FileVersions%\%%h_Versions.txt
echo.>>%FileVersions%\%%h_Versions.txt
) else (
echo "XXX 64 Bit %mydate%%mytime%">>%AllFailures%\VersionFailures.txt
echo %%g XXX 64 Bit Version = %val1%>>%AllFailures%\VersionFailures.txt
echo %%h XXX 64 Bit Version = %val2%>>%AllFailures%\VersionFailures.txt
echo.>>%FileVersions%\%AllFailures%\VersionFailures.txt
echo %%g XXX 64 Bit Version = %val1%>>%FileVersions%\%%h_Versions.txt
echo %%h XXX 64 Bit Version = %val2%>>>>%FileVersions%\%%h_Versions.txt
echo.>>%FileVersions%\%%h_Versions.txt
)
)
)