Why PowerShell does not want to save my file in CSV format

$Path = 'D:/ETL_Data/TwitchTVData.xlsx'
$csvPath = 'D:/ETL_Data/TwitchTVData2.csv'

# Open the Excel document and pull in the 'Sheet1' worksheet
$Excel = New-Object -Com Excel.Application
$Workbook = $Excel.Workbooks.Open($Path)
$page = 'Sheet1'
$ws = $Workbook.Worksheets | Where-Object {$_.Name -eq $page}
$Excel.Visible = $true
$Excel.DisplayAlerts = $false

# Set variables for the worksheet cells, and for navigation
$cells = $ws.Cells
$row = 1
$col = 4
$formula = @"
=NOW()
"@

# Add the formula to the worksheet
$range = $ws.UsedRange
$rows = $range.Rows.Count
for ($i=0; $i -ne $rows; $i++) {
    $cells.Item($row, $col) = $formula
    $row++
}

$ws.Columns.Item("A:D").EntireColumn.AutoFit() | Out-Null
$ws.Columns.Range("D1:D$rows").NumberFormat = "yyyy-MM-dd hh:mm"

$Excel.ActiveWorkbook.SaveAs($csvPath)
$Excel.Quit()

[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)

https://www.experts-exchange.com/questions/27996530/How-to-convert-and-xlsx-spreadsheet-into-CSV.html#answer38780402-20

I tried to follow this, but for some reason does SaveAs()not work for me . It gives me an error

cannot access file 'D: // ETL_Data / E567DF00

What do I need to do to save this in CSV?

Edit:

The exact error without the fileformat parameter 6, as suggested in the comments:

Microsoft Excel cannot access the file 'D: \ // ETL_Data / 8011FF00'. There are
several possible reasons:
o The file name or path does not exist.
o The file is being used by another program.
o The workbook you are trying to save has the same name as a currently open
  workbook.
At D:\PS_Scripts\twitchExcelAddSnapShot.ps1:32 char:1
+ $Excel.ActiveWorkbook.SaveAs($csvPath)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], COMException
    + FullyQualifiedErrorId : System.Runtime.InteropServices.COMException

fileformat 6:

The file could not be accessed. Try one of the following:
o Make sure the specified folder exists.
o Make sure the folder that contains the file is not read-only.
o Make sure the file name does not contain any of the following characters:
  <  >  ?  [  ]  :  | or  *
o Make sure the file/path name doesn't contain more than 218 characters.
At D:\PS_Scripts\twitchExcelAddSnapShot.ps1:32 char:1
+ $Excel.ActiveWorkbook.SaveAs($csvPath,6)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], COMException
    + FullyQualifiedErrorId : System.Runtime.InteropServices.COMException
+4
2

PowerShell , , COM + (, Excel.Application) .

$csvPath, \ /:

$csvPath = 'D:\ETL_Data\TwitchTVData2.csv'
+4

. :

, Excel- , API.
(API Excel - COM-.)
, Excel - , , , , /.

:

  • Windows, , \, API- , API / - . .

  • - / ( , ; [System.IO.Path]::DirectorySeparatorChar () ).

, Windows API \ / (, -, DOS 2.0 ), ), , .

# PS:
# Should output c:\windows\win.ini
(Get-Item c:/windows/win.ini).FullName

# .NET:
# Should return the 1st child dir. path.
# Note that the child directory names will be appended with "\", not "/"
[System.IO.Directory]::GetDirectories('c:/windows/system32') | Select-Object -First 1

# COM:
# Should return $true
(New-Object -ComObject Scripting.FileSystemObject).FileExists('c:/windows/win.ini')

# Windows API:
# Should return a value such as 32.
(Add-Type -PassThru WinApiHelper -MemberDefinition '[DllImport("kernel32.dll")] public static extern uint GetFileAttributes(string lpFileName);')::GetFileAttributes('c:/windows/win.ini')

# cmd.exe
# Note: quoting matters here, so that tokens with / aren't mistaken for options.
# INCONSISTENT:
#     attrib: works
cmd /c 'attrib "c:/windows/win.ini"'  
#     dir: works with DIRECTORIES, but fails with FILES
cmd /c 'dir /b "c:/windows/system32"'  # OK
cmd /c 'dir /b "c:/windows/win.ini"'  # FAILS with 'File not found'
cmd /c 'dir /b "c:/windows\win.ini"'  # Using \ for the FILE component (only) works.

, Excel /:

# Create temporary dir.
$null = mkdir c:\tmp -force

$xl=New-Object -Com Excel.Application
$wb = $xl.Workbooks.Add()

# OK - with "\"
$wb.SaveAs('c:\tmp\t1.xlsx')

# FAILS - with "/":
# "Microsoft Excel cannot access the file 'C:\//tmp/F5D39400'"
$wb.SaveAs('c:/tmp/t2.xlsx')

$xl.Quit()

# Clean up temp. dir.
+2

Source: https://habr.com/ru/post/1674353/


All Articles