I am trying to read some info from a text file by using windows command line, and save it to a variable just like \"set info =1234\"
Below is the content of the txt
Use the for command to parse the file:
for /f "skip=4 tokens=2" %%l in (svninfo.txt) do (
set revision=%%l
goto gotrev
)
:gotrev
echo revision is %revision%
Knowing how to use CMD scripting deftly is great, but using PowerShell is even better. Here's one way to do it:
$revision = (( gc .\svninfo.txt | ? { $_.StartsWith( 'Revision: ' ) } ) -split ' ')[1]
What's going on?
$revision is a variable
gc is Get-Content, aka type. Each line in the file becomes a string in a sequence (pipeline).
? is Where-Object. It filters the objects in a pipeline based on a condition.
{} delimits a script block
$_ is the current object in the pipeline.
-split invokes String.Split() in .NET, giving you an array of objects
[1] indexes in to the array
Here's a one line version:
for /f "tokens=2" %%i in ('findstr Revision: input.txt') do set revision=%%i
if you have can use GNU tools, such as gawk
@echo off
for /F %%a in ('gawk -F":" "$1~/Revision/{print $2}" file') do (
set var=%%a
)
echo %var%
The following code snippet shows how to do this:
@echo off
setlocal enableextensions enabledelayedexpansion
set revision=
for /f "delims=" %%a in (input.txt) do (
set line=%%a
if "x!line:~0,10!"=="xRevision: " (
set revision=!line:~10!
)
)
echo !revision!
endlocal
Its output is 1234 as desired.
The setlocal is what I use in every script to ensure variables are treated in a known way. The for statement processes each line in the input file (the delims bit stops the line from being tokenised into separate words).
The !line:~ bits are substrings with !line:~0,10! being the first ten characters and !line:~10! being the rest.
So, basically, it checks every line to see if it starts with "Revision: " and, if so, extracts the rest of the line for later.