none
Select-Stringでのエラー

    質問

  • こんにちは。

    ソースを実行すると、下記のエラーが出てしまいます。

    ディレクトリフルパス1 が見つからない様ですが、

    エクスプローラーでは普通にアクセスできますし、コマンドラインでも同様にアクセス可能です。

    どなたかアドバイスをいただけないでしょうか。宜しくお願い致します。

    環境は、PSバージョン:3.0 RemoteSignedです。

    [ソースコード内容]

    A.txt は、$Bpath ディレクトリ内のテキストファイル名(~.txt)の一覧です。(改行綴り・フルパスではなくファイル名のみ)

    それを一行ずつ、フルパスへ処理し、該当するテキストファイルを読み込み。

    $dateis が書いてあるテキストファイルを検索。

    さらに、そのテキストファイル内で ”あ”・”い”・”う” のいずれかが該当すれば、

    $Cpath へそれぞれ ”1”・”2”・”3” と書かれたテキストファイルをascii形式で作成。

    ※ if($ck=$False) は、空行対策です。

    ==================実行時のエラー内容==================

    Select-String : The file ディレクトリフルパス1 can not be read: Could not find a part of the pa
    th 'ディレクトリフルパス1'.
    At ソースファイルのフルパス¥ソースファイル名.ps1:こちらにはソース内下線斜字の太字箇所が示されていました
    +     $tmpx = Select-String -Path $filepath -Pattern $dateis
    +             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidArgument: (:) [Select-String], ArgumentException
        + FullyQualifiedErrorId : ProcessingFile,Microsoft.PowerShell.Commands.SelectStringCommand

    Select-String : The file ディレクトリフルパス1 can not be read: Could not find a part of the pa
    th 'ディレクトリフルパス1'.
    At ソースファイルのフルパス¥ソースファイル名.ps1:こちらにはソース内下線斜字の太字箇所が示されていました
    +     $tmpx = Select-String -Path $filepath -Pattern $dateis
    +             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidArgument: (:) [Select-String], ArgumentException
        + FullyQualifiedErrorId : ProcessingFile,Microsoft.PowerShell.Commands.SelectStringCommand

    ===========================================

    <############ ソース ############>

    $Bpath = "ディレクトリフルパス1"
    $txtis = Get-Content ファイルフルパス\A.txt
    $lengthis = $txtis.length
    $dateis = Get-Date -Format "M年d日"
    $Cpath = "ディレクトリフルパス2"
    $pathb = Get-Date -Format "yyyy-MM-dd"
    $Xpath = $Cpath + $pathb + ".txt"
    for($i=0;$i -le $lengthis; $i++){
        $ck = $txtis[$i]
        if($ck=$False){
            continue
        }
        $filepath = $Bpath + $txtis[$i]
        $tmpx = Select-String -Path $filepath -Pattern $dateis
        if($tmpx){
            Copy-Item $filepath "(フルパス)\コピー先ファイル名.txt"
            $seekx = Select-String -Path $filepath -Pattern "あ"
            $seeky = Select-String -Path $filepath -Pattern "い"
            $seekz = Select-String -Path $filepath -Pattern "う"
            if($seekx){
                "1" | Out-File $Xpath -encoding ascii
            }
            if($seeky){
                "2" | Out-File $Xpath -encoding ascii
            }
            if($seekz){
                "3" | Out-File $Xpath -encoding ascii
            }

            rv seekx
            rv seeky
            rv seekz
        }
        rv tmpx
    }
    <############ ソース ここまで ############>



    2017年6月25日 9:10

回答

  • forループが0から、a.txtの行数までになっていて1行余分ですね。

    #for($i=0;$i -le $lengthis; $i++){
    for($i=0;$i -lt $lengthis; $i++){



    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2017年6月25日 10:42
  • Select-Stringを実行して、「ディレクトリフルパス1」が見つからないというエラーになるのがまず疑問です。

    Select-Stringはディレクトリではなく、ファイルを指定して、テキストを検索するコマンドですので、そこは、「ディレクトリフルパス1\【A.txtに書かれているファイル名】」というエラーになるはずです。

    そこで気になるのは

    if($ck=$False){
            continue
    }

    この部分です。これは

    > ※ if($ck=$False) は、空行対策です。

    とのことですが、実際には「$ckに$Falseを代入し、if($False)を評価する」という動作をしています。つまり、if文は常に$falseと評価するため、「continue」という文が実行されることはありません。

    正しくは、if($ck -eq "")とかではないかと思いますが、いかがでしょうか。

    それと、$filepath = $Bpath + $txtis[$i]の部分ですが、$Bpathの末端が"\"である必要がありますが、そこは大丈夫でしょうか。末端文字を気にせずにパスを生成するには、

    $filepath= Join-Path $Bpath $txtis[$i]

    のように記述するのがお勧めです。

    あと、ご質問とは直接は関係ありませんが、 Select-Stringで単に一致したか一致しなかったかを取得する場合、-Quietパラメータを付けるのが良いです。-Quietを付けると、一致した場合$true、不一致の場合$falseを返却してくれます。


    2017年6月25日 10:51
    モデレータ

すべての返信

  • forループが0から、a.txtの行数までになっていて1行余分ですね。

    #for($i=0;$i -le $lengthis; $i++){
    for($i=0;$i -lt $lengthis; $i++){



    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2017年6月25日 10:42
  • Select-Stringを実行して、「ディレクトリフルパス1」が見つからないというエラーになるのがまず疑問です。

    Select-Stringはディレクトリではなく、ファイルを指定して、テキストを検索するコマンドですので、そこは、「ディレクトリフルパス1\【A.txtに書かれているファイル名】」というエラーになるはずです。

    そこで気になるのは

    if($ck=$False){
            continue
    }

    この部分です。これは

    > ※ if($ck=$False) は、空行対策です。

    とのことですが、実際には「$ckに$Falseを代入し、if($False)を評価する」という動作をしています。つまり、if文は常に$falseと評価するため、「continue」という文が実行されることはありません。

    正しくは、if($ck -eq "")とかではないかと思いますが、いかがでしょうか。

    それと、$filepath = $Bpath + $txtis[$i]の部分ですが、$Bpathの末端が"\"である必要がありますが、そこは大丈夫でしょうか。末端文字を気にせずにパスを生成するには、

    $filepath= Join-Path $Bpath $txtis[$i]

    のように記述するのがお勧めです。

    あと、ご質問とは直接は関係ありませんが、 Select-Stringで単に一致したか一致しなかったかを取得する場合、-Quietパラメータを付けるのが良いです。-Quietを付けると、一致した場合$true、不一致の場合$falseを返却してくれます。


    2017年6月25日 10:51
    モデレータ
  • 早急なご返答で助かります。

    典型的な凡ミスでした。ご指摘ありがとうございます

    less than、less or equal・・・ 比較演算子の理解が足りていませんでした。。

    2017年6月26日 12:59
  • こちらも、早急なご返答で助かります。

    既出エラーが無事に回避できました。ありがとうございます。

    WPSについての動作理解がまだまだでした。

    また、パス関連の便利なコマンドレットがあるとは知りませんでした。。


    Select-String の -Quiet パラメータの件、とても参考になります。


    2017年6月26日 13:16