ファイルをそのフォルダに移動するよりも、ディレクトリ内の各ファイル用のフォルダを作成し、名前を付けるWindowsバッチスクリプト


1

コード:

for %%X in ("C:\Info\AUGUST 2011\Checklists\DET1__*") do (echo %%X)

私がしたいファイルの名前を一覧表示します。

  1. 残りのファイル名でフォルダを作成します。 DET1__ フォルダのタイトルとして)
  2. そのファイルをその特定のフォルダに移動します

それほど難しいことではないことはわかっていますが、シェルスクリプト作成にWindowsを使用することに慣れていないので、仕事でUNIXスタイルのシェルにアクセスすることはできません。

回答:


7

これはPowerShellでは約100倍簡単ですが、これでうまくいくはずです。何が起こっているのかについてのより良い説明は、にあります。 setlocal /?set /? そして for /?。バッチは良い言語ではないので、次のようにしなければなりません。 ENABLEDELAYEDEXPANSION そしてその用途 !FILE! の代わりに %FILE% バッチファイルが一度変数を設定して、それを更新しないようにします。覚えておくべき1つの鍵は、ファイル名とフォルダ名は同じではいけないということです。だからあなたはファイルとフォルダの両方を持つことはできません fooC:\、 例えば。

私は持っています ではない 本当にこれらをテストしたので、何かをする前にあなた自身でそうしてください。

@ECHO OFF
SETLOCAL
SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%X IN ("C:\Info\AUGUST 2011\Checklists\DET1__*") DO (
    SET FILEPATH=%~fX
    SET FILENAME=%~nxX
    SET TEMPFILE=%~fX.tmp
    MOVE "!FILEPATH!" "!TEMPFILE!"
    MKDIR "!FILEPATH!"
    MOVE "!TEMPFILE!" "!FILEPATH!\!FILENAME!"
)
ENDLOCAL

PowerShellのバージョン

$Files = Get-ChildItem -Path 'C:\Info\AUGUST 2011\Checklists\' -Filter 'DET1__*'
$Files | ForEach-Object {
    $FileFullName = $_.FullName
    $TempFileName = "$($FileFullName).tmp"
    $DestinationFileName = "$FileFullName\$($_.Name)"
    Move-Item $FileFullName $TempFileName
    New-Item -Path $FileFullName -ItemType Directory
    Move-Item $TempFileName $DestinationFileName
}

ディレクトリを作成する前にファイル名からDET1__部分を抽出するのを忘れたようです(私はあなたがファイルと同じ名前のディレクトリを選ぶつもりであると気付くまで一時ファイルを作成する理由を尋ねようとしていました)。私は決して思い付かなかったかもしれないバッチコードのための+1 :)
Matrix Mole

@マトリックスああ、私は元の質問のその部分を逃した。更新してみましょう。環境代用も使わなければならない、と私は思う。
Bacon Bits

覚えているなら朝に更新しましょう…ちょうどその時を見ました。環境置換を使用する必要があります(のように SET FILENAME=!FILENAME:~7! 同様に、私は疑います(参照) set /? )あなたのPowerShellソリューションはもっと良いです、しかし、@マトリックス。
Bacon Bits

私はこのエラーが出ます: The following usage of the path operator in batch-parameter substitution is invalid: %~fx. 残念ながら、Powershellはローカルおよびグループポリシーによって無効になっているので、BATで行き詰まっています
Hortinstein

私は午前中にチェックします、援助をありがとう!
Hortinstein

1

バッチスクリプトの代わりにpowershellを使用したい場合は、次のようにします。

$files = get-childitem "C:\Info\AUGUST 2011\Checklists\DET1__*"
ForEach ($file in $files) {
    $dirname = $file.fullname.replace("DET1__","")
    New-Item -Path $dirname -type directory
    Move-Item $file $dirname
}

Windowsのバージョンによっては、デフォルトでPowerShellがインストールされている場合があります(Win7 / Vista)。あなたがXPを持っているなら、あなたはしなければならないでしょう ダウンロードする Windows Management Framework Coreリンクから。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.