2017-08-14 188 views
-1

如果需要(它相當長),我可以發佈代碼,但缺點是我有一個Ps1腳本獲取有關共享信息(文件名,創建日期等)和創建一個CSV。文件在一個位置。然後它將所有csv更改爲xlsx並刪除csv。當手動運行時,這完美地工作,當計劃通過具有最高權限的任務計劃程序運行時,它創建csv,然後刪除所有內容,似乎跳過轉換爲xlsx。PowerShell運行時通過任務調度程序運行不同

當手動運行或通過任務調度程序運行時,會導致相同腳本的行爲不同?

下面的代碼:

###Make sure I can Access the Share 
net use \\Share\Share /user:USER PASS /persisten:no 

###Move the ones that exist to Back-Up Delete Backup 
Remove-Item C:\Users\USER\Desktop\OutputBk\* -recurse 
Get-ChildItem -Path "C:\Users\USER\Desktop\Output" -Recurse -File | Move-Item -Destination "C:\Users\USER\Desktop\OutputBk" 

### Output1 

Get-ChildItem -Path \\SHARE\Output1 -Recurse | Select-Object CreationTime, LastAccessTime, LastWriteTime, Extension, Length, BaseName, PSParentPath, PSChildName, Directory, DirectoryName, DBDateAdded | Export-CSV C:\Users\USER\Desktop\Output\Output1.csv -NoTypeInformation 

### Output2 

Get-ChildItem -Path \\SHARE\Output2 -Recurse | Select-Object CreationTime, LastAccessTime, LastWriteTime, Extension, Length, BaseName, PSParentPath, PSChildName, Directory, DirectoryName, DBDateAdded | Export-CSV C:\Users\USER\Desktop\Output\Output2.csv -NoTypeInformation 

### Output3 

Get-ChildItem -Path \\SHARE\ Output3-Recurse | Select-Object CreationTime, LastAccessTime, LastWriteTime, Extension, Length, BaseName, PSParentPath, PSChildName, Directory, DirectoryName, DBDateAdded | Export-CSV C:\Users\USER\Desktop\Output\Output3.csv -NoTypeInformation 

### Output4 

Get-ChildItem -Path \\SHARE\ Output4 -Recurse | Select-Object CreationTime, LastAccessTime, LastWriteTime, Extension, Length, BaseName, PSParentPath, PSChildName, Directory, DirectoryName, DBDateAdded | Export-CSV C:\Users\USER\Desktop\Output\Output4.csv -NoTypeInformation 

### Output5 

Get-ChildItem -Path \\SHARE\ Output5 -Recurse | Select-Object CreationTime, LastAccessTime, LastWriteTime, Extension, Length, BaseName, PSParentPath, PSChildName, Directory, DirectoryName, DBDateAdded | Export-CSV C:\Users\USER\Desktop\Output\Output5.csv -NoTypeInformation 

### Output6 

Get-ChildItem -Path \\SHARE\ Output6 -Recurse | Select-Object CreationTime, LastAccessTime, LastWriteTime, Extension, Length, BaseName, PSParentPath, PSChildName, Directory, DirectoryName, DBDateAdded | Export-CSV C:\Users\USER\Desktop\Output\Output6.csv -NoTypeInformation 

### Output7 

Get-ChildItem -Path \\SHARE\ Output7 -Recurse | Select-Object CreationTime, LastAccessTime, LastWriteTime, Extension, Length, BaseName, PSParentPath, PSChildName, Directory, DirectoryName, DBDateAdded | Export-CSV C:\Users\USER\Desktop\Output\Output7.csv -NoTypeInformation 

### Output8 

Get-ChildItem -Path \\SHARE\ Output8 -Recurse | Select-Object CreationTime, LastAccessTime, LastWriteTime, Extension, Length, BaseName, PSParentPath, PSChildName, Directory, DirectoryName, DBDateAdded | Export-CSV C:\Users\USER\Desktop\Output\Output8.csv -NoTypeInformation 

### Output9 

Get-ChildItem -Path \\SHARE\ Output9 -Recurse | Select-Object CreationTime, LastAccessTime, LastWriteTime, Extension, Length, BaseName, PSParentPath, PSChildName, Directory, DirectoryName, DBDateAdded | Export-CSV C:\Users\USER\Desktop\Output\Output9.csv -NoTypeInformation 

### Output10 

Get-ChildItem -Path \\SHARE\ Output10 -Recurse | Select-Object CreationTime, LastAccessTime, LastWriteTime, Extension, Length, BaseName, PSParentPath, PSChildName, Directory, DirectoryName, DBDateAdded | Export-CSV C:\Users\USER\Desktop\Output\Output10.csv -NoTypeInformation 

### Output11 

Get-ChildItem -Path "\\SHARE\Recycle Bin - Output11" -Recurse | Select-Object CreationTime, LastAccessTime, LastWriteTime, Extension, Length, BaseName, PSParentPath, PSChildName, Directory, DirectoryName, DBDateAdded | Export-CSV C:\Users\USER\Desktop\Output\Output11.csv -NoTypeInformation 

