Görev zamanlayıcı tarafından çalıştırılıyorsa bir komut dosyasının çıktısını nasıl yakalayabilirim?


100

Windows Server 2008 kullanarak, Windows görev zamanlayıcı ile çalıştırılan bir komut dosyasının çıktısını nasıl yakalayabilirim?

Oldukça uzun bir özel baskı toplu komut dosyasını test ediyorum ve hata ayıklama amacıyla, ondan gelen tüm çıktıları her gece görmek istiyorum.


2
Bazen bu işe yaramaz, yani günlük dosyası oluşturulmaz. Buna yol açabilecek bir senaryo, görevin hiç başlamamasıdır, çünkü Windows yanlışlıkla hala çalıştığını düşünür. Bunu, görev geçmişine bakarak takip edebilirsiniz (görev özelliğindeki geçmiş sekmesi - bilginin görünmesi birkaç saniye sürebilir)
Daniel

Yanıtlar:


87

Bunu Görev Zamanlayıcı'da komut dizesi olarak deneyin:

cmd /c yourscript.cmd > logall.txt

2
güzel, sarmalayıcı gerekmez, harika çalışır ve ayrıca görev zamanlayıcı ile tetiklenen bat / cmd'den çağrılan alt powershell komut dosyalarından gelen çıktıları da günlüğe kaydeder Teşekkürler!
Jonesome Reinstate Monica

9
Ek olarak, cmd /c "path with spaces/command.cmd > file.txt"boşluklarınız varsa kullanın . 2>&1Dan Ivan'ın cevap da tırnak içine gider.
Dinei

3
benimkini çalıştırmak için çift tırnak kullanmalıyım: stackoverflow.com/a/6378038/1747983 cmd /c ""C:\temp\My test dir\something 123\myTool.exe" > Tilo_log.txt 2>&1"
Tilo

1
5 yıl geçtiğini biliyorum, ancak bunu, görevi yerine getirmenin minimalist yolu olduğu için kabul edilen cevaba dönüştürmek.
Mechaflash

Şimdi görevi çalıştırırken görünen bir komut pencerem var. Bunu nasıl önleyebilirim?
Chris

59

Stderr ile (hataların çoğunun gittiği yer):

cmd /c yourscript.cmd > logall.txt 2>&1

56

@ User2744787'nin cevabını tamamlamak için, bir Zamanlanmış Görevde cmdargümanlarla nasıl kullanılacağını gösteren bir ekran görüntüsü :

Günlük dosyasına Zamanlanmış Görev cmd çıkışı

Program / komut dosyası: cmd

Bağımsız değişkenler ekleyin: /c run_with_default_port.bat > IMQuantWebServices.log


5
Zamanlanmış bir görev aracılığıyla bir hizmet başlatıyorsunuz gibi görünüyor. Bunun arka planda sürekli çalışan bir hizmet olması gerekiyorsa, alternatif olarak NSSM'ye bir göz atın. Herhangi bir komutu bir Windows hizmeti olarak çalıştırır ve başarısızlıktan sonra yeniden başlatmayı işler.
leemes

43

>>Doğrusu o her zaman üzerine yazmak yerine, günlük dosyasını ekler. 2>&1Ayrıca günlük dosyasına hataları gönderecek.

cmd /c YourProgram.exe >> log.txt 2>&1

40

Yourscript.cmd'yi çağıran bir debug.cmd'ye sahip olabilirsiniz.

yourscript.cmd > logall.txt

yourscript.cmd yerine debug.cmd'yi programlarsınız


13

cmd.exeZamanlanmış görevinizin çıktısını günlüğe kaydetmek için zaman damgalı bir dosya adı oluşturmak için komut işlemcisini kullanın

Burada başkalarının cevaplarını geliştirmek için, dosyanın adına tarih ve / veya saat gömülü olan bir çıktı dosyası oluşturmak isteyebilirsiniz. Bunu cmd.exesizin için yapmak için komut işlemcisini kullanabilirsiniz .

