批处理文件-主机文件编辑器-防止重复的条目-删除以前添加的条目

时间:2018-09-23 04:14:33

标签: batch-file batch-processing

好的,这就是我到目前为止所得到的。 这意味着添加网站以阻止在hosts文件中,并允许用户在需要时删除条目。尝试添加要阻止的网站时,有时会创建一个新行,然后将条目放在该行之前。这不是我想要的。我希望它创建一个新行,然后在该行上添加条目。由于某些原因,它有时会起作用,而有时则根本不起作用。我收到一条错误消息,提示Find参数不正确。我正在使用“查找”命令来查看条目是否已在主机文件中。如果是这样,我希望它避免添加它。如果不是,那么我要添加它。当我尝试删除条目时,该批处理会崩溃,因此我不确定在这里我在做什么错。我正在尝试查找条目并将其替换为空白。我真正想做的是删除整行,这样我就不会出现很多空白行。 任何帮助是极大的赞赏。谢谢!

const multer  = require('multer');
const storage = multer.memoryStorage();
const upload = multer({ storage: storage });

router.post('/avatar/upload',  upload.single('avatar'), async (req, res, next) => {
    try {

        console.log(req.body.avatar, 'req.body.avatar');  // { avatarUrl: '[object FileList]' } 'req.body'
        console.log(req.files, 'request files');  // undefined
        console.log(req.file, 'single file');  // undefined
        return res.json({status: true});
    } catch (err) {
        return next(err);
    }
});

1 个答案:

答案 0 :(得分:3)

请注意,在引用website文件的条目时,术语hosts具有误导性。 hosts文件的条目用于DNS主机名到IP地址的自定义映射,并且文件中存在的任何主机名不一定都承载网站。使用术语website可能会导致错误的印象,即可以将http://www.example.com之类的内容添加到主机文件中,这是不正确的。

如果主机文件中已存在主机,则跳过该主机:
使用find时出现的问题是%BLOCKEDSITE%有嵌入的空格,因此您应该用引号引起来并使用:

FIND /C /I "%BLOCKEDSITE%" %WINDIR%\system32\drivers\etc\hosts

但是它还有另一个问题:由于它依赖于%BLOCKEDSITE%所要求的IP地址和主机名之间的确切间隔,因此仅适用于批处理文件添加的条目。另外,用户可能通过将#放在包含该条目的行的开头来注释(禁用)该条目,即使该条目被禁用,您的批处理代码也将跳过添加主机。

这可以通过使用findstr及其正则表达式语法来解决。例如:

findstr /IRC:"^ *127\.0\.0\.1 *example\.com *$" "%WINDIR%\system32\drivers\etc\hosts"

从主机文件中删除条目:
FOR循环中,您只需要跳过编写包含指定条目的行:

if "!Line!"=="!LINE:%BLOCKEDSITE%=!" echo(!Line!>>"%HOSTSFILE%"

但是它还是不准确,并且遇到了前面提到的跳过添加条目所遇到的相同问题。再次使用findstr,您可以轻松删除包含不需要的条目的行:

findstr /VIRC:"^ *127\.0\.0\.1 *example\.com *$" "%HOSTSFILE%" > "%HOSTSFILE%.tmp"
del "%HOSTSFILE%"
ren "%HOSTSFILE%.tmp" "hosts"

有了上述要点,脚本可以像这样重写:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
title Modifying your HOSTS file
color F0

set "HOSTSFILE=%WINDIR%\system32\drivers\etc\hosts"
set "HOME=127.0.0.1"
set "PROMPT_TEXT=Enter the host name to"
set "ACTION_TEXT[1]=add"
set "ACTION_TEXT[2]=remove"
set "FindEmptyLine=^ *$"
set "NewLineAppended="
cls
setlocal EnableDelayedExpansion
:LOOP
echo,
echo 1. Block a host
echo 2. Remove a blocked host
echo 3. Exit
choice /C "123" /N /M "Choose an item [1, 2, 3]: "
set "Item=%errorlevel%"

goto choice%Item%

:choice0 // User Pressed CTRL-C
:choice3
exit /b

:choice1
call :Common
set "HostEntry=!HOME! !HOST!"
findstr /IRC:"!FindEntry!" "!HOSTSFILE!"> nul && (
    echo The host !HOST! is already blocked, No action taken.
) || (
    if not defined NewLineAppended (
        REM This will append a new line ONLY if the file does not end by LF character
        type "!HOSTSFILE!" | findstr $ > "!HOSTSFILE!.tmp" && (
            del "!HOSTSFILE!"
            ren "!HOSTSFILE!.tmp" "hosts"
            set "NewLineAppended=1"
        )
    )
    echo !HostEntry!>>"!HOSTSFILE!"
    echo The host !HOST! blocked
)
goto LOOP

:choice2
call :Common
findstr /VIR /C:"!FindEntry!" /C:"!FindEmptyLine!" "!HOSTSFILE!">"!HOSTSFILE!.tmp" && (
    del "!HOSTSFILE!"
    ren "!HOSTSFILE!.tmp" "hosts"
    echo The host !HOST! unblocked
)
goto LOOP

:Common
set "HOST="
set /P "HOST=!PROMPT_TEXT! !ACTION_TEXT[%Item%]! (e.g. example.com): "
if not defined HOST (
    (goto)2>nul
    goto LOOP
)
set "FindEntry=^^ *!HOME! *!HOST! *$"
set "FindEntry=!FindEntry:.=\.!"
exit /b