2017-05-25 233 views
1

我正在處理一個腳本來自動執行一些任務。基本上,它只是重命名文件,如果它們存在。但是,這些文件對於某些其他軟件的操作至關重要。如果重命名文件失敗,或者它找不到文件,我希望它說出它是哪個文件。但是,REN命令在失敗時不是非常具有描述性。我知道如果它失敗了,它會將ERRORLEVEL提升到1.是否還有其他信息可以從失敗中獲得,如文件名?或者它幾乎只是成功或失敗?批處理文件中的錯誤處理

將運行的機器是Windows 7及更高版本,所以如果需要,PowerShell也是一個選項,但我更喜歡批處理。

由於

+2

它成功或失敗。沒有關於哪個文件導致失敗的信息。 –

+0

您所需要的只是在ren回顯試圖重命名的文件後附加一個條件執行命令。 'Ren filea.txt fileb.txt ||回聲仁filea.txt fileb.txt失敗' – LotPings

+1

我對此頁面上的所有內容感到困惑。在我看來,你已經把文件名作爲迭代變量捕獲了,不是嗎?我的意思是,如果你通過文件循環來執行重命名,使用類似'for %% I'的命令來執行重命名「%%〜fI」「%%〜nI.bak」'或類似的操作,對吧?爲什麼不只是'... do(ren %%〜fI「」%%〜nI.bak「|| echo Renaming %%〜nxI failed)''或類似的?可能相關的,你可能會發現[prename.bat](https://stackoverflow.com/a/38191137/1683264)對批量重命名很有用。 – rojo

回答

3

作爲Ken White指出了關於這個問題的評論,通過cmd.exeren命令做包括的文件名(多個)參與發射的錯誤消息。

PowerShell的,相比之下,提供詳細的錯誤消息包括文件名
看看下面的示例腳本:

# Create helper sample files. 
$tempFiles = "$env:TEMP\foo", "$env:TEMP\bar" 
$null = New-Item -Type File $tempFiles 

# Try to rename a nonexistent item. 
Rename-Item \no\such -NewName foo 

# Try to rename to a file that already exists. 
Rename-Item $env:TEMP\foo -NewName bar 

# Clean up the sample files. 
Remove-Item $tempFiles 

如果上面保存到*.ps1文件並運行它(假設你有permitted scripts to run),你會看到下面的錯誤輸出:

Rename-Item : Cannot rename because item at '\no\such' does not exist. 
At C:\Users\jdoe\Desktop\pg\pg.ps1:8 char:5 
+  Rename-Item \no\such -NewName foo 
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (:) [Rename-Item], PSInvalidOperationException 
    + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.RenameItemCommand 

Rename-Item : Cannot create a file when that file already exists. 
At C:\Users\jdoe\Desktop\pg\pg.ps1:11 char:5 
+  Rename-Item $env:TEMP\foo -NewName bar 
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : WriteError: (C:\Users\jdoe\AppData\Local\Temp\foo:String) [Rename-Item], IOException 
    + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand 

儘管輸出結果是詳細的,但它確實包含了所有相關信息,您甚至可以通過自動$Error變量以編程方式以編程方式檢查它,該變量包含會話中以反向計時方式報告的所有錯誤邏輯順序($Error[0]包含最近的最近的錯誤)。

這並不是說,在默認情況下,PowerShell腳本將繼續當這些錯誤發生跑,因爲他們被認爲非終止

  • 最簡單的方法,以使腳本中止馬上要與線$ErrorActionPreference= 'Stop'啓動腳本。

  • 或者,您可以在的每個命令的基礎上使用-ErrorAction Stop

運行Get-Help about_Preference_VariablesGet-Help about_CommonParameters瞭解更多信息。

0

如前所述,ren使用通配符不會告訴您哪個文件失敗。所以你必須分別處理每個文件。令人欣慰的是,有這樣的命令:forforfiles

for %%a in (*) do ren "%%a" "destination.ext" 2>nul || echo FAILED: %%a 

這種嘗試重命名每一個文件,以「destination.ext」,這對於第一個他們的正常工作。
重命名其餘文件將失敗(目標已存在)。
||是一個「如果以前的命令失敗,那麼」運營商。
2>nul刪除的ErrorMessage(你沒用,因爲它不會告訴你的文件名)

(注:這是對批處理文件中的語法如果直接嘗試在命令行中,
每個%%a%a取代。 )