2017-08-14 172 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

已添加代码,所有内容都以最高用户权限运行,并标记为运行用户是否已登录 –

相关问题