2011-10-27 168 views
4

我最近在我的SBS 2008 SP2服務器上安裝了Powershell 2.0,並相信它運行良好。當登錄到服務器,既的Windows PowerShell(x86)的的Windows PowerShell程序有GET-ExecutionPolicy設置爲下RemoteSigned。兩個Poweshell的Get-Host顯示版本爲2.0Powershell 2.0腳本運行在cmd.exe中,但不運行任務計劃程序

的腳本保存在C:服務器的\腳本\ Powershell的\,被稱爲TaskScheduler_Get_SFTP_Files.ps1

如果我從CMD.EXE在運行C:\命令Powershell的C:\ Script \ Powershell \ TaskScheduler_Get_SFTP_Files.ps1,然後Powershell使用從PuTTY下載的各種命令連接到FTP帳戶,重命名下載的文件,然後將它們保存到它們的位置。在我的scipt中,我有各種不同的命令,當我手動運行腳本時,我可以在cmd shell中看到發生了什麼。這工作正常從cmd.exe調用,我可以看到下載的文件的最終目錄。

另一方面,任務計劃程序似乎需要甜言蜜語來鼓勵工作(目前超出我的詞彙量)。在任務計劃程序,我已經建立了一個具有以下規格(從XML導出複製)工作,並提請你注意我如何打電話PowerShell將使用參數:

<Principal id="Author"> 
     <UserId>WOODBRIDGE\ADMIN</UserId> 
     <LogonType>Password</LogonType> 
     <RunLevel>HighestAvailable</RunLevel> 
    </Principal> 
    <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>true</Enabled> 
    <Hidden>false</Hidden> 
    <RunOnlyIfIdle>false</RunOnlyIfIdle> 
    <WakeToRun>true</WakeToRun> 
    <ExecutionTimeLimit>PT4H</ExecutionTimeLimit> 
    <Priority>7</Priority> 
    </Settings> 
    <Actions Context="Author"> 
    <Exec> 
     <Command>Powershell</Command> 
     <Arguments>-NoProfile -File C:\Script\Powershell\TaskScheduler_Get_SFTP_Files.ps1</Arguments> 
    </Exec> 
    </Actions> 

當看歷史記錄任務,其中一個項目是EventID 201,其中常規註釋爲「任務計劃程序成功完成任務」\ XXX \ YYYYYYYYYYYYYYYYYYYYY「,實例」{23dee164-ea4b-4ed5-ba48-19f07bb83f3e}「,操作」C:\ Windows \ System32 \ WindowsPowerShell \ v1.0 \ Powershell.EXE「與返回碼0。」

任何幫助將不勝感激?

+0

你幹得不錯領導到說明您登錄的東西文件在整個過程中的問題。你可以添加是否出現這些日誌文件? (我猜不是)另外,你看到這個任務的運行時間? (我猜這很快,因爲它實際上並不工作)。當您嘗試從CMD.exe運行時,您是否按照該確切順序使用這些EXACT參數?最後,如果使用以下命令替換參數會發生什麼情況:-command「C:\ Script \ Powershell \ TaskScheduler_Get_SFTP_Files.ps1」 –

+0

您是否查看了登錄的安全/配置文件問題?當您從命令行運行它時,您是否以WOODBRIDGE \ ADMIN身份登錄?我不會猜測,這是我認爲可能導致你的問題的第一個區別。 –

+0

回覆Tom H.當我登錄到服務器上時,我以管理員身份登錄,當我啓動cmd.exe時,我以管理員身份登錄。 Task Scheduler是我使用同一個Admin帳戶定義的服務器上的實例。 Bertie – Bertie

回答

0

請嘗試更改您的命令參數如下:

-noprofile -nologo -command "&{C:\Script\Powershell\TaskScheduler_Get_SFTP_Files.ps1}" 
1

@nimizen解決方案將工作,但在PowerShell 2.0中有啓動腳本文件稍微更簡單的方法:

-NoLogo -File C:\Script\Powershell\TaskScheduler_Get_SFTP_Files.ps1 

與否您還使用-NoProfile選項取決於您的配置文件是否加載腳本所需的模塊或管理單元。

+0

啊,謝謝基思......好的信息。 – nimizen

1

這是一個奇怪的,我還沒有完全達到底部。感謝所有參與者的貢獻。我已經在任務計劃程序中推薦顯示-NoLogo - 無配置文件 - 文件...

