我正在作業的系統看起來像這樣:
有一個名為"Settings.txt"的檔案可能存在于這些檔案夾中。我想要的是以下內容:D:TargetFolderSubfolder1
D:TargetFolderSubfolder1
D:TargetFolderSubfolder2Subfolder3
如果該檔案在目標檔案夾及其所有子檔案夾中被發現一次以上,則洗掉所有這些檔案夾。
如果該檔案只在目標檔案夾及其所有子檔案夾中發現一次,那么繼續執行腳本。
如果該檔案不存在,則繼續撰寫腳本。
最后的腳本可能是這樣的:
如果存在 "D:TargetFolder*Settings.txt" (goto delete) else goto continue
:洗掉
del *Settings.txt /f /q
:繼續
退出
我希望我的問題解釋正確。 預先感謝。
uj5u.com熱心網友回復:
@echo off
for /F "skip=1" %%a in ('dir /B /S D:TargetFolderSettings.txt 2^> NUL') do (
del /Q /S D:TargetFolderSettings.txt >NUL
突破
)
:break
for /F回圈處理來自dir /S命令的檔案名,但第一個檔案被跳過(因為"skip=1"switch),也就是說,如果有多個檔案,接下來的命令將被執行。
for中的第一個命令洗掉了所有名稱為 "Settings.txt "的檔案,并且for被中斷,因為goto命令。
uj5u.com熱心網友回復:
這個批處理檔案可以用來完成任務:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
設定 "SettingsFile="
for /F "delims=" %%I in ('dir "D:TargetFolderSettings.txt" /A-D-L /B /S 2^>nul') do if not defined SettingsFile (set "SettingsFile=1") else (del "D:TargetFolderSettings.txt" /A /F /Q /S >nul 2> nul & goto Continue)
:繼續
結束
上面的一個不太緊湊的變體:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
設定 "SettingsFile="
for /F "delims=" %%I in ('dir "D:TargetFolderSettings.txt" /A-D-L /B /S 2^> nul') do (
如果沒有定義SettingsFile (
設定 "SettingsFile=1"
) else (
del "D:TargetFolderSettings.txt" /A /F /Q /S >nul 2>nul
轉到繼續
)
)
:繼續
結束
首先,確保環境變數SettingsFile沒有被偶然定義。
接下來,DIR命令由一個在后臺啟動的獨立命令列程執行,在D:TargetFolder中搜索名稱為Settings.txt的檔案,并將它們全部以全路徑輸出。DIR的輸出被FOR捕獲,如果DIR找到了檔案Settings.txt,則逐行處理。
環境變數SettingsFile被定義為一個字串值,這對第一個檔案Settings.txt來說并不重要。如果沒有更多的檔案Settings.txt,FOR回圈就會結束,而不需要做其他事情。
但是在第二個檔案Settings.txt上執行DEL命令,洗掉指定檔案夾及其所有子檔案夾中的檔案Settings.txt。回圈被命令GOTO激發,在標簽Continue下面的一行繼續批處理檔案,因為其他出現的Settings.txt已經不重要了,當然在洗掉所有Settings.txt成功后也不存在了。
為了了解所使用的命令和它們的作業原理,請打開命令提示符視窗,在那里執行以下命令,并仔細閱讀每個命令的所有幫助頁面。
del /?dir /?dir /?echo /?dir /?endlocal /?endlocal /?for /?goto /?goto /?goto /?if /?/code>set /?setlocal /?setlocal /?setlocal /?
閱讀微軟關于使用命令重定向運算子的檔案,了解>nul和2>nul的解釋。重定向運算子>必須在FOR命令列上用托號字符^轉義,以便在執行FOR命令前Windows命令解釋器處理該命令列時被解釋為字面字符,該命令在后臺用cmd.exe/c啟動的獨立命令列程中執行嵌入式dir命令列。 exe /c和在'內的命令列被附加為附加引數。
請參見使用Windows批處理檔案的單行多命令,以了解運算子&的解釋。
uj5u.com熱心網友回復:
如果你能使用你的Windows系統中已有的PowerShell,這并不困難。如果發現的檔案數大于零,那么每一個都會被洗掉。否則,什么也不會發生。當你確信正確的檔案將被洗掉時,從Remove-Item命令中洗掉WhatIf。
@powershell.exe -NoLogo -NoProfile -Command ^.
"$Files = Get-ChildItem -Recurse -File -Path 'C:TargetFolder' -Filter 'Settings.txt';" ^
"如果($Files.Count -gt 1) {" ^
"forach ($File in $Files) { Remove-Item $File.FullName -Whatif }" ^
"}"
如果能以PowerShell .ps1腳本檔案的形式運行,就可以消除一些噪音了。
$Files = Get-ChildItem -Recurse -File -Path 'C:TargetFolder' -Filter 'Settings.txt' 。
如果($Files.Count -gt 1){
foreach ($File in $Files) { Remove-Item $File.FullName -Whatif }
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/315734.html
標籤:
