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.