### Output12 

Get-ChildItem -Path "\\SHARE\Recycle Bin - Output12" -Recurse | Select-Object CreationTime, LastAccessTime, LastWriteTime, Extension, Length, BaseName, PSParentPath, PSChildName, Directory, DirectoryName, DBDateAdded | Export-CSV C:\Users\USER\Desktop\Output\Output12.csv –NoTypeInformation 

### Convert the CSV to XLSX 

$workingdir = "C:\Users\USER\Desktop\Output\*.csv" 
$csv = dir -path $workingdir 
foreach($inputCSV in $csv){ 
$outputXLSX = $inputCSV.DirectoryName + "\" + $inputCSV.Basename + ".xlsx" 

#### Create a new Excel Workbook with one empty sheet 
$excel = New-Object -ComObject excel.application 
$excel.DisplayAlerts = $False 
$workbook = $excel.Workbooks.Add(1) 
$worksheet = $workbook.worksheets.Item(1) 

### Build the QueryTables.Add command 
### QueryTables does the same as when clicking "Data » From Text" in Excel 
$TxtConnector = ("TEXT;" + $inputCSV) 
$Connector = $worksheet.QueryTables.add($TxtConnector,$worksheet.Range("A1")) 
$query = $worksheet.QueryTables.item($Connector.name) 

### Set the delimiter (, or ;) according to your regional settings 
$query.TextFileOtherDelimiter = $Excel.Application.International(5) 

### Set the format to delimited and text for every column 
### A trick to create an array of 2s is used with the preceding comma 
$query.TextFileParseType = 1 
$query.TextFileColumnDataTypes = ,2 * $worksheet.Cells.Columns.Count 
$query.AdjustColumnWidth = 1 

### Execute & delete the import query 
$query.Refresh() 
$query.Delete() 

### Save & close the Workbook as XLSX. Change the output extension for Excel 2003 
$Workbook.SaveAs($outputXLSX,51) 
$excel.Quit() 
} 
### To exclude an item, use the '-exclude' parameter (wildcards if needed) 
remove-item -path $workingdir -exclude *Crab4dq.csv 

### Rename Output1 

$xlspath = "C:\Users\USER\Desktop\Output\Output1.xlsx" 
$xldoc = new-object -comobject Excel.application 
$xldoc.Visible = $false 
$xldoc.DisplayAlerts = $false 
$workbook = $xldoc.Workbooks.Open($xlspath) 
$worksheet = $workbook.worksheets.item(1) 
$worksheet.name = "1" 
$workbook.Save() 
$workbook.Close() 
$xldoc.Quit() 

### Rename Output2 

$xlspath = "C:\Users\USER\Desktop\Output\Output2.xlsx" 
$xldoc = new-object -comobject Excel.application 
$xldoc.Visible = $false 
$xldoc.DisplayAlerts = $false 
$workbook = $xldoc.Workbooks.Open($xlspath) 
$worksheet = $workbook.worksheets.item(1) 
$worksheet.name = "2" 
$workbook.Save() 
$workbook.Close() 
$xldoc.Quit() 

### Rename Output3 

$xlspath = "C:\Users\USER\Desktop\Output\Output3.xlsx" 
$xldoc = new-object -comobject Excel.application 
$xldoc.Visible = $false 
$xldoc.DisplayAlerts = $false 
$workbook = $xldoc.Workbooks.Open($xlspath) 
$worksheet = $workbook.worksheets.item(1) 
$worksheet.name = "3" 
$workbook.Save() 
$workbook.Close() 
$xldoc.Quit() 

### Rename Output4 

$xlspath = "C:\Users\USER\Desktop\Output\Output4.xlsx" 
$xldoc = new-object -comobject Excel.application 
$xldoc.Visible = $false 
$xldoc.DisplayAlerts = $false 
$workbook = $xldoc.Workbooks.Open($xlspath) 
$worksheet = $workbook.worksheets.item(1) 
$worksheet.name = "4" 
$workbook.Save() 
$workbook.Close() 
$xldoc.Quit() 

### Rename Output5 

$xlspath = "C:\Users\USER\Desktop\Output\Output5.xlsx" 
$xldoc = new-object -comobject Excel.application 
$xldoc.Visible = $false 
$xldoc.DisplayAlerts = $false 
$workbook = $xldoc.Workbooks.Open($xlspath) 
$worksheet = $workbook.worksheets.item(1) 
$worksheet.name = 「5" 
$workbook.Save() 
$workbook.Close() 
$xldoc.Quit() 

### Rename Output6 

$xlspath = "C:\Users\USER\Desktop\Output\Output6.xlsx" 
$xldoc = new-object -comobject Excel.application 
$xldoc.Visible = $false 
$xldoc.DisplayAlerts = $false 
$workbook = $xldoc.Workbooks.Open($xlspath) 
$worksheet = $workbook.worksheets.item(1) 
$worksheet.name = "6" 
$workbook.Save() 
$workbook.Close() 
$xldoc.Quit() 

