iT邦幫忙

0

有人能幫忙解一下嗎

能在詢問一下我這樣寫法有什麼問題嗎??

@ECHO OFF
REM set v_computer=168.1.1.1
:rd1
set /p v_computer=請輸入電腦名稱:
set main_cmd=powershell Invoke-Command -ComputerName
set cmd1=$gwmi WmiMonitorID -Namespace root\wmi
set cmd2=($monitor.SerialNumberID | foreach {[char]$_}) -join ""

%main_cmd% %v_computer% {%cmd1%}
%main_cmd% %v_computer% {%cmd2%}

goto rd1
pause

為什麼我執行不出來???

單獨用cmd 去執行是可以執行

porewshell
SP >> ETSN -COMPUTERNAME $name
$name >>$gwmi WmiMonitorID -Namespace root\wmi
$name >>($monitor.SerialNumberID | foreach {[char]$_}) -join ""

就能夠顯示

$name 螢幕序號

但是我用.bat則是卡在foreach

有人能幫忙解一下嗎??

fillano iT邦超人 1 級 ‧ 2019-01-14 10:52:00 檢舉
foreach?
zeo0621 iT邦新手 5 級 ‧ 2019-01-14 11:43:18 檢舉
目前有另外一個寫法

但是要怎麼呼叫副程式??
@ECHO OFF
REM set v_computer=168.1.1.1

:rd1
set /p v_computer=請輸入電腦名稱:

set main_cmd=powershell Invoke-Command -ComputerName
set cmd=call :LcdSn

%main_cmd% %v_computer% {%cmd%}

goto rd1

:LcdSn
SetLocal ENABLEDELAYEDEXPANSION
Set "Ascii= 0000000000000000000000000000000 ^!^"#$%%^&'()*+,-./0123456789:;^<=^>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^^^^_`abcdefghijklmnopqrstuvwxyz{^|}~"
For /f "delims=,{} tokens=1-16 Skip=1 eol= " %%a In ('WMIC /NameSpace:\\Root\WMI Path WmiMonitorID Get SerialNumberID ^|findstr .') Do (
Echo 螢幕序號: !Ascii:~%%a,1!!Ascii:~%%b,1!!Ascii:~%%c,1!!Ascii:~%%d,1!!Ascii:~%%e,1!!Ascii:~%%f,1!!Ascii:~%%g,1!!Ascii:~%%h,1!!Ascii:~%%i,1!!Ascii:~%%j,1!!Ascii:~%%k,1!!Ascii:~%%l,1!!Ascii:~%%m,1!!Ascii:~%%n,1!!Ascii:~%%o,1!
)
Pause
zeo0621 iT邦新手 5 級 ‧ 2019-01-14 11:44:24 檢舉
foreach?

是,他會顯示非外部及內部語法

1 個回答

0
蟹老闆
iT邦大師 1 級 ‧ 2019-01-14 16:09:45
最佳解答

上回給的例子加上參數就可以查詢其它電腦的序號,前題是遠端電腦須能連線。
https://ithelp.ithome.com.tw/upload/images/20190115/20006149Mq2YQcL9S6.jpg

@echo off
set /p v_computer=請輸入電腦名稱:
SetLocal ENABLEDELAYEDEXPANSION
Set "Ascii= 0000000000000000000000000000000 ^!^"#$%%^&'()*+,-./0123456789:;^<=^>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^^^^_`abcdefghijklmnopqrstuvwxyz{^|}~"
For /f "delims=,{} tokens=1-16 Skip=1 eol= " %%a In ('WMIC /Node:%v_computer% /NameSpace:\\Root\WMI Path WmiMonitorID Get SerialNumberID ^|findstr .') Do (
Echo 螢幕序號: !Ascii:~%%a,1!!Ascii:~%%b,1!!Ascii:~%%c,1!!Ascii:~%%d,1!!Ascii:~%%e,1!!Ascii:~%%f,1!!Ascii:~%%g,1!!Ascii:~%%h,1!!Ascii:~%%i,1!!Ascii:~%%j,1!!Ascii:~%%k,1!!Ascii:~%%l,1!!Ascii:~%%m,1!!Ascii:~%%n,1!!Ascii:~%%o,1!
)
Pause

若無法連線到遠端請自行google。

看更多先前的回應...收起先前的回應...
zeo0621 iT邦新手 5 級 ‧ 2019-01-15 12:08:22 檢舉

你好,我能循問一下這種方法可以用電腦名稱查詢嗎

我用IP是可以查詢沒錯

但是電腦名稱會出現全域切換參數不正確。

上網查也沒有特別出現解釋

在麻煩您

蟹老闆 iT邦大師 1 級 ‧ 2019-01-15 12:14:11 檢舉

https://ithelp.ithome.com.tw/upload/images/20190115/200061494031bdGeAX.jpghttps://ithelp.ithome.com.tw/upload/images/20190115/20006149yyg2GCfBoX.jpg

沒遇過這個錯誤,是不是你有改什麼.

zeo0621 iT邦新手 5 級 ‧ 2019-01-15 12:17:09 檢舉

