1

私はこれを解決するために何時間も費やしてきましたが、運がありません。

シナリオ:複数の異なるファイル名がありますが、フォルダー内の拡張子は同じです。Windows Server200864ビットの場合。スケジュールバッチジョブを使用して、それらを別のフォルダーに移動したい。。バット。移動中に、最終変更日を含めるように名前を変更したいと思います。私はこの形式にしようとしています:

yyyymmddhhmmss-name.zip

PowerShellとforコマンドを見てきましたが、うまくいきません。

この3行のコードを見つけましたが、Windows 7ではうまく機能しましたが、WindowsServer2008では機能しませんでした。

@echo off
set Date=%date:~10,4%%date:~4,2%%date:~7,2%
move d:\Test\*.zip d:\Test1\*%Date%.zip

サーバーでは、を理解できませんでした*%Date%。を削除するとすぐに*機能しました。引用符などでさまざまなバリエーションを試しましたが、機能しません。日付が私が求めている解決策ではないことは理解していますが、この単純な行を機能させることができなければ、他の行は問題になりません。

ああ、オフセットは機能したので、表示される日付を取得しましたyyyymmdd。PowerShellが苦手なので、PowerShellを避け、VBSも調べました。しかし、それは長所ではありません。誰かが助けることができますか?

似たような質問がたくさんあることは知っていますが、私がやろうとしていることに完全に一致するものはありません。

4

4 に答える 4

1

WMIC を使用して、最後に変更されたタイムスタンプを小数秒の精度で取得できます。最初の 14 文字は、探している正確な形式でタイムスタンプを示します。

これは、あなたが求めたことを正確に実行する高速なソリューションです。

@echo off
for /f "skip=1 delims=" %%A in (
  'wmic datafile where "drive='d:' and path='\\test\\' and extension='zip'" get lastModified^,name'
) do for /f "tokens=1*" %%B in ("%%A") do (
  set "timestamp=%%B"
  set "file=%%~fC"
  set "fileName=%%~nxC"
  setlocal enableDelayedExpansion
  move "!file!" "d:\test1\!timestamp:~0,14!-!fileName!"
  endlocal
)

要件を変更したい場合、上記は厄介です。注意しないと、WMIC コマンドに非常に長い時間がかかる可能性があり、WMIC でエミュレートできないファイル マスクがいくつかあります。

以下は、非常に便利なはるかに遅いソリューションです。ソース ファイル マスクと宛先パスをパラメーターとして渡します。スクリプトの名前が「addTimeStamp.bat」であると仮定すると、addTimeStamp "d:\test\*.zip" "d:\test1"

@echo off
setlocal disableDelayedExpansion
set "filePath="
if "%~2" neq "" for /f "eol=: delims=" %%F in ("%~2\") do set "filePath=%%~fF"
for %%F in (%1) do (
  set "file=%%~fF"
  set "fileName=%%~nxF"
  setlocal enableDelayedExpansion
  for /f "skip=1" %%A in (
    'wmic datafile where "name='!file:\=\\!'" get lastModified'
  ) do for /f %%A in ("%%A") do (
    set "timestamp=%%A"
    move "!file!" "!filePath!!timestamp:~0,14!-!fileName!
  )
  endlocal
)
于 2013-02-10T16:14:25.587 に答える
0

コマンドを使用してこれを行うことができますwmic。これにより、地域設定の影響を受けずに現在の日付と時刻を取得できます。同時に、zip ファイルの名前を変更することもできます。

@echo off
SETLOCAL EnableDelayedExpansion

for /f "skip=1 tokens=1-6 delims= " %%a in ('wmic path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') do (
    IF NOT "%%~f"=="" (
        set /a FormattedDate=10000 * %%f + 100 * %%d + %%a
        set /a FormattedTime=%%b * 10000 + %%c * 100 + %%e
    )
)

for /f %%f in ("D:\Test*.zip") DO set filename=%%~nf

move "D:\Test*.zip" "D:\%FormattedDate%%FormattedTime%-%filename%.zip"

お役に立てれば。

于 2013-02-10T07:16:53.053 に答える
0

ループを使用しFOR、修飾子をループ変数に適用して~t、すべてのファイルの最終変更タイムスタンプにアクセスできます。コマンドで実際に使用する前に、元のタイムスタンプ値を必要な形式に調整する必要がありますMOVE。これを行う方法の例を次に示します。

@ECHO OFF
FOR %%I IN ("D:\Test\*.zip") DO (
  SET lmdate=%%~tI
  SETLOCAL EnableDelayedExpansion
  SET lmdate=!lmdate:~6,4!!lmdate:~3,2!!lmdate:~0,2!!lmdate:~11,2!!lmdate:~14,2!
  MOVE "%%I" "D:\Test1\!lmdate!-%%~nxI"
  ENDLOCAL
)

修飾子を使用してループ変数によって返されるタイムスタンプの精度は~t分に制限されていることに注意してください。そのため、投稿が示唆しているように、本当に秒にする必要がある場合、これは解決策ではない可能性があります。

とにかく、これがスクリプトの仕組みです。

反復ごとに、%%Iループ変数にファイル名が割り当てられます。修飾子は~t、対応するファイルの最終変更タイムスタンプに解決するように変数に指示します。

lmdate変数は、(最初のステートメント) によって返されるタイムスタンプで最初に初期化され、%%~tI次にSET lmdateyyyyMMddHHmmフォーマットに対応するように値が再配置されます (2 番目のSET lmdateステートメント)。元のタイムスタンプの形式はシステムのロケールに依存するため、特定のシステムに合わせて 2 番目の SET ステートメントを変更する必要がある場合があることに注意してください。上記のスクリプトは、次の形式を想定しています。

dd.MM.yyyy HH:mm

上記のステートメントは、ループ本体内のSETLOCAL EnableDelayedExplansion実際の値にアクセスするために必要です。lmdateご存じないかもしれませんが%、ブロック コマンド内の環境変数の「通常の」( ) 展開は、値が同じコマンド ブロック内で設定および取得される場合には機能しません。そこで遅延拡張が役に立ちます。最初に有効にしてから、別の展開構文 (!の代わりに s %) を使用する必要があります。

スクリプトで使用されている他の修飾子、つまり~nand ~x(~nx一緒に使用した場合) を確認できます。前者はファイル名のみ (パスや拡張子なし) に解決され、後者は拡張子のみに解決されます。他にも修飾子があり、それらはFORコマンドの組み込みヘルプ ( FOR /?) に記載されています。

于 2013-02-10T11:40:10.627 に答える