/ f的cmd批处理文件关闭,comspec已设置

时间:2016-07-03 00:36:07

标签: windows batch-file for-loop cmd

所以我一直在寻找这个问题的解决方案一段时间,我看到每个人都只是说“设置compsec指向cmd”...这是非常有用的因为没有人实际上甚至说如何做到这一点。

但是当我打开cmd并输入“Set”并按Enter键时,它显示ComSpec = C:\ Windows \ system32 \ cmd.exe

我在那里查了一下,果然,cmd.exe就在那里,它运行得很好。但是/ f在执行任何操作之前仍然关闭。

我该如何解决这个问题?

@echo off

for /f "tokens=2*" %%a in ('dir /b /s findstr "Find Me Testing"') do set    "AppPath=%%~b"
set "AppPath=%AppPath%"
echo %AppPath%


for /f "tokens=2*" %%a in ('dir /b /s /a-d ^| findstr "Find Me Testing"') do set "AppPath=%%~b"
set "AppPath=%AppPath%"
echo %AppPath%

pause

for /f "usebackq" %a in ('dir /b /s /a-d ^| findstr "To Be Deleted.me"') do set fileLocation=%~pa
echo %fileLocation%



pause
pause
stop
pause
wait 50

正如你所看到的,我一直在测试各种做我想做的方法。

1 个答案:

答案 0 :(得分:1)

我很好地解决了你的问题是cmd.exe自动运行功能。

如果您打开命令会话并输入cmd /?,那么在第5段左右,您将看到以下内容:

If /D was NOT specified on the command line, then when CMD.EXE starts, it
looks for the following REG_SZ/REG_EXPAND_SZ registry variables, and if
either or both are present, they are executed first.

    HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\AutoRun

        and/or

    HKEY_CURRENT_USER\Software\Microsoft\Command Processor\AutoRun

我愿意打赌这两个注册表设置中的一个设置为导致问题的命令或脚本。编辑注册表并删除这些设置,您的问题就会消失。

您可以在https://blogs.msdn.microsoft.com/oldnewthing/20071121-00/?p=24433处看到有关用户遇到FOR / F问题的类似故事。

FOR / F命令通过新的cmd.exe进程在IN('....')子句中执行命令,该进程将始终运行可能存在的任何自动运行设置。不幸的是,不可能禁用这个FOR / F“功能” - 我认为这是一个可怕的设计缺陷。

Windows管道也使用子cmd.exe进程 - 管道的每一侧都有一个进程。但是cmd.exe的管道实例化包括/D选项,因此禁用了自动运行。您可以通过从命令行运行以下命令来查看:

echo %^cmdcmdline% | findstr "^"

在我的机器上产生以下内容:

C:\WINDOWS\system32\cmd.exe  /S /D /c" echo %cmdcmdline% "

现在用FOR / F(在健康的机器上)做等效的

for /f "delims=" %a in ('echo %^cmdcmdline%') do @echo %a

我的机器产生:

C:\WINDOWS\system32\cmd.exe /c echo %cmdcmdline%

没有/D选项:(