Предисловие:
На работе все довольно заперто, и я не могу использовать powershell или любые макросы / скрипты в Excel.Я не могу брать файлы вне сайта или использовать на персональных компьютерах.У меня нет доступа к исходной программе для файлов.Кажется, я ограничен пакетными сценариями.
Ситуация:
У меня есть несколько сотен файлов CSV с системной информацией на автономных компьютерах, и для каждого я пытаюсь извлечь 2-ю строку, а затем добавить 4-юи 5-е поля строк 3, 6 и 20. Экспорт этого файла в новый файл .csv
Первая строка повторяется в последующих строках, поэтому я создал функцию для определения длины строки 1 и сохранениячто в переменной для использования в качестве смещения для последующих строк (строки 3, 6, 20).
Я помещаю различные строки в переменные, затем выводим переменные в файл.Пока что я беспокоюсь только о строках 2 и 3, пока не смогу это понять.Я ломаю голову над тем, что не могу использовать переменную в качестве смещения в другой переменной.Это всегда выглядит как целая строка.
пример:! Ln3: ~% L1Len%!
Возможно ли сделать это так, как я пытаюсь?
Есть ли другой способ?целиком (в пакетном режиме Windows)?
Я думаю, что должен быть способ использовать findstr / C: "Идентификатор издания" dc- .csv * (для строки 6) и вывести остаток строки впеременная, но я не понял это.Это также не будет работать для данных в других строках, поскольку в файле есть несколько экземпляров этих ведущих символов.
Если нет, я просто выведу переменные строки, а затем вручную удалим столбцы в Excel.Возможно, быстрее на этом этапе, но меня расстраивает, что я не могу понять это!
Вот мой текущий файл .bat:
@ECHO OFF
SETLOCAL enabledelayedexpansion
:: Set what the window title is so it isn't just cmd.exe
TITLE OS Info Extractor
:: Time variable to change the space in single-digit (AM) hours to zero
SET timestring=%time: =0%
:: Set the destination file name as OS_INFO_YYYYMMDD.csv
SET destfile="OS_INFO_%date:~10,4%%date:~4,2%%date:~7,2%_%timestring:~0,2%_%time:~3,2%.csv"
:: Set the source directory as current directory
SET sourcedir=%CD%
:: Create a count variable for file counting
SET count=1
:: TEST Create a varialbe for the OS name Test creating a variable with the offset string?
SET OSname=
:: Create Variables for the lines of text & length of line 1 for offset
SET Ln1=
SET Ln2=
SET Ln3=
SET Ln6=
SET Ln20=
SET L1Len=
ECHO.
ECHO This batch file will extract the OS information from dc-*.csv files located in:
ECHO %sourcedir%
ECHO and output to a new file called: %destfile%
ECHO.
ECHO Please ensure all source files are in the same directory
ECHO as this batch file, then press any key to begin...
pause >nul
:: Create csv column headers
ECHO "Source File","Computer Name"," ","Operating System"," ","Operating System Name 1","Operating System Name 2"," ","OS Edition ID"," ","OS Kernel Ver" >> %destfile%
:: For each file in the directory, do...
FOR %%a IN ("!sourcedir!\dc-*.csv") DO (
SET contb=y
SET contc=y
SET Sourcefile=%%~nxa
SET /p "Ln1="<"%%~a"
ECHO.
ECHO Processing file !count!: %%~nxa
FOR /f "usebackqskip=1delims=" %%b IN ("%%a") DO IF DEFINED contb (
SET Ln2=%%b
SET contb=
)
FOR /f "usebackqskip=2delims=" %%c IN ("%%a") DO IF DEFINED contc (
SET Ln3=%%c
SET contc=
)
:: Increment the file count
SET /a count+=1
:: Get length of line 1
CALL :Stringlength L1Len Ln1
:: check output of variables
ECHO [Debug] character length of 1st line is !L1Len!
ECHO [Debug] output of 1st line is: !Ln1!
ECHO [Debug] output of 2nd line is: !Ln2!
ECHO [Debug] output of 3rd line is: !Ln3!
ECHO [Debug] ^^!Ln3:~%%L1Len%%^^! output: !Ln3:~%L1Len%!
ECHO.
:: Test creating a variable with the offset string?
SET "OSname=!Ln3:~%L1Len%!"
ECHO [Debug] Test create new varaible ^^!OSname^^! from ^^!Ln3:~%%L1Len%%^^!
ECHO [Debug] New variable output: !OSname!
:: Output desired data to new line in file
ECHO "!sourcefile!",!Ln2!,!Ln3:~%L1Len%! >> !destfile!
)
ECHO.
ECHO Task complete
ENDLOCAL
pause
exit
:: Function to count string length in a variable
:Stringlength <resultVar> <stringVar>
(
set "s=!%~2!#"
set "len=0"
for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
if "!s:~%%P,1!" NEQ "" (
set /a "len+=%%P"
set "s=!s:~%%P!"
)
)
)
(
set "%~1=%len%"
exit /b
)
Содержание исходного файла выглядит так:
"ComputerName1","Operating System","Windows 7"
"ComputerName1","Operating System","Windows 7","Name","Windows 7 x64 Service Pack 1"
"ComputerName1","Operating System","Windows 7","Product Name","Windows Embedded Standard"
"ComputerName1","Operating System","Windows 7","Features","64 Bit Edition, Embedded, Terminal Services in Remote Admin Mode, Multiprocessor Free"
"ComputerName1","Operating System","Windows 7","Edition Type","Embedded"
"ComputerName1","Operating System","Windows 7","Edition ID","X15-82254"
Конечная цель:
“Source File”,”Computer Name”,” “,”Operating System”,” “,”Operating System Name 1”,”Operating System Name 2”,”OS Edition ID”,”OS Kernel Ver"
“sourcefile1.csv”,”ComputerName1”,”Operating System”,”Windows 7”,”Name”,”Windows 7 Professional x64 Service Pack 1”,"Kernel Version",”Windows 7 Professional”,”X15-39034”,”6.1.7601.23403”
“sourcefile2.csv”,”ComputerName2”,”Operating System”,”Windows 7”,”Name”,”Windows 7 Professional x64 Service Pack 1”,"Kernel Version",”Windows 7 Professional”,”X15-37362”,”6.1.7601.17651”
“sourcefile3.csv”,”ComputerName3”,”Operating System”,”Windows 7”,”Name”,”Windows 7 x64 Service Pack 1”,"Kernel Version",”Windows Embedded Standard”,”X15-82254”,"Kernel Version",”6.1.7601.17965”