2009-06-19 11 views
15

Zdaję sobie sprawę, że to pytanie jest „odpowiedź” w wątku: Specifying the running directory for Scheduled Tasks using schtasks.exeOkreślenie „start w” Katalogu w SCHTASKS polecenia w oknach

Jednak ciągle mam kłopoty ze zrozumieniem odpowiedzi i widząc co dokładnie Wynik będzie wyglądał jak dla mojej sytuacji.

Moje polecenie SCHTASKS wygląda następująco:

Schtasks /Create /TR "C:\Program Files\Java\jre6\bin\javaw.exe main.MoveFile input.txt" /SC WEEKLY /TN mytask

Chcę określić start w katalogu "C: \ My Library". Umieszczenie "\" przed sekcją tr wypełnia w katalogu startowym w "C: \ Program Files \ Java \ jre6 \ bin".

mam zawiedli się z nim dużo, ale ja po prostu nie wydaje się, aby to działało.

Odpowiedz

14

Nie wiesz, której wersji systemu Windows używasz, ale czytając drugie pytanie, wygląda na to, że skrypty w Vista/Server 2008 nie udostępniają opcji polecenia, która pozwoliłaby ci bezpośrednio określić katalog "start-in". Obejścia dostarczone przez użytkowników:

  1. Użyj flagi/v1, aby utworzyć zadanie kompatybilne z XP/2003, w którym to przypadku katalog "start-in" jest ustawiany automatycznie. Nie jestem pewien, co to jest ustawione, ale podejrzewam, że może to być ten sam katalog, co plik wykonywalny zadania, który nie będzie działał dla ciebie.
  2. Utwórz zadanie z pliku XML (przy użyciu opcji/XML), które nie pozwalają na określenie katalogu „start-in”. Niestety nie znam składni/struktury tego pliku XML.
  3. Załóż swoje zadanie za pomocą Harmonogramu zadań UI zamiast.
+0

dobrym rozwiązaniem, ale wydaje się nie zezwalać na nazwy zadań z folderami - np. nie można utworzyć "MyCompany \ MyTask" za pomocą przełącznika/v1 (działa bez przełącznika). – andreister

+0

Just/v1 and magic! dzięki ... – mimoralea

+0

Flaga/V1 działa, ale musisz upewnić się, że twoja ścieżka/TR używa tylnych ukośników na ścieżce. Kiedy użyłem ukośników w ścieżce, zadanie nie będzie działać poprawnie. – panofish

0

I odkryli, że w przypadku korzystania z konwencją nazewnictwa 8.3 w wierszu poleceń SCHTASKS dla nazw plików i ścieżek „Start w” pole jest polulated ze ścieżką pliku -

np "C: \ Progra ~ 1 \ NBVCl ~ 1 \ nbv_up ~ 1.exe" spowoduje pojawienie się "C: \ Progra ~ 1 \ NBVCl ~ 1" w obszarze "start In"

+1

to nie zadziałało dla mnie – panofish

1

Jak sam zauważyłeś, trik użycia dodatkowych cudzysłowów w parametrze/TR pozwala tylko na użycie tego samego katalogu, w którym znajduje się plik wykonywalny. Jeśli chcesz określić inny katalog roboczy, powinieneś użyć opcji/XML i określić plik XML zawierający listę roboczą. Komenda byłoby coś takiego:

SchTasks /Create /TN "Foo" /XML task.xml 

Plik XML będzie wyglądać mniej więcej tak:

<?xml version="1.0" ?> 
<Task xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"> 
    <RegistrationInfo> 
     <Date>2006-05-02T13:21:17</Date> 
     <Author>AuthorName</Author> 
     <Version>1.0.0</Version> 
     <Description>Call MoveFile</Description> 
    </RegistrationInfo> 
    <Triggers> 
     <CalendarTrigger> 
      <StartBoundary>2011-11-02T00:00:00</StartBoundary> 
      <ScheduleByDay> 
       <DaysInterval>1</DaysInterval> 
      </ScheduleByDay> 
     </CalendarTrigger> 
    </Triggers> 
    <Principals> 
     <Principal> 
      <UserId>Administrator</UserId> 
      <LogonType>InteractiveToken</LogonType> 
     </Principal> 
    </Principals> 
    <Settings> 
     <Enabled>true</Enabled> 
     <AllowStartOnDemand>true</AllowStartOnDemand> 
     <AllowHardTerminate>true</AllowHardTerminate> 
    </Settings> 
    <Actions> 
     <Exec> 
      <Command>C:\Program Files\Java\jre6\bin\javaw.exe</Command> 
      <Arguments>main.MoveFile input.txt</Arguments> 
      <WorkingDirectory>C:\My Library</WorkingDirectory> 
     </Exec> 
    </Actions> 
