在批处理文件中通过netsh命令添加防火墙规则时搜索sqlservr.exe

时间:2015-09-19 10:11:34

标签: batch-file

我已经创建了一个浴室文件来为sql server添加防火墙规则...这里是脚本的一部分

set PROGRAM="%ProgramFiles%\Microsoft SQL Server\MSSQL11.DBSERVER\MSSQL\Binn\sqlservr.exe"
set RULE_NAME="SQL Server"
echo Checking firewall rule %RULE_NAME%.
netsh advfirewall firewall show rule name=%RULE_NAME% >nul
if not ERRORLEVEL 1 (
    echo Rule %RULENAME% already exist.
) else (
    echo Rule %RULENAME% not exist. Creating...
    netsh advfirewall firewall add rule name=%RULE_NAME% dir=in action=allow program=%PROGRAM%
    netsh advfirewall firewall add rule name=%RULE_NAME% dir=out action=allow program=%PROGRAM%
)

我说的是第一行

set PROGRAM="%ProgramFiles%\Microsoft SQL Server\MSSQL11.DBSERVER\MSSQL\Binn\sqlservr.exe"

有没有办法在不输入路径的情况下找到文件? as文件sqlservr.exe在不同的操作系统中的位置不同,并且取决于实例名称...

1 个答案:

答案 0 :(得分:1)

有点棘手:

@ECHO OFF >NUL
SETLOCAL EnableExtensions
rem EnableDelayedExpansion
set "ss=sqlservr.exe"
rem set "ss=GoogleUpdate.exe"    my testing value
for /F "tokens=2 delims==" %%G in ('
    wmic Service where "pathname like '%%%ss%%%'" get PathName/value^|find /I "%ss%"
') do (
  @rem echo debugging G "%%~G"
  for /F delims^=^" %%x in ("%%G") do (
    set "_program=%%~x"
    @rem echo debugging x "%%~x"
  )
)
rem next two lines merely for debugging to check up results
set _program
echo "%_program%"

此处for循环

  • %%G检索PathName值;
  • %%x删除返回值中的结尾回车wmic行为:每个输出行以0x0D0D0A结尾,而不是公共0x0D0A })。

见Dave Benham的WMIC and FOR /F: A fix for the trailing <CR> problem

请注意delims^=^"把双引号字符视为分隔符的技巧。