Тому що повідомлення про помилки часто йдуть stderr
не stdout
.
Змініть виклик на це:
taskkill /im "test.exe" /f >nul 2>&1
і все буде краще.
Це працює тому, що stdout
це дескриптор файлів 1, і stderr
це дескриптор файлів 2 за умовою. (0 stdin
, до речі,.) 2>&1
Копіює дескриптор файлу 2 виводу з нового значення 1, яке щойно переспрямовано на нульовий пристрій.
Цей синтаксис (вільно) запозичений з багатьох оболонок Unix, але ви повинні бути обережними, оскільки між синтаксисом оболонки та CMD.EXE є тонкі відмінності.
Оновлення: Я знаю, що ОП розуміє особливість "файлу", який називається, про який NUL
я пишу сюди, але коментатор не зробив цього, і тому дозвольте мені подати докладнішу інформацію з цього приводу.
Повертаючись до самих ранніх версій MSDOS, ядра файлової системи попередньо вибирали деякі імена файлів і використовувались для позначення пристроїв. Найраніший список цих імен , включених NUL
, PRN
, CON
, AUX
і COM1
через COM4
. NUL
є нульовим пристроєм. Його завжди можна відкрити для читання чи написання, на ньому може бути записана будь-яка кількість, і читання завжди вдається, але не повертає жодних даних. До інших належать паралельний порт принтера, консоль та до чотирьох послідовних портів. Щодо MSDOS 5, було ще кілька зарезервованих імен, але основна конвенція була дуже чітко встановлена.
Коли Windows була створена, вона почала функціонувати як досить тонкий перемикаючий шар додатка поверх ядра MSDOS і, таким чином, мав однакові обмеження щодо імені файлів. Коли Windows NT була створена як справжня сама по собі операційна система, імена подобаються NUL
і COM1
були занадто широко прийняті працювати, щоб дозволити їх усунення. Однак думка, що нові пристрої завжди отримуватимуть імена, які блокують майбутнього користувача цих імен для фактичних файлів, очевидно, нерозумна.
Windows NT і всі наступні версії (2K, XP, 7, і зараз 8), які використовуються, використовують набагато більш складний простір імен NT з коду ядра та ретельно сконструйований і високопортативний код простору користувача. У цьому просторі імен драйвери пристроїв видно через \Device
папку. Для підтримки необхідної зворотної сумісності існує спеціальний механізм за допомогою \DosDevices
папки, який реалізує список зарезервованих імен файлів у будь-якій папці файлової системи. Код користувача може переглядати цей внутрішній простір імен, використовуючи рівень API нижче звичайного API Win32; хорошим інструментом для вивчення простору імен ядра є WinObj з групи SysInternals в Microsoft.
Для повного опису правил, що стосуються юридичних назв файлів (і пристроїв) в Windows, ця сторінка в MSDN буде одночасно інформативною та химерною. Правила набагато складніші, ніж повинні були бути, і насправді неможливо відповісти на деякі прості запитання, такі як "як довго існує найдовша юридична повноцінна назва шляху?".