2013-07-09 131 views
1

我正在研究批處理腳本以獲得樂趣和學習。將輸入插入變量

我已經設置了多個選擇,例如Fint IP地址,MAC地址...等等。 問題是我找不到如何將這兩行的輸出插入到變量中。

for /f "usebackq skip=1" %%f in (`wmic COMPUTERSYSTEM get name`) do ??? 
for /f "usebackq skip=1" %%f in (`wmic COMPUTERSYSTEM get domain`) do ??? 

因此,我可以在一個句子中使用輸出;

您的DNS名稱是%dns_name_output%,您的域名是%domain_name_output%。

+0

問題不在於把輸出放在變量中,問題是'wmic'不能按預期工作。它有一些額外的'CR'在行尾,不知道,究竟有多少(1-3?)。 – Endoro

+0

我知道,這是3行。一個在上面,一個在下面。但我現在通過避免wmic來解決它。 – MokiTa

回答

1

這適用於使用wmic而沒有任何奇數空格或CR嵌入。

@echo off 
for /f "tokens=2 delims=<>" %%a in ('wmic COMPUTERSYSTEM get name /format:htable^|find "hidden"') do set "name=%%a" 
for /f "tokens=2 delims=<>" %%a in ('wmic COMPUTERSYSTEM get domain /format:htable^|find "hidden"') do set "dom=%%a" 
echo "%name%,%dom%" 
pause 
-1

您可以定義一個變量,並使用back-tick enclosure將其值賦給命令的結果。

試試這個:

a=`ls` 
echo $a 
+0

批次,而不是_bash_。 – Endoro

2

試試這個:

for /f %%f in ("%computername%") do set "name=%%f" 
for /f %%f in ("%userdomain%") do set "domain=%%f" 
echo %name% %domain% 
+0

不,它沒有工作。 – MokiTa

+1

謝謝,它變得更好。 但我不得不使用%userdomain%而不是%logonserver%。那麼它工作得很好:) – MokiTa

+0

爲什麼使用FOR/F如果引用標準變量?直接使用標準變量,或直接將值分配給新變量。 – dbenham

2

爲了捕捉wmic獲得輸出,使用/value標誌這樣

for /f "tokens=2 delims==" %%A in ('wmic computersystem get name /value') do set "Name=%%A" 
for /f "tokens=2 delims==" %%A in ('wmic computersystem get domain /value') do set "Domain=%%A" 
+2

幾乎完美,除了賦值之外,末尾會隱藏一個''字符。 ''字符在正常變量擴展時將被剝離,但它可能會導致延遲擴展的問題。 – dbenham

+0

@dbenham +1,這是很好的知道。我知道隱藏的角色,但不知道它引起了一個問題,因爲我試圖不使用延遲擴展。它造成了什麼問題?我只是猜測它會輸出帶有延遲擴展的隱藏字符,因爲它在解釋器驗證命令後發生。它是否正確? –

+0

是的 - 這是如何導致延遲擴展的問題。當用作IF比較的一部分時,它可能特別討厭。 – dbenham

2

你所看到的問題的出現WMIC輸出是unicode的事實。通過一些我不完全瞭解的機制(一個bug?),FOR/F命令將unicode命令輸出轉換爲ASCII,但在每行的末尾附加了一個額外的回車(<CR>)。

FOR/F不會返回空行,但神祕且看似空白的行不是真的空白 - 它們包含一個<CR>

即使多餘的行被正確忽略,列表中的最後一個值也會包含一個不需要的<CR>,該值在將值分配給環境變量時將包含在內。如果以後使用%VAR%正常擴展變量,則<CR>將不明顯,因爲命令解析器會自動刪除所有<CR>字符。但是<CR>被保留,並且如果使用延遲擴展!VAR!會導致問題。

FOR/F命令剝離每行的最後一個字符,如果它恰好是<CR>。因此,通過額外的FOR/F傳遞值可以消除這個問題。 David Ruhman建議使用/value開關是一個不錯的選擇,並且可以改進。可以在一個循環中請求多個值,並且可以使用屬性名稱作爲變量名稱。每行只有一個名稱/值對,可以消除空格和/或逗號分隔問題。

WMIC命令中的逗號必須在FOR/F中使用時轉義或引用。在這種情況下,引用整個命令似乎是最簡單的。以下將正確定義兩個環境變量 - 域名和名稱:

for /f "delims=" %%A in ('"wmic computersystem get domain, name /value"') do (
    for /f "tokens=1* delims==" %%B in ("%%A") do set "%%B=%%C" 
) 
echo Your host name is %name% and your domain is %domain% 
+0

非常感謝! 我不是最好的批處理腳本,因爲你看到,所以我有最後一個問題: 我如何獲得這兩個字符串,你已經結合到一個變種,我可以用它來回應它? 現在我覺得有點笨,哈哈。 – MokiTa

+0

@MokiTa - ???字符串在變量中,所以我對你的問題有點困惑。但我更新了我的答案,以顯示結果變量的使用示例。 – dbenham

+0

啊,當然,哈哈!我怎麼能看不到。 我真的很感激你甚至不屑回答我這個愚蠢的問題。謝謝! – MokiTa