ときどき、cmdシェルではワイルドカードパスを展開できないため、本当に不便なことがあります。ディレクトリ内の100個のファイルをプログラムに渡す必要があり、*。extと入力できませんでした。代わりに、mingwの「ls」を使用してリストをファイルにダンプし、改行をスペースに置き換えて、cmdにコピーして貼り付けました。かなり悪夢です。
答えはノーだと思いますが、誰かがこれに対処したり、これを簡単にする方法を考えたりしましたか?
DOS、およびその結果としてWindowsのcmd.exe
、シェルによるワイルドカード展開はサポートされていません。拡張を行うのは常にアプリケーション次第でした。
つまり、拡張をサポートしていないアプリケーションを使用している場合は、常に別のルートを見つける必要があります。あなたは出来る:
dir /b > list.txt
dir
コマンドを使用して展開を実行し、ファイルのリストをテキストファイルに入れます(cmd
に貼り付けるコマンドのリストを作成するのが本当に必死である場合は、Excelの数式のようなものを使用できます。 Excelを使用してセルを転置できるため、すべてのファイル名が同じ行に表示されます。)Windows 7にプリインストールされているPowershellを使用するだけです。Powershellはcmdコマンドを実行でき、パスの任意の場所のワイルドカードを認識します。
Powershellを起動するには、スタートメニューの検索ボックスに「powershell」と入力してEnterキーを押します。
アプリケーションがすべてのファイル名を含む文字列を期待する場合、これは適切なスクリプトです。
_$delimiter = " "
[string]$files = $nothing ; ls *.txt | % { $files += $_.fullname + $delimiter } ; application.exe $files
_
アプリケーションでファイル名のコンマ区切りリストが必要な場合は、_$delimiter = " "
_を_$delimiter = ","
_に変更します。
コードの説明:
[string]$files = $nothing
_-string
型の空の変数を作成します;
_-パイプラインではなく、複数のコマンドの区切り文字です。ls *.txt | % { $files += $_.fullname + $delimiter }
_-すべてのテキストファイルのリストを取得し、すべてのファイル名を区切り文字で区切った文字列を作成しますapplication.exe $files
_-アプリケーションを呼び出し、ファイルリストをアプリケーションに渡します_-recurse
_を_ls *.txt
_に追加することにより、ファイルパターンを再帰的に検索することもできるため、完全なコードは次のようになります。
_$delimiter = " "
[string]$files = $nothing ; ls *.txt -recurse | % { $files += $_.fullname + $delimiter } ; application.exe $files
_
編集:
イライラを避けるために、ls
およびdir
は_Get-ChildItem
_のエイリアスであり、_%
_は_ForEach-Object
_のエイリアスです。コードが短いため、エイリアスを使用してコードを保持しています。
編集2018/04/25:
2012年に、PowerShellを初めて使用しました。もちろん、より簡単な方法がありますが、glob拡張のunix/linux機能ほど簡単ではありません。
app.exe $(ls *.txt | % {$_.FullName})
説明:
ls *.txt
_は、グロブに一致するすべてのファイルのFileInfoオブジェクトを取得します_*.txt
_% { $_.FileName }
_がそれを行います。 _%
_は、ls
によって返されたすべての要素をループし、各オブジェクトFileNameを出力します。これはリストを提供し、expanded_list
という名前の変数にそれを置きます。それをバッチファイルに入れ、myBatchFile name myPattern
で実行します。パターンにスペースが含まれる場合は、パターンを引用符で囲みます。ファイルに一致しますが、dirsはありません。パラメータなしで実行すると、すべてに一致します。
@echo off
set expanded_list=
for /f "tokens=*" %%F in ('dir /b /a:-d "%~1"') do call set expanded_list=%%expanded_list%% "%%F"
echo expanded_list is:
echo %expanded_list%
次に、my_command_exec %expanded_list%
を使用してコマンドを実行できます
警告! cmd変数の最大サイズは8191文字(XP以降)であるため、オーバーフローする可能性があります。ユーティリティが完全なリストを常に提供するとは限りません。一方、最大cmd行の長さも8191なので、とにかくそれを実行することはできません。
これは、別のスレッドuser619818とスタイルのポスターへのコメントにあります)
DIRを使用すると、特定のタイプに一致するファイルのすべてのサブディレクトリを検索できます。
注:作成者がこれらのディレクトリが配置されているパス名を指定しなかったため、すべてのサブディレクトリが存在するかどうかを確認するルートディレクトリは「C:\ My Program\Root \」と見なされます。
DIR /B /S "C:\My Program\Root\*.ext"
これにより、ソースファイルの完全なファイルパスとファイル名が表示されます。
ファイル名だけが必要な場合は、次のようにする必要があります
FOR /F "Tokens=*" %A IN ('DIR /B /S "C:\My Program\Root\*.ext"') DO @( Echo.%~nxA )
したがって、これらのファイルをすべて「C:\ My Program\Root\Sub Directories\*。ext」から「D:\ Singlefolder\*。ext」に移動する場合は、次のようにします。
FOR /F "Tokens=*" %A IN ('DIR /B /S "C:\My Program\Root\*.ext"') DO @( MOVE "%~A" "D:\Singlefolder\%~nxA" /Y )
それが将来的に他の人を助けることを願っています。 :)
これはcmd.exeで機能します
dir /b *.ext
または
echo | dir /b *.ext
これは古いですが、WindowsのLinuxサブシステムでは、PATHにbashを含めるのが一般的です。その場合は、これでうまくいくかもしれません:
bash -c 'cat *.txt'