Not: Bu teknik, dahili Windows ortam değişkenlerinin dize çıktısını alır ve bunları karakter konumuna göre dilimlere ayırır. Bu nedenle, aşağıdaki örneklerde verilen tam değerler kullandığınız Windows bölgesi için doğru olmayabilir. Ayrıca, bazı bölgesel ayarlarda, tarih veya saatin bazı bileşenleri, değerleri 10'dan küçük olduğunda oluşturulan dosya adına bir boşluk ekleyebilir. Bu sorunu hafifletmek için, dosyada istenmeyen boşluklar oluşmasını sağlamak için dosya adınızı tırnak işaretleri arasına alın. name oluşturduğunuz komut satırını bozmaz. Deney yapın ve durumunuza en uygun olanı bulun.

Bundan PowerShelldaha güçlü olduğunun farkında olun cmd.exe. Daha güçlü olmasının bir yolu, farklı Windows bölgeleriyle başa çıkabilmesidir. Ama bu cevap kullanarak bu sorunu çözme konusunda ise cmd.exe, değil PowerShell, bu yüzden devam edin.

Kullanma cmd.exe

Dahili ortam değişkenlerini dilimleyerek%date% ve %time%aşağıdaki gibi tarih ve saatin farklı bileşenlerine erişebilirsiniz (yine, tam dilimleme değerleri Windows'ta yapılandırılan bölgeye bağlıdır):

  • Yıl (4 hane): %date:~10,4%
  • Ay (2 hane): %date:~4,2%
  • Gün (2 hane): %date:~7,2%
  • Saat (2 hane): %time:~0,2%
  • Dakika (2 hane): %time:~3,2%
  • İkinci (2 hane): %time:~6,2%

Günlük dosyanızın şu tarih / saat biçimi kullanılarak adlandırılmasını istediğinizi varsayalım: " Log_[yyyyMMdd]_[hhmmss].txt". Aşağıdakileri kullanırsınız:

Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt

Bunu test etmek için aşağıdaki komut satırını çalıştırın:

cmd.exe /c echo "Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt"

, Hep birlikte koyarak hem yönlendirmek stdoutve stderrgeçerli tarih ve saat ile adlandırılan bir günlük dosyasına komut kullanabilmesisi komut satırı olarak aşağıdakileri kullanabilirsiniz:

cmd /c YourProgram.cmd > "Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt" 2>&1

Bir tarih veya saat bileşeninin bir boşluk karakteri ekleyebileceği örnekleri işlemek için dosya adının etrafında tırnak işaretleri kullanıldığını unutmayın.

Benim durumumda, geçerli tarih / saat 10/05/2017 9:05:34 AM ise, yukarıdaki komut satırı aşağıdakileri üretir:

cmd /c YourProgram.cmd > "Log_20171005_ 90534.txt" 2>&1

10'dan az saatlerde başında sıfır yoktur: / nasıl düzeltileceğinden emin değilim ama en azından dosya adını
belirtin

9

Çıktısını almak istediğiniz satırlarda bir günlük dosyasına şu şekilde yazabilirsiniz:

@echo off
echo Debugging started >C:\logfile.txt
echo More stuff
echo Debugging stuff >>C:\logfile.txt
echo Hope this helps! >>C:\logfile.txt

Bu şekilde, her şeyi taramak istemiyorsanız hangi komutların çıktısını alacağınızı seçebilirsiniz, sadece görmeniz gerekenleri alın. >Belirtilen dosyaya irade çıktı (o yoksa dosyası oluşturma ve onu yaparsa onu üzerine yazarak). >>Belirtilen dosya (o yoksa dosyası oluşturarak ama olursa içeriğine ekleme) için ekler.


2

Örnek programın nasıl çalıştırılacağı ve stdout ve stderr'in zaman damgası ile dosyaya nasıl yazılacağı:

cmd /c ""C:\Program Files (x86)\program.exe" -param fooo >> "c:\dir space\Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt" 2>&1"

Anahtar kısım, cmd /cher zamanki gibi çift tırnak işareti kullanmaktır. Ayrıca tarihin yerel ayara bağlı olduğunu unutmayın, bu örnek ABD yerel ayarı kullanılarak çalışır.


0

Bu kod parçası, tarih dizesini oluşturmak için wmic.exe'yi kullanır. Yerel ayarlar tarafından karıştırılmamış

rem DATE as YYYY-MM-DD via WMIC.EXE
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set datetime=%%I
set RDATE=%datetime:~0,4%-%datetime:~4,2%-%datetime:~6,2% 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.