2017-10-25 28 views
0

私は私の目的を達成することができましたが、なぜ私はまだ何か間違っていると心配しています。PowerShellスクリプトのParseExactが文字列ではなくint64を受け入れるのはなぜですか?

コンテキストは、FTPを使用してファイルのタイムスタンプを取得するために、別の日付との比較のためにdatetime値を取得することです。日時は、これを使用して文字列として受け取られます:

$FTPrequest = [System.Net.FtpWebRequest]::Create($FTPTargetFile) 
$FTPrequest.Method = [System.Net.WebRequestMethods+FTP]::GetDateTimestamp 
$FTPrequest.Credentials = $Credentials 
$response = $FTPrequest.GetResponse().StatusDescription 
$tokens = $response.Split(" ") 
if ($tokens[0] -eq 213) { 
    $Timestampdata = $tokens[1] 
} else { 
    Write-Output "FTP timestamp request for " + $FTPTargetFile + " returned an error" 
} 

私が見つけたほぼすべての使用可能なリソースがそれを明確ParseExactは、スクリプトの次の行のように日時を導出する文字列を使用することを作っ:

$d = [DateTime]::ParseExact($Timestampdata,"yyyyMMddHHmmss",$null) 

スクリプト内かどうか、コマンドプロンプトで、一貫して上記の行は、次のエラーを返します。しかし:

 
Exception calling "ParseExact" with "3" argument(s): "String was not recognized 
as a valid DateTime." 
At C:\hw-sw\powershell\FTPupload option - getFileInfo.ps1:38 char:1 
+ $d = [DateTime]::ParseExact($Timestampdata,"yyyyMMddHHmmss",$null) 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : FormatException 

を私が見つけた2つのリンク(lin1、012がありました- 第二リンクはslighty別の問題に対処するが、ポイントがまだ行われている)ParseExact()は、スクリプトの次の行のように、代わりにINTxx処理を使用して提案:

$d = [DateTime]::ParseExact([convert]::ToInt64($Timestampdata),"yyyyMMddHHmmss",$null) 

そして、はい、上記の行は、エラーなしで実行されます。

私はスクリプト問題の潜在的な解決策を見つけたことに感謝していますが、ParseExactがなぜint64で動作しているのか理解できないため、私は不安です。

PowerShellの動作方法を変更する設定がありますか?私は何か簡単な間違いをしているに違いないと信じていますが、私はそれを理解できません。

+0

文字列に空白がありますか? '$ d = [datetime] :: parseexact($ Timestampdata.Trim()、" yyyyMMddHHmmss "、$ null)'を試してください。 –

+0

優れた考え。しかし、はい、私は試みました.Trim()。行動に変化はない。 – Alan

+0

再生できません。サンプル入力をお願いします。 –

答えて

1
static datetime ParseExact(string s, string format, System.IFormatProvider provider) 
static datetime ParseExact(string s, string format, System.IFormatProvider provider, System.Globalization.DateTimeStyles style) 
static datetime ParseExact(string s, string[] formats, System.IFormatProvider provider, System.Globalization.DateTimeStyles style) 

これらは、PSv5.1のParseExactのオーバーロードされたメソッドです。プロバイダ$nullを渡しています。

Your use case

Additional information

より読みになった後、スペースを持っていない、あなたの最初の引数を確保するか、それが失敗します。また、あなたの現在の文化が期待している行動に合っていることを確認してください。

+0

'[System.DateTime] :: ParseExact( '20171025110130'、" yyyyMMddHHmmss "、$ null)'は私のために働きます。 '[System.DateTime] :: ParseExact( '20171025110130'、" yyyyMMddHHmmss "、[System.Globalization.CultureInfo] :: InvariantCulture.DateTimeFormat)'はより正確かもしれませんが、 '$ null'はこの形式では正常に動作します。 –

+0

@BaconBits 'DateTime.ParseExact(String、String、IFormatProvider)メソッドは、日付の文字列表現を解析します。これは、formatパラメータで定義された形式でなければなりません。また、

+0

@BaconBits。私は同じ結果をもたらしました。これは怒っています。リテラル文字列を指定すると、動作します!変数名(この場合は '$ Timestampdata')を代入すると(上記のようにTrim()を使用していても)、動作しません。 – Alan

関連する問題