I'm new with NSIS.
I want to check the MAC address but this dos exec give me error.
ExecDos::exec /TIMEOUT=2000 "$SYSDIR\ipconfig.exe /all | findstr 00-11-A3-03-B7-A1" "" "$EXEDIR\MAC.txt"
Pop $0 # return value
DetailPrint "Exit code: $0"
StrCmp $0 "error" goto End
"Exit code: error"
Please let me know why and how I can work around it.
Thanks very much for your help
FT
External console command
12 posts
1. It's not a DOS executable, it's a console program 😉
2. I don't think you can run it this way, try like that:
2. I don't think you can run it this way, try like that:
!include StrFunc.nsh
${StrLoc}
...
Section
nsExec::ExecToStack /TIMEOUT=2000 '"$SYSDIR\ipconfig.exe" /all'
Pop $0 # return value
Pop $1 # console output
DetailPrint "Exit code: $0"
StrCmp $0 "error" goto End
${StrLoc} $0 "$1" "00-11-A3-03-B7-A1" ">"
StrCmp $0 "" MAC_NotFound MAC_Found
MacFound:
...
MAC_NotFound:
...
End:
SectionEnd
Why would you hardcode something for a specific MAC, you know people can change their MAC right?
for atleast XP and later, there is a program called GetMAC, just use "for" to get the first token of the output of something like: getmac|find "\". for older systems without getmac, you would need to parse the output of ipconfig /all|find "Physical Address" with a "for" to get the token after ":" (I guess that would only work on english systems)
for atleast XP and later, there is a program called GetMAC, just use "for" to get the first token of the output of something like: getmac|find "\". for older systems without getmac, you would need to parse the output of ipconfig /all|find "Physical Address" with a "for" to get the token after ":" (I guess that would only work on english systems)
(for batch file use, you must use %%A instead of %A)
for /F %A in ('getmac^|find "\"')DO @echo %A
and
FOR /F "TOKENS=1-3 DELIMS=.: " %A IN ('IPCONFIG/ALL^|FIND/I "Physical"') DO
@ECHO %C
You could try like this:
!include StrFunc.nsh
${StrTok}
...
Section
nsExec::ExecToStack /TIMEOUT=2000 '"$SYSDIR\getmac.exe"'
Pop $0 # return value
Pop $1 # console output
DetailPrint "Exit code: $0"
StrCmp $0 "error" goto End
StrCpy $0 "0"
Loop:
${StrTok} $2 "$1" "$\n$\r$\t " "$0" "1"
StrCmp $2 "" MAC_NotFound
StrCmp $2 "00-11-A3-03-B7-A1" MAC_Found
IntOp $0 $0 + 1
Goto Loop
MacFound:
...
MAC_NotFound:
...
End:
SectionEnd
Test and seems to work fine:
!include StrFunc.nsh
${StrTok}
Caption "MAC Test"
OutFile "macTest.exe"
!define MAC_Address "00-11-A3-03-B7-A1"
Section
nsExec::ExecToStack /TIMEOUT=5000 '"$SYSDIR\getmac.exe" /FO CSV'
Pop $0 # return value
Pop $1 # console output
DetailPrint "Exit code: $0"
StrCmp $0 "error" End
StrCpy $0 "0"
Loop:
${StrTok} $2 "$1" '$\n$\r$\t",' "$0" "1"
# MessageBox MB_OK '"$2"'
StrCmp $2 "" MAC_NotFound
StrCmp $2 "${MAC_Address}" MAC_Found
IntOp $0 $0 + 1
Goto Loop
Mac_Found:
MessageBox MB_ICONINFORMATION "MAC was found!"
Goto End
MAC_NotFound:
MessageBox MB_ICONSTOP "MAC was not found!"
Abort
End:
SectionEnd
That's odd. My Windows XP doesn't have Getmac.exe. A quick search shows it is part of the Win2000 resource kit, and it seems it also comes with Vista.
Any solution using this exe will have to pack it into the installer.
Don
Any solution using this exe will have to pack it into the installer.
Don
Originally posted by demiller9That is weird, is it XP Home? My getmac version is 5.1.2600.0 (xpclient.010817-1148) (XP MCE2k5 SP2)
That's odd. My Windows XP doesn't have Getmac.exe. A quick search shows it is part of the Win2000 resource kit, and it seems it also comes with Vista.
Yes, it is XP Home. It is currently SP3 (just recently upgraded from SP2).
Don
Don
Version to work with ipconfig.exe is here:
EDIT: Updated code, previous code was too slow 😛
This should be used with the "Large strings" version of NSIS (download), because the output of ipconfig.exe can easily exceed the default string length of 1024 chars. On my system (3 network adapters) for example it does...!include StrFunc.nsh
${StrLoc}
Caption "MAC Test"
OutFile "macTest.exe"
!define MAC_Address "7A-79-05-EB-3D-66"
Section
nsExec::ExecToStack /TIMEOUT=5000 '"$SYSDIR\ipconfig.exe" /all'
Pop $0 # return value
Pop $1 # console output
DetailPrint "Exit code: $0"
StrCmp $0 "error" End
StrLen $0 $1
DetailPrint "Output length: $0 of ${NSIS_MAX_STRLEN}"
DetailPrint "Checking MAC address..."
${StrLoc} $0 "$1" "Physical Address. . . . . . . . . : ${MAC_Address}" ">"
StrCmp $0 "" MAC_NotFound MAC_Found
Mac_Found:
MessageBox MB_ICONINFORMATION "MAC was found!"
Goto End
MAC_NotFound:
MessageBox MB_ICONSTOP "MAC was not found!"
Abort
End:
SectionEnd
EDIT: Updated code, previous code was too slow 😛
You guys are awsome. Thanks a lot for your quick help, especially to LoRd_MuldeR.
I still wonder why the pipe '|' don't work. Is there a way to make it work with nsis?
For example:
C:\ipconfig.exe /all | findstr "MyPCName"
FT
I still wonder why the pipe '|' don't work. Is there a way to make it work with nsis?
For example:
C:\ipconfig.exe /all | findstr "MyPCName"
FT
the pipe works, you just have to invoke the command line interpreter, search this forum for COMSPEC for examples probably (read COMSPEC env. then execute $COMSPEC /K foo|bar)
Still I wouldn't invoke the commandline interpreter as long as I can do it my NSIS script natively. I'd even prefer writing my own plugin, instead of relying on the commandline interpreter. It just isn't safe over different Windows versions..