下面是否認未識別開關的另一種選擇,可同時接收/
和-
爲有效開關前綴,執行不區分大小寫的開關檢查,和坪REMOTEHOST以檢查有效性。
@echo off
setlocal enabledelayedexpansion
if not "%~1"=="" goto :switches
:usage
echo Usage: %~nx0 [/X] [/L loginname] remotehost
goto :EOF
:switches
rem // make sure variables are undefined
for %%I in (forward login host switch valid) do set "%%I="
rem // loop through all arguments
for %%I in (%*) do (
rem // if this iteration is a value for the preceding switch
if defined switch (
rem // if that switch was -L or /L (case-insensitive)
if /i "!switch:~1!"=="L" set "login=%%~I"
rem // clear switch variable
set "switch="
) else (
rem // if this iteration is a switch
echo(%%~I | >NUL findstr "^[-/]" && (
set "switch=%%~I"
rem // if this is a valid switch
for %%x in (X L) do (
if /i "!switch:~1!"=="%%x" set "valid=true"
)
if not defined valid (
echo Unrecognized switch: %%~I
goto usage
)
set "valid="
if /i "!switch:~1!"=="X" (
set "forward=true"
set "switch="
)
) || (
rem // not a switch. Must be a host.
ping -n 1 %%~I | findstr /i "^Reply.*time.*[0-9]" >NUL && (
set "host=%%~I"
) || (
echo Host %%~I is unreachable.
)
)
)
)
if not defined host goto usage
<NUL set /P "=Args passed: "
if defined forward <NUL set /P "=FORWARD "
if defined login <NUL set /P "=LOGIN %login% "
echo %host%
而且你知道,如果你不舒服的腳本的Windows批處理腳本,你可能會考慮其他腳本語言。許多人會建議PowerShell,這是一個有價值的選擇。但是,如果您不想學習全新的語言和格式,如果您熟悉JavaScript,JScript就非常相似。我會示範,我希望你能看到相似之處。用.js擴展名保存。要運行它,做cscript /nologo scriptname.js switches here
:
// convert WSH.Arguments object to a JS array
for (var args=[], i=0; i<WSH.Arguments.Length; i++)
args.push(WSH.Arguments(i));
function error(txt, code) {
WSH.StdErr.WriteLine(txt);
WSH.StdErr.WriteLine('Usage: '+WSH.ScriptName+' [/X] [/L loginname] remotehost');
WSH.Quit(code);
}
for (var i=0; i<args.length; i++) {
switch (args[i].toLowerCase().replace("-","/")) {
case "/x":
var forward = true;
break;
case "/l":
if (++i == args.length || /^\//.test(args[i]))
error('Invalid login name.', 1);
else var login = args[i];
break;
default:
if (/^\//.test(args[i]))
error('Unrecognized option: ' + args[i], 2);
else var host = args[i];
}
}
if (!host) error('No host specified.', 3);
WSH.Echo([
'Command: ',
(forward ? 'FORWARD ' : ''),
(login ? 'LOGIN ' + login + ' ' : ''),
host
].join(''));
JScript和JavaScript的有很多共通之處。您可以調用相同的RegExp對象方法和Array對象方法,修改原型,將數據強制爲兼容的數據類型或測試其真實性等等。 JScript 是 JavaScript,只是帶有「WScript」(或「WSH」代表懶惰)的根祖先對象而不是「Window」。
// convert WSH.Arguments proprietary object to a JS array
for (var args=[], i=0; i<WSH.Arguments.Length; i++)
args.push(WSH.Arguments(i));
function error(txt, code) {
WSH.StdErr.WriteLine(txt);
WSH.StdErr.WriteLine('Usage: '+WSH.ScriptName+' [/X] [/L loginname] remotehost');
WSH.Quit(code);
}
// returns idx of array element matching rxp (or -1 if no match)
Array.prototype.match = function(rxp) {
for (var i=this.length; i--;) if (rxp.test(this[i])) return i;
return -1;
}
var X = args.match(/^[/-]X$/i);
if (X > -1) var forward = args.splice(X, 1)[0];
var L = args.match(/^[/-]L$/i);
if (L > -1) var login = args.splice(L, 2)[1];
for (var invalid=[], i=args.length; i--;)
if (/^[/-]/.test(args[i])) invalid.push(args[i]);
if (invalid.length) error('Unrecognized option: ' + invalid.join(), 1);
if (!args.length) error('No host specified.', 2);
WSH.Echo([
'Params: ',
(forward ? 'FORWARD ' : ''),
(login ? 'LOGIN ' + login + ' ' : ''),
args[0]
].join(''));
如果你想用這些參數來啓動外部程序,看看objShell.Run
。
如果你想你的腳本部署到其他用戶,使它成爲一個批處理+ JScript的混合格式,並用.bat擴展名保存它使得它更人性化的執行。只需將它放在上述任一解決方案的頂部,然後以.bat擴展名保存腳本。
@If (@CodeSection == @Batch) @then
@echo off & setlocal
cscript /nologo /e:JScript "%~f0" %*
goto :EOF
@end // end Batch/begin JScript hybrid chimera
// JScript code here
它的工作方式是首先用cmd批解釋器加載腳本。由於(@CodeSection
不等於@Batch)
,該行的其餘部分永遠不會嘗試。繼續執行直至cscript
行,該行使用JScript解釋器重新加載此腳本,並傳遞命令行參數。
JScript確定@CodeSection
實際上不等於@Batch
,並跳到@end
。在JScript執行結束時,cscript.exe
退出並且批處理線程繼續執行直到goto :EOF
或exit /b
。
隨着混合代碼的添加,現在的語法是scriptname.bat arguments here
。如果您想繞過批處理代碼並只執行JScript部分,則cscript /nologo /e:JScript scriptname.bat argumentss here
也可以使用。
看看http://stackoverflow.com/a/8162578/1012053 – dbenham
阿哈,容易錯過,但好評,謝謝。 – Rich