2015-02-05 240 views
1

我在變量(腳本參數)%2中有一個路徑。 我需要執行以下操作:在Windows批處理文件中使用PowerShell命令的輸出

  1. 將葉子(從路徑中的最後一個文件夾)提取到變量。
  2. 運行以下命令:robocopy %2 \\somepath\%leaf

有人告訴我,這可能會在PowerShell中進行(因爲我已經試過單獨批處理文件去和悲慘地失敗了)這裏是想什麼,我一個僞代碼表示,以實現:

set leaf = powershell -command (split-path %2 -leaf) 
robocopy %2 \\somepath\%leaf 

任何想法如何正確寫入? 謝謝。

+0

你能給我一些假文件夾名稱的例子嗎?我在使用%2後很難跟蹤您。批處理腳本並不是我的強項,而PowerShell則是。 – FoxDeploy 2015-02-05 14:41:29

+0

對不起,但這對我沒用。就像你一樣,我可以在PowerShell中編寫代碼,而不是批處理。我需要編寫批處理命令,以便它可以在批處理腳本中使用%2和全部文件。 – Shaggydog 2015-02-05 14:53:13

+0

您無法從PowerShell中運行robocopy的任何原因。理論上你可以使用批量FOR語句從powershell獲得輸出,但爲什麼?例如$ leaf =(split-path%2 -leaf); robocopy%2 \ somepath \ $葉 – 2015-02-05 14:55:55

回答

2

無論何時想要將某個批處理變量設置爲某個命令的輸出時,請使用for /f。這裏有一個例子:

@echo off 
setlocal 

set "psCommand=powershell -command "(split-path '%~2' -leaf)"" 
for /f "delims=" %%I in ('%psCommand%') do set "leaf=%%I" 

echo %leaf% 

但是,這是一個極其低效的方式來檢索路徑的最後一個文件夾。而是調用PowerShell中,你應該做的是這樣的:

@echo off 
setlocal 

for %%I in ("%~2") do set "leaf=%%~nxI" 

echo %leaf% 

%%~dpnxI符號得到

  • d =驅動
  • P =路徑
  • N =名稱
  • X =分機號

它通常用於文件,而不是目錄;但它無論如何也適用於目錄。在控制檯窗口中查看for /?的最後幾頁,獲取完整的詳細信息。

+0

謝謝,這終於奏效了(第二個選項)。我不知道它如何或爲什麼起作用,而且我一直在爲此奮鬥幾個小時。另外,在你的第一個例子中,爲什麼robocopy是powershell命令的一部分? – Shaggydog 2015-02-05 15:02:40

+0

@Shaggydog你的問題最初是由'robocopy'格式化的,與'split-path'在同一行。我沒有足夠關注這是否是有效的PowerShell-ese。編輯。 – rojo 2015-02-05 15:04:11

0
FOR %%a IN ("%~2") DO FOR %%b IN ("%%~dpa.") DO ECHO %%~nxb 

批量單線。取參數(第二個參數在這裏),刪除任何引號並重新應用它們。選擇驅動器和路徑,添加'。'然後選擇需要葉子的結果的名稱和擴展名。

顯然,如果你需要這一個變量,

FOR %%a IN ("%~2") DO FOR %%b IN ("%%~dpa.") DO set "leaf=%%~nxb" 
相關問題