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

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

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

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

Q&A

解決済

1回答

2873閲覧

PowershellでAndroidの写真や動画を転送する

sutemin

総合スコア1

PowerShell

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

0グッド

0クリップ

投稿2020/06/13 21:09

編集2020/06/13 23:52

前提・実現したいこと

始めて質問します。よろしくお願いします。

スマホに入っている旅行で記録したファイルを整理するためにFTPで接続してパソコンに移動させるプログラムを作りました。
今のままだと画像しか移動できない微妙なプログラムになりそうなので質問させてください。

転送元のファイル名をそのまま転送先のパソコンにも適用できるようにしたいです。

発生している問題・エラーメッセージ

対象日時の名前になっているファイル分、b[]配列の分だけ下のエラーが発生してファイルを転送することができません。 "2" 個の引数を指定して "DownloadFile" を呼び出し中に例外が発生しました: "WebClient 要求で例外が発生しました。" 発生場所 C:\Users\name\Desktop\無題1.ps1:85 文字:3 + $wc.DownloadFile($b[$t],$localDirectoryPath2+$b[$t]); + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : WebException

該当のソースコード

powershell

1$inputday = Read-Host "当日の日付を入力してください。YYYYMMDD" 2$inputgoto =Read-Host "行く先を入力してください" 3 4$localDirectoryPath = "C:\anydata\ryokou\kiroku\"+$inputgoto+"\"+$inputday+"\"; 5$localDirectoryPath2 = "C:\anydata\ryokou\kiroku\"+$inputgoto+"\"+$inputday+"\Pictures\"; 6 7New-Item $localDirectoryPath2 -ItemType Directory; 8 9 10# FTP接続に必要な情報を設定 11$user = 'your_account'; 12$pass = 'your_password'; 13$hostName = '111.22.33.4:1234'; 14 15# ファイルの一覧を取得する対象のディレクトリのパス 16# (最後はスラッシュで終わらせる) 17$targetDirectoryPath = '/device/DCIM/Camera/'; 18 19# FTP接続用のURL 20$ftpUrl = 'ftp://' + $hostName + $targetDirectoryPath; 21 22# 接続 23$webRequest = [System.Net.WebRequest]::Create($ftpUrl); 24$webRequest.Credentials = New-Object System.Net.NetworkCredential($user, $pass); 25 26 27# 実行する処理を設定 28$webRequest.Method = [System.Net.WebRequestMethods+Ftp]::ListDirectory; 29 30try 31{ 32 # リクエスト実行 33 $response = $webRequest.GetResponse(); 34 $ftpDataStream = $response.GetResponseStream(); 35 $streamReader = New-Object System.IO.StreamReader($ftpDataStream); 36 37 # ファイル名(文字列)のリストを取得 38 $list = $streamReader.ReadToEnd(); 39 40 41 foreach($item in $list) 42 { 43 # ファイル名を出力 44 Write-Host $item; 45 } 46 47 $streamReader.Close(); 48} 49catch 50{ 51 Write-Host 'エラーが発生しました'; 52 Write-Host $_; 53} 54 55$a = $list.split("`n"); 56 57$b = New-Object System.Collections.ArrayList 58 59for ($i=0; $i -lt $a.Length; $i++){ 60 61 if($a[$i].StartsWith($inputday)){ 62 $b += $a[$i]; 63 } 64} 65 66 Write-Output ($b[0]); 67 Write-Output ($b[1]); 68 Write-Output ($b[2]); 69# WebClientを生成 70# FTP設定 71$wc = New-Object System.Net.WebClient; 72$wc.Credentials = New-Object System.Net.NetworkCredential($user,$password); 73$wc.BaseAddress = $ftpurl; 74 75 76# スクリプトファイルのパスを取得 77$mypath=Split-Path ( & { $myInvocation.ScriptName } ) -parent; 78 79# ファイルをダウンロード 80## .DownloadFile(ダウンロード元ファイル名,ダウンロード先ファイル名) 81for ($t=0; $t -lt $b.Length; $t++){ 82 Write-Output ("count:"+$t); 83 84 $wc.DownloadFile($b[$t],$localDirectoryPath2+$b[$t]); 85} 86 87# 終了 88$wc.Dispose(); 89

試したこと

後ろの方にある
$wc.DownloadFile($b[$t],$localDirectoryPath2+$b[$t]);
を $wc.DownloadFile($b[$t],$localDirectoryPath2+$inputday+"_"+$t+".jpg");
にするとエラーが起こらず
第二引数に$b[$t]に入っていると問題が起こるようです。

補足情報(FW/ツールのバージョンなど)

動作環境 実行環境windows10 接続先:Androidバージョン 10 接続元:windows10

Powershellのバージョン
Name Value


PSVersion 5.1.18362.752
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.18362.752
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1

よろしくお願いします。

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

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

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

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

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

dodox86

2020/06/13 23:58

ご提示のコードを動かしてはいませんが、$localDirectoryPath2+$b[$t] では単に第1引数のURL相当文字列をくっつけているだけなので、ダメだと思います。第2引数はローカルファイルのPATH名として正しい形式になっていないといけません。$localDirectoryPath2+$b[$t] がどのようなPATH文字列になっているか確認してください。 https://docs.microsoft.com/ja-jp/dotnet/api/system.net.webclient.downloadfile?view=netframework-4.8
sutemin

2020/06/14 13:57

コメントありがとうございます。 正しいパスになっているか今一度確認しました。 inputday を20200606 inputogo を kyoto として "$localDirectoryPath2+$b[$t]"をWrite-Outputした結果です。 C:\anydata\ryokou\kiroku\kyoto\20200606\Pictures\20200606_232124.jpg C:\anydata\ryokou\kiroku\kyoto\20200606\Pictures\20200606_233047.jpg C:\anydata\ryokou\kiroku\kyoto\20200606\Pictures\20200606_233105.jpg C:\anydata\ryokou\kiroku\kyoto\20200606\Pictures\20200606_233118.mp4 このような表示になりました。 たまにmp4が混じるのはカメラで動画をとっているからです。
dodox86

2020/06/15 00:24

$localDirectoryPath2の値は「C:\anydata\ryokou\kiroku\kyoto\20200606\Pictures\」で、 $b[$t]の値は「20200606_232124.jpg」など、と言うことですよね。大丈夫そうなPATH名ですが、DownloadFile()に渡すときに何か変なことになっているのかもしれません。$wc.DownloadFile($b[$t],$localDirectoryPath2+$b[$t]); を例えば $path1 = $b[$t]; $path2 = $localDirectoryPath2 + $b[$t]; $wc.DownloadFile($path1, $path2); などと逐一、変数に入れてみてやってみたら状況が変わりませんでしょうか。
sutemin

2020/06/15 11:16 編集

指摘頂いた通り変数を定義しましたが結果からいうと状況は変わりませんでした。 最後の部分のfor文を以下のように追記しました。 # ファイルをダウンロード ## .DownloadFile(ダウンロード元ファイル名,ダウンロード先ファイル名) for ($t=0; $t -lt $b.Length; $t++){ Write-Output ("count:"+$t); $path1 = $b[$t]; $path2 = $localDirectoryPath2 + $b[$t]; Write-Output ($path1); Write-Output ($path2); $wc.DownloadFile($path1, $path2); } 以下が出力されたエラーになります。 count:0 20200606_171944.jpg C:\anydata\ryokou\kiroku\kyoto\20200606\Pictures\20200606_171944.jpg "2" 個の引数を指定して "DownloadFile" を呼び出し中に例外が発生しました: "WebClient 要求で例外が発生しました。" 発生場所 C:\Users\name\Desktop\無題1.ps1:93 文字:1 + $wc.DownloadFile($path1, $path2); + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : WebException count:1 20200606_172105.jpg C:\anydata\ryokou\kiroku\kyoto\20200606\Pictures\20200606_172105.jpg "2" 個の引数を指定して "DownloadFile" を呼び出し中に例外が発生しました: "WebClient 要求で例外が発生しました。" 発生場所 C:\Users\name\Desktop\無題1.ps1:93 文字:1 + $wc.DownloadFile($path1, $path2); + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : WebException count:2 20200606_172151.jpg C:\anydata\ryokou\kiroku\kyoto\20200606\Pictures\20200606_172151.jpg "2" 個の引数を指定して "DownloadFile" を呼び出し中に例外が発生しました: "WebClient 要求で例外が発生しました。" 発生場所 C:\Users\name\Desktop\無題1.ps1:93 文字:1 + $wc.DownloadFile($path1, $path2); + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : WebException (以後対象ファイルの数繰り返し)
guest

回答1

0

ベストアンサー

エラーについてですが、確認してみたところ $wc.DownloadFile($b[$t], $localDirectoryPath2+$b[$t]);の部分で$b[$t]だと末尾に改行コードが入ってしまったままになっているために問題が起きているようです。その為、質問者さんが「試したこと」で、

$wc.DownloadFile($b[$t],$localDirectoryPath2+$inputday+"_"+$t+".jpg");にするとエラーが起こらず

とのように動きに差が出ています。

$bArrayListを生成する以下のコード部分で、$bに追加するときにTrimで前後の空白を除去してください。

PowerShell

1$b = New-Object System.Collections.ArrayList 2 3for ($i=0; $i -lt $a.Length; $i++){ 4 5 if($a[$i].StartsWith($inputday)){ 6# $b += $a[$i]; 7 # 前後の空白、特に末尾のCRLF(\r\n)を除去 8 $b += $a[$i].Trim(); 9 } 10}

これで私の方でテスト用のFTPサーバーで確認した限り、問題なく動くようになりました。

投稿2020/06/17 18:02

dodox86

総合スコア9256

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

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

sutemin

2020/06/17 21:39

こちらのほうでもエラーなく実行できることを確認できました。 b配列の作り方に問題があったんですね。 これで記録の整理がはかどりそうです。 dodox86さん何度もありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問