2017-08-09 48 views
0

我是noob,這是我的第一個問題,但是在搜索噸數的答案之後,我仍然無法完全得到我想要的結果。所以問題是:需要獲取windows版本,然後將版本傳遞給變量,然後運行findstr我使用版本獲取變量,但是findstr無法使用它在txt文件中查找字符串。獲取Windows版本和版本,將它傳遞給變量以與findstr一起使用

我做了什麼:我使用這個代碼來獲取版本,並保存爲VAR

@echo off 
setlocal EnableDelayedExpansion 
for /f "tokens=2 delims==" %%G in ('wmic os get Caption /value') do ( 
    set winEdition=%%G 
    ) 
echo !winEdition! 
endlocal 
goto :eof 

輸出:微軟Windows 7企業

但是如果我運行 IF陳述或 findstr

!winEdition! var我得到沒有結果IF和「字符串未找到」與findstr也如果我echo var到txt文件我得到「牣獯景⁴摮睯⁳湅整整灲††in」在txt文件中所以我認爲這是編碼問題,但我找不到解決它的方法。 更多細節:

@echo OFF 
setlocal EnableDelayedExpansion 
set "winEdition=" 
for /f "tokens=2 delims==" %%G in ('wmic os get Caption /value') do (
    set winEdition=%%G 
    ) 
set numbers= 
for /F "delims=:" %%a in ('findstr /I /N /C:"!winEdition!" serials.txt') do (
    set /A after=%%a+1 
    set "numbers=!numbers!!after!: " 
) 
rem Search for the lines 
for /F "tokens=1* delims=:" %%a in ('findstr /N "^" serials.txt ^| findstr /B "%numbers%"') do (
    echo %%b 
    ) 
endlocal 
goto :eof 

代碼工作的第二部分,並用繩子測試:想採取從上面的代碼的變種,搜索在TXT文件中的字符串,返回下一行完整的代碼的完整代碼並與VAR我想進一步自動化。感謝您的幫助我也開放替代方法來獲得結果

+0

活動代碼頁:862 – TerraBys

+0

我得到使用'CHCP 862'在正確的輸出批處理文件的頂部,並在'endlocal'之前插入命令行'echo「%winEdition%」''和'echo%winEdition%| findstr/C:Windows和'if「%winEdition%」==「Microsoft Windows 7 Enterprise」echo是,它是Windows 7'。請注意「Enterprise」後面的空格字符。批處理文件必須保存爲ANSI文件而不是Unicode文件。 – Mofi

+0

在'set numbers ='命令行之前插入'if'%winEdition:〜-1%「==」「set」winEdition =%winEdition:〜0,-1%「'刪除尾部空格字符。並且在命令'findstr'中另外使用'/ L'來明確請求將搜索字符串解釋爲文字字符串而不是正則表達式。 – Mofi

回答

0

嗨再次我找到答案!!!所以我只是使用了一個不同的命令來找到勝利版本,並且版本歸功於@LotPings,它比wmic慢了一點,但它每次都是一致的。 代碼:

@echo off 
setlocal EnableDelayedExpansion 
for /f "tokens=4-6" %%a in ('"systeminfo | find /i "OS Name""') do (
    set "ver=%%a %%b %%c" 
    ) 

set "numbers=" 
for /F "delims=:" %%a in ('findstr /I /N /C:"!ver!" serials.txt') do (
    set /A after=%%a+1 
    set "numbers=!numbers!!after!: " 
) 

for /F "tokens=1* delims=:" %%a in ('findstr /N "^" serials.txt ^| findstr /B "%numbers%"') do (
    echo %%b 
    ) 

if "%ver%" equ "Windows 10 Pro" echo YES 
endlocal 
goto :eof 

謝謝大家的幫助和建議!

ps。該serials.txt只是一個普通的文本文件,用記事本編碼UTF-8創建和內容僅僅是:

Windows 10 Pro 
XXXXX-XXXXX-XXXXX-XXXXX-XXXXX 
Windows 7 Pro... 

IF只是另一個檢查,它工作在原來代碼中的問題是不是與第二部分也不與serials.txt,因爲我無法比較!winEdition!IF聲明。

BTW發現我原來的解決方案THX的問題之一,我發現上面 問題是錯誤token=解決方案:

@echo off 
setlocal EnableDelayedExpansion 
for /f "tokens=3-5 delims== " %%A in ('wmic os get Caption /value ^| find "Windows" ') do (
    set "winVer=%%A %%B %%C" 
    ) 
echo !winVer! 
set "numbers=" 
for /F "delims=:" %%a in ('findstr /I /N /C:"!winVer!" serials.txt') do (
    set /A after=%%a+1 
    set "numbers=!numbers!!after!: " 
    ) 
for /F "tokens=1* delims=:" %%a in ('findstr /N "^" serials.txt ^| findstr /B "%numbers%"') do (
    echo %%b 
    ) 

endlocal 
goto :eof 
0

wmic打印一些額外的 「空」 線(1),這將覆蓋值(與echo on觀看)

@echo off 
setlocal 
set "winEdition=" 
for /f "tokens=2 delims==" %%G in ('wmic os get Caption /value') do ( 
    if not defined winEdition set winEdition=%%G 
    ) 
echo %winEdition% 

(1)在屏幕上,它們看起來是空的,但在技術上他們沒有。他們包含一個跛行斷線,這導致很多頭痛...

+0

對不起史蒂芬,但這不是問題在這裏。發佈的代碼工作並輸出TerraBys寫的字符串「Microsoft Windows 7 Enterprise」。不起作用的是未發佈的代碼。代碼的工作原理是使用''tokens = 2 delims ==「'和__wmic__選項'/ value',這導致只有一行可以通過__for__處理,它有第二個標記。爲什麼TerraBys發佈的代碼可以工作,請查看[%date%在從服務器2016中的計劃任務運行時在批處理文件中生成不同結果]的答案(https://stackoverflow.com/a/44670322/3074564)。 – Mofi

相關問題