2013-10-22 34 views
0

如何在cmd中使用管道或重定向for循環?在for循環中包含管道和重定向

我的示例腳本(目的是看是否有一系列的具體方案/服務正在運行:

for %%m in (**{list of individual program names}**) do (
tasklist /FI "IMAGENAME eq %%m" /NH ^| find /i "%%m" 
if "%errorlevel%" EQU "1" set /a err_count=%err_count%+1 
echo checking tasklist item %%m , count is %err_count% 
) 

我需要管通過查找,還是沒有錯誤的任務列表會一直完成,即使程序不運行。

我已經想盡變化我能想到的在循環逃脫|>,並沒有什麼迄今已奏效。

/f定界符OPTI只有當命令位於第1行的括號內時纔有效。我想要循環內的命令。

+0

如果您說出您看到的錯誤或錯誤行爲與您期望看到的情況相關將會很有幫助。你不需要在'for'循環中轉義管道或重定向。打開echo以查看您的批處理文件正在運行的命令。這工作正常:'for %% m in(chrome.exe abc.exe notepad ++。exe)do tasklist/fi「IMAGENAME eq %% m」/ nh | find/i「%% m」>> results.txt' – indiv

+0

此外,您需要在循環中的'err_count'周圍使用延遲擴展。放入'setlocal EnableDelayedExpansion',然後在循環中使用'!err_count!'。在命令行上鍵入'help set'或進行谷歌搜索以獲取更多信息。 – indiv

回答

0
for /f %%i in ('dir /b /s *_log.xml ^| find "abc" /i /v') do type "%%~i" >> main_log.xml 

escape |'s not escape>'s。這是因爲你正在結束帶有未轉義管道的命令。而您只是告訴操作系統將程序的STDIN和STDOUT的含義改爲> < >>和< <。還可以在命令行使用%not %%

+0

如果這有助於您,請標記爲正確答案。 ; ) – nephi12

0

延遲擴展是在循環內使用變量的常用方法,使用!變量!句法。

管道是循環內的普通字符,不需要轉義。

@echo off 
setlocal enabledelayedexpansion 
for %%m in (**{list of individual program names}**) do (
tasklist /FI "IMAGENAME eq %%m" /NH | find /i "%%m" 
if errorlevel 1 set /a err_count+=1 
echo checking tasklist item %%m , count is !err_count! 
)