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

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

ただいまの
回答率

90.50%

  • Windows

    1440questions

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

  • 配列

    522questions

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

  • PowerShell

    357questions

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

  • FTP

    322questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 208

syusa

score 1

 前提・実現したいこと

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

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になります

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

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/23 10:43

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

     お教え頂いた方法で実現できました。

     ありがとうございました。

    キャンセル

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Windows

    1440questions

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

  • 配列

    522questions

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

  • PowerShell

    357questions

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

  • FTP

    322questions

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