2017-03-06 74 views
0
@echo off 
FOR /F "usebackq" %%i IN (`hostname`) DO SET HOSTNAME=%%i 

for /F %%a IN ('wmic /node:"%HOSTNAME%" share get path') DO (
IF "%%a"=="C:\windows" (
    echo "Cannot remove ADMIN shared Drive" %%a 
) ELSE (
    NET SHARE %%a /DELETE 
) 

) 

endlocal 

我已經寫了這個腳本作爲Windows調度程序運行。腳本檢查共享文件夾並刪除共享文件夾。我面臨的問題是,當我運行這個單獨批處理文件找到共享文件夾並刪除共享

wmic /node:"%HOSTNAME%" share get path 

我得到:

Path 
C:\windows 
C:\ 
E:\ 
E:\someFolder 

但是當我運行該腳本,它僅刪除E:\和E:\ someFolder而不是C :. 我寫了條件不刪除C:\窗口,但爲什麼它跳過C :. 請幫忙。

UPDATE 其實我剛剛看到它沒有刪除任何C:/驅動器文件夾的共享?這是一個許可問題嗎?

回答

0

讓我舉一個例子份額與odds and ends兩個共享名和資源路徑中有空格:

==> net share | findstr /I "Resource --- odds \$" 
Share name Resource      Remark 
------------------------------------------------------------------------------- 
ADMIN$  C:\Windows      Remote Admin 
C$   C:\        Default share 
D$   D:\        Default share 
IPC$           Remote IPC 
print$  C:\Windows\system32\spool\drivers 
odds and ends 
      D:\bat\odds and ends 

==> 

下面的腳本在腳本的一些錯誤(評論和ECHO小號解釋居多)。也Dave Benham's WMIC and FOR /F: A fix for the trailing <CR> problem

@ECHO OFF 
SETLOCAL EnableExtensions 

FOR /F "usebackq" %%i IN (`hostname`) DO SET HOSTNAME=%%i 

set "_narrow="       your setting - get all 
set "_narrow=^| find /I "odds""  setting to narrow output - delete this line 

echo(
echo --- ORIGINAL APPROACH: does not respect spaces in path --- 
for /F %%a IN ('wmic /node:"%HOSTNAME%" share get path %_narrow%') DO echo [%%~a] 

echo(
echo --- UPDATED: respects spaces in path but does not respect wmic behaviour --- 
for /F "delims=" %%a IN ('wmic /node:"%HOSTNAME%" share get path %_narrow%') DO (
    echo [%%~a]) 

echo(
echo --- UPDATED: DBenham's solution preserves unwanted trailing spaces --- 
for /F "delims=" %%a IN ('wmic /node:"%HOSTNAME%" share get path %_narrow%') DO (
    for /F "delims=" %%A in ("%%~a") do echo [%%~A] 
) 

echo(
echo --- WORKING SCRIPT --- 
for /F "tokens=1,* delims==" %%a IN (' 
    wmic /node:"%HOSTNAME%" share get path /value %_narrow% 
') do for /F "delims=" %%A in ("%%~b") do (
    IF /I "%%~A"=="C:\windows" (
     echo "Cannot remove ADMIN shared Drive" [%%A] 
    ) ELSE (
     rem next NET SHARE command is merely ECHOed for debugging purposes 
     ECHO NET SHARE "%%~A" /DELETE 
    ) 
) 

輸出參見:

==> D:\bat\SO\42617143.bat 

--- ORIGINAL APPROACH: does not respect spaces in path --- 
[D:\bat\odds] 

--- UPDATED: respects spaces in path but does not respect wmic behaviour --- 
]D:\bat\odds and ends 

--- UPDATED: DBenham's solution preserves unwanted trailing spaces --- 
[D:\bat\odds and ends     ] 

--- WORKING SCRIPT --- 
NET SHARE "D:\bat\odds and ends" /DELETE 

==> 

回答。然而,NET命令需要提升成功地執行某些操作:

==> NET SHARE "D:\bat\odds and ends" /DELETE 
System error 5 has occurred. 

Access is denied. 


==> 
+0

感謝您的解釋。是的,但是即使如此,在進行了一些更改之後,FOR/F「usebackq」%% i IN('hostname')DO SET HOSTNAME = %% i FOR/F %% a IN('wmic/node:「 %HOSTNAME%「share get name')如果我將它保存在C:/中,並使用具有最高管理員權限的Windows調度程序運行,則DO(echo %% a \t NET SHARE %% a/Y/DELETE )endlocal。 –

+0

是的,獲得'name'而不是'path'似乎是一個好主意,但是繼續使用雙引號(在安全方面):'NET SHARE「%%〜a」/ Y/DELETE' – JosefZ