</Task> 

Nie ma więcej informacji na temat schematu XML tutaj: http://msdn.microsoft.com/en-us/library/windows/desktop/aa383609(v=VS.85).aspx

10

UPDATE: Note począwszy od Powershell v3 (ale tylko pod Windows 2012 i nowszym!) Tam nowe API, które uważam za znacznie bardziej atrakcyjne:

$taskPath = "\MyTasksFolder\" 
$name = 'MyTask' 
$runAt = '5:00 AM' 
$exe = 'my.exe' 
$params = 'command line arguments' 
$location = "C:\Path\To\MyTask" 

Unregister-ScheduledTask -TaskName $name -TaskPath $taskPath -Confirm:$false -ErrorAction:SilentlyContinue 

$action = New-ScheduledTaskAction –Execute "$location\$exe" -Argument "$params" -WorkingDirectory $location 
$trigger = New-ScheduledTaskTrigger -Daily -At $runAt 
Register-ScheduledTask –TaskName $name -TaskPath $taskPath -Action $action –Trigger $trigger –User 'someuser' -Password 'somepassword' | Out-Null 

rozwiązanie Amal jest z /v1 przełącznika jest wielki, ale nie pozwala na tworzenie zadań w folderach niestandardowych (czyli nie można utworzyć „MyCompany \ MyTask "i wszystko kończy się w folderze głównym), więc w końcu otrzymałem skrypt PowerShell opisany poniżej.

Zastosowanie:

CreateScheduledTask -computer:"hostname-or-ip" ` 
        -taskName:"MyFolder\MyTask" ` 
        -command:"foo.exe" ` 
        -arguments:"/some:args /here" ` 
        -workingFolder:"C:\path\to\the\folder" ` 
        -startTime:"21:00" ` 
        -enable:"false" ` 
        -runAs:"DOMAIN\user" ` 
        -runAsPassword:"[email protected]$$w0rd" 

(Uwaga, enable musi być małe - o wartości logicznej należałoby $value.ToString().ToLower())

Realizacja:

Funkcja używa definicji zadania XML oraz obiekt COM "Schedule.Service".

##################################################### 
# 
# Creates a Windows scheduled task triggered DAILY. 
# Assumes TODAY start date, puts "run-as" user as task author. 
# 
##################################################### 
function CreateScheduledTask($computer, $taskName, $command, $arguments, $workingFolder, $startTime, $enable, $runAs, $runAsPassword) 
{  
    $xmlTemplate = "<?xml version='1.0' encoding='UTF-16'?> 
     <Task version='1.2' xmlns='http://schemas.microsoft.com/windows/2004/02/mit/task'> 
      <RegistrationInfo> 
      <Date>{0}</Date> 
      <Author>{1}</Author> 
      </RegistrationInfo> 
      <Triggers> 
      <CalendarTrigger> 
       <StartBoundary>{2}</StartBoundary> 
       <Enabled>true</Enabled> 
       <ScheduleByDay> 
       <DaysInterval>1</DaysInterval> 
       </ScheduleByDay> 
      </CalendarTrigger> 
      </Triggers> 
      <Principals> 
      <Principal id='Author'> 
       <UserId>{1}</UserId> 
       <LogonType>Password</LogonType> 
       <RunLevel>LeastPrivilege</RunLevel> 
      </Principal> 
      </Principals> 
      <Settings> 
      <IdleSettings> 
       <Duration>PT10M</Duration> 
       <WaitTimeout>PT1H</WaitTimeout> 
       <StopOnIdleEnd>true</StopOnIdleEnd> 
       <RestartOnIdle>false</RestartOnIdle> 
      </IdleSettings> 
      <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy> 
      <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries> 
      <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries> 
      <AllowHardTerminate>true</AllowHardTerminate> 
      <StartWhenAvailable>false</StartWhenAvailable> 
      <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable> 
      <AllowStartOnDemand>true</AllowStartOnDemand> 
      <Enabled>{3}</Enabled> 
      <Hidden>false</Hidden> 
      <RunOnlyIfIdle>false</RunOnlyIfIdle> 
      <WakeToRun>false</WakeToRun> 
      <ExecutionTimeLimit>P3D</ExecutionTimeLimit> 
      <Priority>7</Priority> 
      </Settings> 
      <Actions Context='Author'> 
      <Exec> 
       <Command>{4}</Command> 
       <Arguments>{5}</Arguments> 
       <WorkingDirectory>{6}</WorkingDirectory> 
      </Exec> 
      </Actions> 
     </Task>" 
    $registrationDateTime = [DateTime]::Now.ToString("yyyy-MM-dd") + "T" + [DateTime]::Now.ToString("HH:mm:ss") 
    $startDateTime = [DateTime]::Now.ToString("yyyy-MM-dd") + "T" + $startTime + ":00" 
    $xml = $xmlTemplate -f $registrationDateTime, $runAs, $startDateTime, $enable, $command, $arguments, $workingFolder 

    $sch = new-object -ComObject("Schedule.Service") 
    $sch.Connect($computer) 
    $task = $sch.NewTask($null) 
    $task.XmlText = $xml 

    $createOrUpdateFlag = 6 
    $sch.GetFolder("\").RegisterTaskDefinition($taskName, $task, $createOrUpdateFlag, $runAs, $runAsPassword, $null, $null) | out-null 
} 
+2

Niestety jest to dostępne tylko dla Powershell 3 w systemie Windows 2012 i nowszych wersjach. Windows 2008R2 tego nie ma, nawet z Powershell 3. – Brain2000

+0

Dobry połów. Zaktualizowano odpowiedź – andreister

+0

XML wydaje się być najlepszym rozwiązaniem, przynajmniej jeśli chcesz napisać skrypt, który może być używany na różnych serwerach, szczególnie w wersji wcześniejszej niż Windows Server 2012. –

2

Spróbuj

cd /d "C:\Program Files\Java\jre6\bin" & schtasks /create /tr "C:\Program Files\Java\jre6\bin\javaw.exe main.MoveFile input.txt" /sc WEEKLY /tn mytask 

Zmień katalog roboczy, a następnie uruchomić schtasks.

+1

Ta metoda działa w systemie Windows Server 2008, ale nie działa ". t działa w systemie Windows Server 2008 R2. :( –

+0

Ta metoda nie działa w systemie Windows 8.1 ani w systemie Windows 2008 R2 Standard –

5

Jeśli wszystko inne zawiedzie, możesz przekierować do pliku wsadowego, który ustawia jego własny dysk CD, a następnie wywołuje twój program.
np

Schtasks /Create /TR "C:\example\batch.bat" /SC WEEKLY /TN mytask 

Jako schtask i

cd "%temp%\" 
"C:\Program Files\Java\jre6\bin\javaw.exe main.MoveFile input.txt" 

jako "Przykład C: \ \ batch.bat". To powinno zachować bieżący katalog jako cokolwiek zmienisz go do pliku wsadowego i zachować wszystkie referencje względem tego.

+0

Jest to najlepsze rozwiązanie, które powinno zostać przejęte. W przeciwieństwie do innych rozwiązań nie wymaga systemu Windows 2012 ani rozwiązania XML, a także nie działa. nie ma problemów z Windows 2008 R2. – twasbrillig

+0

+1 za przypomnienie mi, że można określić plik .bat bezpośrednio w/TR, nie trzeba wywoływać cmd.exe, itp. – BobHy

+0

to rozwiązanie jest ładne i użyłem go, ale nie pozwoli mi zaplanować drugiego zadania, aby zabić aplikację konsoli win32 z taskkill/t, co jest możliwe, jeśli nie uruchomię pliku .bat. Jedynym sposobem na zabicie takiej aplikacji jest taskkill/f która nie pozwoli na wyczyszczenie programu przed wymuszonym zabiciem. – Micka

0

Uwaga: W tym jest problem, że właśnie widziałem z tego ..

Uwaga: Trzeba mieć dwie linie:

REM NOTE:You have to create the schedule first 
SCHTASKS /S SERVER /CREATE /TN "SERVER_RESTART" /RU "" /TR "D:\WORK\scripts\__server_restart.bat 1" /SC MONTHLY /MO FIRST /D SUN /ST:02:10 
REM The next line is run to set the run in folder as well as set the: run as: NT AUTHORITY\SYSTEM 
SCHTASKS /S SERVER /CHANGE /TN "SERVER_RESTART" /RU "" /TR "D:\WORK\scripts\__server_restart.bat 1" 

Jedną z rzeczy, które zauważyłem w systemie Windows 2008, jest to, że na przykład obsługuje skrypty wsadowe znacznie lepiej niż w 2003 roku. Nie sądzę, że folder "run in" jest tak samo ważny, jak po prostu uruchomiłem restart serwera na maszynie testowej ręcznie z Task Scheduler i działa dobrze ..

Dla osób, które mogą borykać się z problemami z ucieczką postacie i takie, należy rozważyć następujące kwestie:

SCHTASKS /CHANGE /S SERVER /RU "" /TR "powershell -file "\"D:\WORK\ps\zip_up_files\zip_up_files.ps1"\"" /TN "PowerShell - New Archive" 

lub inny przykład:

SCHTASKS /CREATE /S SERVER /RU "" /TR "powershell -file "\"D:\WORK\ps\page_test.ps1"\"" /TN "PowerShell - Page Test" /SC MINUTE /MO 3 /ST:23:00 

Uwaga: dodatkowe Cytowanie i dodatkowe backslashy.

Mam nadzieję, że to pomoże!

0

Jedynym sposobem byłoby użycie XML Flle, użyj następującego polecenia: schtasks/Create/XML C: \ file.xml/TN TaskName/RU domena \ nazwa_użytkownika hasło/RP

Przykładowy plik XML, który będzie działał codziennie o 23:00, C: \ taskfolder będzie ustawić bieg w katalogu:

<?xml version="1.0" encoding="UTF-16"?> 
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"> 
    <RegistrationInfo> 
    <Date>2016-07-13T07:56:56</Date> 
    <Author>Administrator</Author> 
    </RegistrationInfo> 
    <Triggers> 
    <CalendarTrigger> 
     <StartBoundary>2016-07-13T23:00:00</StartBoundary> 
     <Enabled>true</Enabled> 
     <ScheduleByDay> 
     <DaysInterval>1</DaysInterval> 
     </ScheduleByDay> 
    </CalendarTrigger> 
    </Triggers> 
    <Principals> 
    <Principal id="Author"> 
     <UserId>domain\Administrator</UserId> 
     <LogonType>Password</LogonType> 
     <RunLevel>HighestAvailable</RunLevel> 
    </Principal> 
    </Principals> 
    <Settings> 
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy> 
    <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries> 
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries> 
    <AllowHardTerminate>true</AllowHardTerminate> 
    <StartWhenAvailable>false</StartWhenAvailable> 
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable> 
    <IdleSettings> 
     <StopOnIdleEnd>true</StopOnIdleEnd> 
     <RestartOnIdle>false</RestartOnIdle> 
    </IdleSettings> 
    <AllowStartOnDemand>true</AllowStartOnDemand> 
    <Enabled>true</Enabled> 
    <Hidden>false</Hidden> 
    <RunOnlyIfIdle>false</RunOnlyIfIdle> 
    <WakeToRun>false</WakeToRun> 
    <ExecutionTimeLimit>P3D</ExecutionTimeLimit> 
    <Priority>7</Priority> 
    </Settings> 
    <Actions Context="Author"> 
    <Exec> 
     <Command>C:\taskfolder\task.bat</Command> 
     <WorkingDirectory>C:\taskfolder</WorkingDirectory> 
    </Exec> 
    </Actions> 
</Task>