2017-04-12 26 views
3

我試圖用PowerShell腳本的一些文件重命名下面Powershell的管道在字符串

powershell.exe "& { Get-ChildItem *.txt | Rename-Item -NewName { $_.name -Replace '.txt','.csv' } }" 

$_.name似乎執行"& command"時被解析,所以它抱怨不知道.name(帶$_已被刪除)。在沒有外部字符串的情況下執行它可以解決問題,但由於其他原因在我的情況下不可行。

如何逃生$_.name

+0

你是從PowerShell的運行呢?如果是這樣,你不需要'powershell「&{...}」包裝器。只需直接運行命令。否則'$ _'不應該展開。 –

+0

嘗試在外部字符串和雙引號內使用單引號? –

+2

你是如何運行這個命令的?使用PSv5時,它的工作原理與我在CMD中執行時一樣... –

回答

2

這工作完全正常:

powershell.exe "& { Get-ChildItem *.txt | Rename-Item -NewName { `$_.name -Replace '.txt','.csv' } }" 
+0

對於我來說,這個錯誤與「Rename-Item:參數'NewName'的腳本塊的輸入失敗。'$ _。name'不會被識別爲現在使用baktik轉義的cmdlet」 –

+0

「的名稱。 .. –

+0

如果你想截圖,我可以發佈它 –

-1
powershell.exe "& { 
    Get-ChildItem -Filter *.txt | ForEach-Object {`$_.Name} 
}" 

反引號特殊字符轉義在PowerShell中的字符串

` 
+0

你已經排除了'Rename-Item'命令,這是OPs代碼的關鍵部分。 –

+0

@JamesC。我選擇發佈了一些代碼,這些代碼對於未開始運行的應用程序來說是非常有害的。 – gvee

0

我看不出什麼毛病你原來的命令,但我個人會用Path.ChangeExtension方法代替-replace

powershell.exe -command "& {Get-ChildItem *.txt | Rename-Item -NewName { [io.path]::ChangeExtension($_.name, 'csv') }}" 

或者你似乎從從命令行調用PowerShell中,你可以只使用「重命名」命令來代替(而不是使用PowerShell在所有):

ren *.txt *.csv