power shell script for add datetime to file

  • Hi,

    i would like to generate csv file with datetime  through sql job with below power shell script.But it didn't work.

    Any suggessions.

    $dt=get-date -format "_yyyymmmd_HHmss"

    Invoke-Sqlcmd -Query "SELECT * FROM [xxxxxx].[xxxx].[xxxxx]" -ServerInstance "LocalHost" |

    Export-Csv -Path D:\folder\data$dt.csv" -NoTypeInformation

     

     

    Thanks.

  • Sure, here are some suggestions:

    $dt=get-date -format "_yyyymmmd_HHmss"

    What is this supposed to return exactly? I have never met a 3 digit month before nor can I write any minute above 9 because there is no space for 2 digits? The minute part might just work, the 3 digit month definitely not.

    $dt=get-date -format "_yyyyMMdd_HHmmss"

    works excellently for me, yours did too but I got data_20192220_xxxxxx.csv instead as a result.

  • DinoRS wrote:

    I have never met a 3 digit month before

    MMM notation for a month means the first 3 characters of the name of the month? m and d, etc, are perfectly valid for the minutes and days though, and would return the value without a leading zero. So today's day, with the format yyyyMMMd would return 2019Nov20. For a date and time like 2019-12-07 17:09:03 the format yyyyMMd_HHmss would return 2019Dec7_17903; which I won't lie, is a bizarre value and would hope I never have to work with dates in that format.

    Thom~

    Excuse my typos and sometimes awful grammar. My fingers work faster than my brain does.
    Larnu.uk

  • okay I think then we solved the puzzle, the issue is

    $dt=get-date -format "_yyyymmmd_HHmss"

    should be

    $dt=get-date -format "_yyyyMMMdd_HHmss"

    I personally never thought of MMM as "Nov" - which admittedly makes sense (and for me begs a different question whose answer is probably well documented - how would you get full month names in this context?) - but Thom A is spot on right, and I think I recall learning somewhere that case sensivity matters here because otherwise it would be hard to guess if you want a double digit minute ("mm") or a month ("MM") in that position of the string.

    Just on a sidenote: if you intend to process the generated file somewhere else based on the date part, I would still suggest going with double digit minutes like

    $dt=get-date -format "_yyyyMMMdd_HHmmss"

    because this makes parsing a date from the filename easier.

  • DinoRS wrote:

    (and for me begs a different question whose answer is probably well documented - how would you get full month names in this context?) .

    That would be MMMM:

    PS C:\> get-date -format "yyyy MMMM dd"
    2019 November 20

    Custom date and time format strings might be of interest to you.

    Personally, for a consistently sized value, I would use yyyyMMdd_HHmmss which would translate in words to: "4 digit year, 2 digit month with leading zero, 2 digit day with leading zero, underscore, 2 digit hour with leading zero using 24 hour values, 2 digit minutes with leading zero, 2 digit seconds with leading zero".

    • This reply was modified 5 years ago by  Thom A. Reason: Added link to documentation

    Thom~

    Excuse my typos and sometimes awful grammar. My fingers work faster than my brain does.
    Larnu.uk

  • adisql wrote:

    Hi,

    i would like to generate csv file with datetime  through sql job with below power shell script.But it didn't work.

    Any suggessions.

    $dt=get-date -format "_yyyymmmd_HHmss"

    Invoke-Sqlcmd -Query "SELECT * FROM [xxxxxx].[xxxx].[xxxxx]" -ServerInstance "LocalHost" |

    Export-Csv -Path D:\folder\data$dt.csv" -NoTypeInformation

    Thanks.

    Not sure what didn't work - did you get an error, an incorrect file name - something else?

    For the file name, I would do this:

    $fileName = "D:\folder\data$(dt).csv";

    Then

    ... | Export-Csv -Path $fileName -NoTypeInformation

     

    Jeffrey Williams
    “We are all faced with a series of great opportunities brilliantly disguised as impossible situations.”

    ― Charles R. Swindoll

    How to post questions to get better answers faster
    Managing Transaction Logs

  • Sorry I was busy with prod issue after this post .i will check your suggestions tomorrow and reply.

    Thank you for your suggestions.

     

  • Hi,

    I tried with below script through sql job and its failing with below error.

    script:

    $dt=get-date -format "_yyyyMMMdd_HHmss"

    Invoke-Sqlcmd -Query "SELECT * FROM [XXXXX].[XXX].[XXX]" -ServerInstance "LocalHost" |

    Export-Csv -Path D:\folder\data$dt.csv" -NoTypeInformation

    Error Message:

    Executed as user: XXXXX. Unhandled Exception:System.FormatException: Index (zero based) must be greater than or equal to zero and less than the size of the argument list. at System.Text.StringBuilder.AppendFormatHelper(IFormatProvider provider, String format, ParamsArray args) at System.String.FormatHelper(IFormatProvider provider, String format, ParamsArray args) at System.String.Format(IFormatProvider provider, String format, Object[] args) at Microsoft.SqlServer.Management.PowerShell.SqlPowerShell.GetErrorRecordMessage(ErrorRecord errorRecord) at Microsoft.SqlServer.Management.PowerShell.SqlPowerShell.HandleAgentJob(RunspaceConfiguration config) at Microsoft.SqlServer.Management.PowerShell.SqlPowerShell.Main(String[] args). Process Exit Code 255. The step failed.

  • Hi Jeffrey,

    thank you for your response.

    I tried with your suggestion but it gives different error below.

    script:

    $dt=get-date -format "_yyyymmmd_HHmss"

    Invoke-Sqlcmd -Query "SELECT * FROM XXXXXXX" -ServerInstance "LocalHost"

    $fileName = "D:\folder\data$(dt).csv" |

    Export-Csv -Path $fileName -NoTypeInformation

    Error:

    Unable to start execution of step 1 (reason: The job step contains tokens. For SQL Server 2005 Service Pack 1 or later, you must use the appropriate ESCAPE_xxx macro to update job steps containing tokens before the job can run.). The step failed.

  • OK, I played with this a bit and got this to work:

    $dt = get-date -format "_yyyyMMMdd_HHmss"

    Invoke-Sqlcmd -Query "SELECT * FROM [dbo].[Customer]" -ServerInstance "Plato\SQL2017" -Database "Sandbox" |
    Export-Csv -Path "E:\Documents\sql\$($dt).csv" -NoTypeInformation

    I explicitly chose the database, which is something I don't think matters. If I add the database as a three part name and remove the -Database parameter, it still works.

    What I think it broken is your use of a double quotes at the end of the -Path parameter without one at the beginning. I added that, along with expression expansion, and this works. I think the period causes issues for PoSh with the end of the name. If I remove all the quotes, this also works.

     

Viewing 10 posts - 1 through 9 (of 9 total)

You must be logged in to reply to this topic. Login to reply