唯一的問題是我的Powershell sricpt不會執行創建新目錄的有用段,下載FTP文件並重命名他們。在腳本開始時,我有一個dir> C:\ Temp \ Dir.txt命令來執行(這只是爲了查看Task Scheduler是否確實開始執行任務),但是對我來說,實際的部分是intetest (下載並處理來自FTP的信息的位不起作用。

從任務計劃程序中,我不得不將安全選項更改爲「僅在用戶登錄時運行」,並且用戶是SBS 2008的管理員。如果我嘗試將任務保留爲「運行用戶已登錄或未登錄「,並勾選」用最高級別運行「複選框,僅運行目錄副本的部分運行。我只是在Powershell中編程了一個星期,對於正則表達式我不太習慣,所以我的代碼效率很低(有人可能會發現代碼的FTP部分爲什麼不能運行)?目前,我將離開任務計劃程序到「僅在用戶登錄時運行」,至少這樣才能下載和處理文件。

謝謝大家。 (對不起,我的可怕的代碼發佈,但它可能是顯而易見的有人爲什麼超出dir> C:\ Scripts \ Powershell \ dir.txt超出部分不運行時,任務計劃程序「運行用戶是否登錄」和使用和它可以幫助人們一個非常基本的inelegenat和不安全的SFTP腳本下載文件?)

# ----------------------------------------------------------------------------- 
clear 
dir > C:\Scripts\Powershell\dir.txt 
$ErrorActionPreference = 'SilentlyContinue' 
# Do not change the MM to mm as it will NOT return the month! 
[string]$TodayDate = Get-Date -Format "yyyyMMdd" 
[string]$DayName = Get-Date -Format "dddd" 


# ----------------------------------------------------------------------------- 
# Define the environment variables 
$ScriptPath = 'W:\IT\Utilities\PuTTY\' 
$DestFolder = 'W:\BBBB\Statements\' 
$BBBB_acc = '[email protected]:outgoing/*.*' 
$BBBB_pwd = 'myPassword' 
$DoDelete = $false 
$Ext = @(".csv", ".pdf") 
$ExpectedFileNames = @("marginreport", "XXX14444", "XXX1cash", "XXX1money", "XXX1opnpos", "XXX1trades", "XXX1_an", "XXX1_ds", "XXX1_ep", "XXX1_ms") 
$ReplacedFileNames = @("Margin_MAC", "Call_Interest", "XXX_Cash", "XXX_Money", "XXX_Open", "XXX_Trades", "Margin_Analysis", "FFO", "XXX_EP", "Margin_Summary") 


$DoDownload = $true 
IF ($DayName -eq "Saturday") {$DoDownload = $false} 
IF ($DayName -eq "Sunday") {$DoDownload = $false} 


# ----------------------------------------------------------------------------- 
if ($DoDownload) { 
    # Make sure the destination directories exist 
    IF (!(Test-Path $DestFolder)){ 
     New-Item -type directory -path $DestFolder 
     # Write-Output ('Created target directory: ' + $DestFolder) 
     } 

    $TodaysDestFolder = $DestFolder + $TodayDate  
    IF (!(Test-Path $TodaysDestFolder)){ 
     New-Item -type directory -path $TodaysDestFolder 
     # Write-Output ('Created todays target directory: ' + $TodaysDestFolder) 
     } 


    # ----------------------------------------------------------------------------- 
    # SFTP todays Files 
    # Old method of calling calling a batch file .\Download_BBBB_Outgoing.bat 
    & ($ScriptPath + '\pscp.exe') -sftp -P 22 -pw $BBBB_pwd $BBBB_acc $DestFolder 
    # Write-Output ("Finished Downloading Files") 


    # ----------------------------------------------------------------------------- 
    # Create the FTP Delete Script, Rename and Move the Files 
    # The PuTTY batch files need to be ASCII, Powershell by default may write in UNICODE 
    # Write-Output ('Creating Script File for FTP') 
    $BBBB_Pattern = '\.(csv|pdf)' 
    $BBBB_Script_FileName = "SFTP_BBBB_Delete_Files.txt" 
    $BBBB_Script_FullFileName = $DestFolder + "\" + $BBBB_Script_FileName 

    # Get-ChildItem $DestFolder -Recurse seems to traverse all subdirectories 
    $Count = 0 
    "cd outgoing" | Out-File $BBBB_Script_FullFileName -encoding ASCII -force 
    Get-ChildItem $DestFolder | Foreach-Object { 
     if ($_.Name -match $BBBB_Pattern) { 
      # Append the instruction to delete the file to the FTP script 
      "del " + $_ | Out-File $BBBB_Script_FullFileName -encoding ASCII -append 

      # Find the extension of the file 
      $i = 0 
      while ((($_.name).ToLower()).IndexOf($Ext[$i]) -eq -1){ 
       $i++} 

      # See if there is a replacement name for the file 
      $j = 0 
      while ((($_.name).ToLower()).IndexOf($ExpectedFileNames[$j]) -eq -1){    
       $j++} 

      # Construct FileName 
      $FTPDateStamp = ($_.name).substring(($_.name).length - 14, 14) 
      $FTPDateStamp = $FTPDateStamp -replace("\.","") 
      $IdxExt = (($_.Name).tolower()).IndexOf($Ext[$i]) 
      if ($j -eq -1){ 
       $NewName = ($_.name).substring(0,$IdxExt) + '_20' + $FTPDateStamp + $Ext[$i] 
       } 
      else { 
       $NewName = $ReplacedFileNames[$j] + '_20' + $FTPDateStamp + $Ext[$i] 
       } 

      Rename-Item ($DestFolder + "\" + $_) -NewName $NewName 
      Move-Item ($DestFolder + $NewName) $TodaysDestFolder 
      $Count = $Count + 1 
      } 
     } 

    # ----------------------------------------------------------------------------- 
    # Delete the downloaded files from the SFTP 
    # PSFTP will terminate the batch if an error occurs. This can be changed with the -be switch 
    # See 6.1.1 of the PuTTY release notes 
    if ($DoDelete) { 
     if ($Count -gt 0) { 
      # Write-Output ('Deleting the downloaded files from SFTP account') 
      & ($ScriptPath + '\psftp.exe') -batch [email protected] -pw $BBBB_pwd -P 22 -b $BBBB_Script_FullFileName 
      } 
     } 

    Remove-Item $BBBB_Script_FullFileName 
    $ErrorActionPreference = 'Continue' 
    # Write-Output ('Script finished to download from BBBB SFTP account') 
    } 
+0

當您使用 HighestAvailable時,請確保從管理PowerShell中進行測試。如果管理PowerShell與非管理PowerShell的環境不同,則腳本可能因不同的環境變量等原因而失敗。 – Eagle

相關問題