了解,那可能是網路設定的問題(我是直接複製貼上的

看來這方法可能不適合用在我這裡

感謝您

zeo0621 iT邦新手 5 級 ‧ 2019-01-15 12:21:09 檢舉

那是否可以用

先連線到對方電腦,再跑這段程式碼的方式去執行??

就是
set /p v_computer=請輸入電腦名稱:

set main_cmd=powershell Invoke-Command -ComputerName

然後執行

SetLocal ENABLEDELAYEDEXPANSION
Set "Ascii= 0000000000000000000000000000000 ^!^"#$%%^&'()*+,-./0123456789:;^<=^>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^^^^_`abcdefghijklmnopqrstuvwxyz{^|}~"
For /f "delims=,{} tokens=1-16 Skip=1 eol= " %%a In ('WMIC /Node:%v_computer% /NameSpace:\Root\WMI Path WmiMonitorID Get SerialNumberID ^|findstr .') Do (
Echo 螢幕序號: !Ascii:~%%a,1!!Ascii:~%%b,1!!Ascii:~%%c,1!!Ascii:~%%d,1!!Ascii:~%%e,1!!Ascii:~%%f,1!!Ascii:~%%g,1!!Ascii:~%%h,1!!Ascii:~%%i,1!!Ascii:~%%j,1!!Ascii:~%%k,1!!Ascii:~%%l,1!!Ascii:~%%m,1!!Ascii:~%%n,1!!Ascii:~%%o,1!
)

這樣??

zeo0621 iT邦新手 5 級 ‧ 2019-01-15 12:24:03 檢舉

之前有寫過一個抓主機廠牌型號的

@ECHO OFF
REM set v_computer=172.1.1.1
:rd1
set /p v_computer=請輸入電腦名稱:
set main_cmd=powershell Invoke-Command -ComputerName
set cmd=wmic bios get Manufacturer
set cmd1=wmic bios get serialnumber

echo 廠牌
%main_cmd% %v_computer% {%cmd%}

echo 序號
%main_cmd% %v_computer% {%cmd1%}
goto rd1
pause

所以我可以確認電腦遠端是有開起來的

蟹老闆 iT邦大師 1 級 ‧ 2019-01-15 13:14:50 檢舉

對powershell不是很了解,你給的例子我這執行不起來,有可能是這邊的環境因素,若抓主板型號的可以運作,將

set cmd=wmic bios get Manufacturer
改成
WMIC /NameSpace:\Root\WMI Path WmiMonitorID Get SerialNumberID

應改會得到 00,00,00,00...... 這樣的字串,你能抓到嗎?

zeo0621 iT邦新手 5 級 ‧ 2019-01-15 13:31:26 檢舉

我直接執行
WMIC /NameSpace:\Root\WMI Path WmiMonitorID Get SerialNumberID

會出現下面的問題

錯誤:
描述 = 命名空間無效

蟹老闆 iT邦大師 1 級 ‧ 2019-01-15 13:45:57 檢舉

WMIC /NameSpace:\Root\WMI Path WmiMonitorID Get SerialNumberID
才對

zeo0621 iT邦新手 5 級 ‧ 2019-01-15 14:02:31 檢舉

WMIC /NameSpace:\Root\WMI Path WmiMonitorID Get SerialNumberID
WMIC /NameSpace:\Root\WMI Path WmiMonitorID Get SerialNumberID

這兩行不是一樣??

所以我原本查主機序號的改成
@ECHO OFF
REM set v_computer=172.1.1.1
:rd1
set /p v_computer=請輸入電腦名稱:
set main_cmd=powershell Invoke-Command -ComputerName
WMIC /NameSpace:\Root\WMI Path WmiMonitorID Get SerialNumberID

echo 廠牌
%main_cmd% %v_computer% {%cmd%}

echo 序號
%main_cmd% %v_computer% {%cmd1%}
goto rd1
pause

這樣子嗎??

zeo0621 iT邦新手 5 級 ‧ 2019-01-15 14:25:42 檢舉

這個是我根據您給的去做修正後可以看到

@ECHO OFF
REM set v_computer=172.16.14.77
:rd1
set /p v_computer=請輸入電腦名稱:
set main_cmd=powershell Invoke-Command -ComputerName
set cmd=WMIC /NameSpace:\Root\WMI Path WmiMonitorID Get SerialNumberID

%main_cmd% %v_computer% {%cmd%}
goto rd1
pause

-----

SerialNumberID

{49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}

{65, 48, 66, 50, 49, 75, 48, 49, 53, 50, 0, 0, 0, 0, 0, 0}

後面要??

蟹老闆 iT邦大師 1 級 ‧ 2019-01-16 23:27:42 檢舉

換這樣試試

@echo off
set /p v_computer=請輸入電腦名稱:
SetLocal ENABLEDELAYEDEXPANSION
Set "Ascii= 0000000000000000000000000000000 ^!^"#$%%^&'()*+,-./0123456789:;^<=^>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^^^^_`abcdefghijklmnopqrstuvwxyz{^|}~"
For /f "delims=,{} tokens=1-16 Skip=1 eol= " %%a In ('powershell Invoke-Command -ComputerName %v_computer% {WMIC /NameSpace:\\Root\WMI Path WmiMonitorID Get SerialNumberID} ^|findstr .') Do (
Echo 螢幕序號: !Ascii:~%%a,1!!Ascii:~%%b,1!!Ascii:~%%c,1!!Ascii:~%%d,1!!Ascii:~%%e,1!!Ascii:~%%f,1!!Ascii:~%%g,1!!Ascii:~%%h,1!!Ascii:~%%i,1!!Ascii:~%%j,1!!Ascii:~%%k,1!!Ascii:~%%l,1!!Ascii:~%%m,1!!Ascii:~%%n,1!!Ascii:~%%o,1!
)
Pause

我要發表回答

立即登入回答