### Rename Output7 

$xlspath = "C:\Users\USER\Desktop\Output\Output7.xlsx" 
$xldoc = new-object -comobject Excel.application 
$xldoc.Visible = $false 
$xldoc.DisplayAlerts = $false 
$workbook = $xldoc.Workbooks.Open($xlspath) 
$worksheet = $workbook.worksheets.item(1) 
$worksheet.name = "7" 
$workbook.Save() 
$workbook.Close() 
$xldoc.Quit() 

### Rename Output8 

$xlspath = "C:\Users\USER\Desktop\Output\Output8.xlsx" 
$xldoc = new-object -comobject Excel.application 
$xldoc.Visible = $false 
$xldoc.DisplayAlerts = $false 
$workbook = $xldoc.Workbooks.Open($xlspath) 
$worksheet = $workbook.worksheets.item(1) 
$worksheet.name = "8" 
$workbook.Save() 
$workbook.Close() 
$xldoc.Quit() 

### Rename Output9 

$xlspath = "C:\Users\USER\Desktop\Output\Output9.xlsx" 
$xldoc = new-object -comobject Excel.application 
$xldoc.Visible = $false 
$xldoc.DisplayAlerts = $false 
$workbook = $xldoc.Workbooks.Open($xlspath) 
$worksheet = $workbook.worksheets.item(1) 
$worksheet.name = "9" 
$workbook.Save() 
$workbook.Close() 
$xldoc.Quit() 

### Rename Output10 

$xlspath = "C:\Users\USER\Desktop\Output\Output10.xlsx" 
$xldoc = new-object -comobject Excel.application 
$xldoc.Visible = $false 
$xldoc.DisplayAlerts = $false 
$workbook = $xldoc.Workbooks.Open($xlspath) 
$worksheet = $workbook.worksheets.item(1) 
$worksheet.name = "10" 
$workbook.Save() 
$workbook.Close() 
$xldoc.Quit() 

### Rename Output11 

$xlspath = "C:\Users\USER\Desktop\Output\Output11.xlsx" 
$xldoc = new-object -comobject Excel.application 
$xldoc.Visible = $false 
$xldoc.DisplayAlerts = $false 
$workbook = $xldoc.Workbooks.Open($xlspath) 
$worksheet = $workbook.worksheets.item(1) 
$worksheet.name = "11" 
$workbook.Save() 
$workbook.Close() 
$xldoc.Quit() 

### Rename Output12 

$xlspath = "C:\Users\USER\Desktop\Output\Output12.xlsx" 
$xldoc = new-object -comobject Excel.application 
$xldoc.Visible = $false 
$xldoc.DisplayAlerts = $false 
$workbook = $xldoc.Workbooks.Open($xlspath) 
$worksheet = $workbook.worksheets.item(1) 
$worksheet.name = "12" 
$workbook.Save() 
$workbook.Close() 
$xldoc.Quit() 

感謝,

+0

可能由於Excel部分,而不是PowerShell /腳本。看看[這個StackOverflow後](https://stackoverflow.com/questions/35819825/powershell-scheduled-task-to-run-script-with-excel-com-object)和鏈接,和[這個超級用戶帖子](https ://superuser.com/questions/579900/why-cant-excel-open-a-file-when-run-from-task-scheduler)。他們詳細介紹了創建一個空文件夾的BS步驟,以及DCOM權限的較少BS步驟。如果你有宏,根據宏需要更改註冊表。 – gms0ulman

+0

[相關](https://stackoverflow.com/a/41635982/1630171)。 –

+0

該文件夾開放給「所有人」權限級別,並且沒有宏 - 我添加了代碼。 –

回答

0

ty gms0ulman - 感謝您的鏈接,我找到了答案。

這是一個DCOM權限問題。

我發現這種問題的唯一方法是將Excel設置爲通過DCOM權限作爲特定用戶運行。

打開組件服務(開始 - >運行,在DCOMCNFG型) 鑽取到組件服務 - >計算機 - >我的電腦,然後單擊DCOM配置上的Microsoft Excel應用程序 單擊鼠標右鍵,選擇屬性 在標識選項卡中選擇此用戶並輸入交互式用戶帳戶(域或本地)的ID和密碼,然後單擊「確定」。不幸的是,作爲交互式用戶或啓動不能與任務計劃程序一起使用,即使將任務設置爲在有管理員訪問機器的帳戶下運行

謝謝,

0

Task Properties - Mail Trigger

希望你給它有權修改該文件的賬戶,有的賬戶可能只有寫權限不修改共享文件夾中的文件。 在給予具有所需特權的帳戶後,如果問題仍然存在,則嘗試在刪除CSV文件的命令行之前添加「Start-Sleep -s 60」。有些時候刪除任務可能會覆蓋以前的任務,假設更改文件擴展名。如果以上任何一項都不起作用,請發佈腳本。

+0

已添加代碼,所有內容都以最高用戶權限運行,並標記爲運行用戶是否已登錄 –