由于这个问题是closures的(我打算先回答),我打开了这个问题。
在某些机器上,它被禁止安装/下载二进制文件,所以我想知道如何检查远程机器上的端口是否仅使用本机窗口脚本function打开。
令人不安的是,Windows不提供简单的工具来检查端口是否在远程服务器上打开。
一个选项是远程登录,但不能编写脚本,因为它的输出被重定向或捕获时会关闭。 曾几何时,在Windows机器上安装了一个MSWinsock.Winsock.1 COM对象,可以在脚本中使用它,但是没有更多。 PortQry和PsPing是一个很好的工具,但是你仍然需要下载它们(尽管它是由微软提供的)。
所以最简单的方法就是依靠PowerShell。
下面是一个简单的.bat脚本的代码,在内部使用Powershell来完成工作:
@echo off ::Must be without quotes. If you intend to use command line arguments use %~1 set "host=google.com" set /a port=443 for /f %%a in ('powershell "$t = New-Object Net.Sockets.TcpClient;try{$t.Connect("""%host%""", %port%)}catch{};$t.Connected"') do set "open=%%a" :: or simply :: powershell "$t = New-Object Net.Sockets.TcpClient;try{$t.Connect("""%host%""", %port%)}catch{};$t.Connected" echo Open: %open%
有些机器安装了没有安装PowerShell的.NET框架,所以在这种情况下,可以使用msbuild将C#代码嵌入到批处理脚本中:
<!-- : @echo off :: checks if a port on a remote server is open :: returns errorlevel 1 if it's closed setlocal for %%h in (/h /help -help -h "") do ( if /I "%~1" equ "%%~h" ( goto :printHelp ) ) if "%~2" equ "" goto :printHelp set "HOST=%~1" set /a PORT=%~2 :::::: Starting C# code ::::::: :: searching for msbuild location for /r "%SystemRoot%\Microsoft.NET\Framework\" %%# in ("*msbuild.exe") do set "msb=%%#" if not defined msb ( echo No .NET framework installed endlocal & exit /b 10 ) rem :::::::::: calling msbuid ::::::::: call %msb% /nologo /noconsolelogger "%~dpsfnx0" rem :::::::::::::::::::::::::::::::::::: endlocal & exit /b %errorlevel% :printHelp echo Checks if port is open on a remote server echo( echo Usage: echo %~nx0 host port echo( echo If the port is not accessible an errorlevel 1 is set endlocal & exit /b 0 --> <Project ToolsVersion="$(MSBuildToolsVersion)" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Target Name="_"><_/></Target> <UsingTask TaskName="_" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v$(MSBuildToolsVersion).dll" > <Task> <Using Namespace="System" /> <Using Namespace="System.Net.Sockets" /> <Code Type="Method" Language="cs"><![CDATA[ public override bool Execute(){ String host=Environment.GetEnvironmentVariable("HOST").ToLower(); int port=Int32.Parse(Environment.GetEnvironmentVariable("PORT")); Console.WriteLine("Checking host {0} and port {1}",host,port); using(TcpClient client = new TcpClient()) { try { client.Connect(host, port); } catch(Exception) { Console.WriteLine("Closed"); return false; } client.Close(); Console.WriteLine("Open"); return true; } } ]]> </Code> </Task> </UsingTask> </Project>
至于没有.NET框架的机器,我不知道任何本地方法来检查远程端口。
如果你只想检查TCP端口,你可以使用Test-NetConnection 。 如果提供一个-Port
参数来定义TCP端口。