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

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

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

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

PowerShell

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1596閲覧

WindowsPowershellでディレクトリ一覧を配列に格納し、配列に特定のファイル名があるか確認したい

syusa

総合スコア10

FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

PowerShell

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2018/06/21 22:11

前提・実現したいこと

皆さん初めまして。質問をさせて下さい。

Win10環境のWindowsPowershell(バージョン5)で、
FTP接続したリモート側ディレクトリの
ファイル一覧を取得し、特定のファイル名が存在する
か確認したいと思っています。

FTP接続および、ファイルの一覧取得まではできました。

$rsps= $wcnt.GetResponse();
$fdst=$rsps.GetResponseStream();
$strd=New-Object System.IO.StreamReader($fdst);
$list=@($strd.ReadToEnd());
$indx=[Array]::IndexOf($list,"hogehoge.html")

上記ソースで、hogehoge.htmlの位置を変数に
取り込む想定ですが、hogehoge.htmlがあるにも
関わらず$indxが-1になります

そもそも、発想が違うのか、あるいはコーディングがまずいのか、、、
ご教授頂ければ幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。

ご提示のコードだと足りない部分が多く、本来であれば単体で動作するコードを提示して頂きたいのですが、おそらくNLISTコマンド([System.Net.WebRequestMethods+Ftp]::ListDirectory)を発行しているものと予測して回答します。


回答としてはコードの記述に不備が見られます。

$list=@($strd.ReadToEnd());

の部分ですが、ReadToEnd()メソッドでは改行込みの1つの文字列が返されますので、@()でくるんでも要素数は1のままです。
このため

$indx=[Array]::IndexOf($list,"hogehoge.html")

の部分は意図した動作になりません。

対処方法はいろいろありますが、正攻法としては以下の様にwhileループを回して1行ずつチェックすると良いでしょう。

# 接続情報は環境に合わせてください $url = 'ftp://example.com/' $credential = Get-Credential $request = [System.Net.FtpWebRequest]::Create($url) $request.Method = [System.Net.WebRequestMethods+Ftp]::ListDirectory $request.Credentials = $credential.GetNetworkCredential() $response = [System.Net.FtpWebResponse]$request.GetResponse() $reader = New-Object 'System.IO.StreamReader' ($response.GetResponseStream()) while(-not $reader.EndOfStream){ # 各行をチェックして該当のファイルを探す $line = $reader.ReadLine() if($line -match 'hogehoge.html'){ Write-Host 'hogehoge.html 発見!' -ForegroundColor Green break } } $reader.Close() $response.Close()

投稿2018/06/22 08:36

stknohg

総合スコア796

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

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

syusa

2018/06/23 01:43

stknohg様  回答ありがとうございます。情報不足しており大変恐縮です。  ご推察の通り、[System.Net.WebRequestMethods+Ftp]::ListDirectoryを使ってました。  >ReadToEnd()メソッドでは改行込みの1つの文字列が返されます  なるほど、、どうりで要素が1つしかないわけですね。。   お教え頂いた方法で実現できました。  ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問