質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

1回答

1083閲覧

powershellでFTPで最後のcsvファイルをダウンロードする方法

danchan

総合スコア8

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

0クリップ

投稿2018/08/22 00:42

環境

windows7 IE powershell 3

FTPで西郷に更新されたcsvファイルをダウンロードしたいのですが
エラーが出てきます。
どのように記述すれば、csvファイルを取得できるでしょうか?

WEB上で下記の記述を見つけて実行しました。


$user ='username'
$password = 'password'
$url = 'ftp://serveripaddress'

FTP認証 Nework.CredentialではなくPSCredentialを使用

$str=ConvertTo-SecureString $password -AsPlainText -Force
$cred=New-Object System.Management.Automation.PSCredential($user,$str)

スクリプトファイルのパスを取得

$mypath=Split-Path ( & { $myInvocation.ScriptName } ) -parent

データのダウンロード

%2f を付けると / (root) からのデータ取得になる。

Invoke-WebRequest -Uri $url"$2f/tmp/filename.csv" -OutFile $mypath"\filename.csv" -Credential $cred


エラーは下記のエラーが出ております。↓↓↓


Invoke-WebRequest : 指定されたパスのフォーマットはサポートされていません。
発生場所 C:\Users\xps\Desktop\ftp.ps1:24 文字:1

  • Invoke-WebRequest -Uri $url"$2f/ritem/logs/item.20180819064710415.csv" -OutFile ...
  • + CategoryInfo : NotImplemented: (:) [Invoke-WebRequest], NotSupportedException + FullyQualifiedErrorId : WebCmdletIEDomNotSupportedException,Microsoft.PowerShell.Commands.Invo keWebRequestCommand

下記の部分でどのように記述すれば、csvの最後の更新されたファイルを取得できるでしょうか?

Invoke-WebRequest -Uri $url"$2f/tmp/filename.txt" -OutFile $mypath"\filename.txt" -Credential $cred

「-Uri $url"$2f/tmp/filename.csv"」の部分を最後に更新されたファイルにすればよいかと思うのです
どのように記述すればよいかわかりません。

「| Sort-Object -Descending | Select-Object -First 1」を使用すればよいのでしょうか?

ご教授のほどよろしくお願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

なんとなく、%を$に誤入力している気がするのですが。
powershell上で
$url"$2f/tmp/filename.txt"
と打ってみてください
ここは"$url/%2f..."?

投稿2018/08/22 00:57

satocha

総合スコア336

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

danchan

2018/08/22 07:20

satocha 様 早速のご回答をいただきまして誠にありがとうございます。 パスを確認しましたところ、ダブルクォーテーションの位置が間違っていたようです。 もう一つは$mypathが必要なく、削除したところエラーがなくなりました。 ありがとうございます。 あと、テキストファイルがFTP側で更新された場合一番最後のファイルを 取得したいのですが、どうしてもうまくいきません。 Invoke-WebRequest -Uri "$url%2f/tmp/filename.csv" -OutFile $mypath"\filename.csv" -Credential $cred 上記の-Uri の後の部分にパイプで記述するとエラーとなります。 どのような記述になるかおわかりでしょうか? よろしくお願い申し上げます。
satocha

2018/08/22 09:41

>-Uri の後の部分にパイプで記述するとエラー それは Invoke-WebRequest -Urii | なんとか みたいなことをしたのでしょうか。それならエラーになります。 パイプで出力したものを -Uriの値として指定したいのであれば なんとか |%{Invoke-WebRequest -Uri $input ...} のような構文になります。
danchan

2018/08/30 23:27

ご回答ありがとうございます。 またご返信が遅くなり、失礼いたしました。 記載をし忘れておりましたが私はpowershell初心者です。 構文の意味を理解するのに時間がかかってしまいました。 %の意味がわからず、ようやくわかったのがforeachのエイリアス だったことです。時間がかかりました。 どうしても |%{Invoke-WebRequest -Uri $input ...}の構文が 理解できずにおります。 現状ではディレクトリにある最後に更新されたファイル名だけ わかれば解決できそうなのですが、そのファイル名を 取り出す方法がわかりません。 教えていただきました |%{Invoke-WebRequest -Uri $input ...}の 構文でそのようなことができますでしょうか? いろいろとわからず仕舞いですみません。 ご教授をいただけますと幸いです。 宜しくお願い申し上げます。
satocha

2018/08/31 01:17

申し訳ありません。$inputはパイプ入力を意味する予約変数ですが、 この場合は無名変数$_を使ったほうがよかったかもしれません。 というのも、パイプの後、foreach-object(%)で受けると、$_はパイプ上の型のまま受け取りますが、$inputはSZArrayEnumerator型の変数として振舞いまうからで、型変換の必要が出てくる可能性があるからです。 例 1..5|%{$_+1}#2,3,4,5,6と出力 1..5|%{$input+1}#やってみてくださいい #上と同じにするなら、 1..5|%{[int]"$input"+1} #としなければならない 弁解させていただくと、Invoke-WebRequest -uriの引数にするなら、どちらも同じはずです。
danchan

2018/08/31 23:45

早速のご回答ありがとうございます。 foreachの使い方や型の必要性を詳しくご説明くださりありがとうございます。 型を全く意識しておりませんでした。気をつけて参ります。 もう一度、よく考えてみたのですが、ディレクトリにある ファイルを取得するにあたりURLを一つに絞り込まないと いけないのではないかと思いました。 現在の環境は「logs」という名前のディレクトリがあり、 その中にcsvファイルがございます。 その最後にあるcsvファイルを取り出したいのです。 そうしますと Invoke-WebRequest -Uri "$url%2f/tmp/filename.csv" -OutFile $mypath"\filename.csv" -Credential $cred の記述自体が間違っているのではないかと考えました。 Invoke-WebRequestでディレクトリ内のcsvファイルを 取得または指定するにはどのようにすればよろしいでしょうか? Invoke-WebRequestでディレクトリ内の指定ができるのでしょうか? それともInvoke-WebRequestでforeachをダイレクトに使用して で取り出すことができるのでしょうか? 私の理解不足で、申し訳ございません。 お手数となりますが、ご教授のほど宜しくお願い申し上げます。
satocha

2018/09/01 23:21

何かWebの仕組みを根本的なところで誤解されているような気がします。Webサーバの中の中身、例えばディレクトリ構成などをクライアントから参照することなどできません。そんなころができるなら、とんでもないハッキングツールということになります。 Invoke-WebRequestはその名前の通り、Webサーバにこのページをくださいとお願いする(リクエスト)ことしかできません。リクエストした結果、返ってきたページも、サーバ上に実在するファイルかもしれないし、PHPやcgiで生成した物理的なファイルとしては存在しないページかもしれません。 講釈はおいといて、単にファイルをダウンロードしたいだけなら「Invoke-WebRequest ダウンロード 」で検索すればたくさん出てきます。例えばhttp://tech.guitarrapc.com/entry/2013/07/09/220710。
danchan

2018/09/06 04:51

ありがとうございます。 記述の間違いやforeachの使い方powershellの誤解など、ご説明くださり ありがとうございました。 こちらの理解が足りず、申し訳ございませんでした。 今後はご指導いただきましたことを頭に入れ、勉強して参ります。 この度は本当にありがとうございました。 感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問