2013-06-24 131 views
3

我需要幫助返回位於文件夾中的文件的文件名。如何獲取文件夾中圖標文件的文件名以創建/更新文件夾的desktop.ini文件?

我看過其他問題問了幾次,答案似乎是:

for /d %F in (*.*) do echo %~nxF 

儘管這似乎是其他人的工作,當我運行這個批處理文件中有一個例外,美國那'〜nxF'目前預計不會。

我想要做的是創建一個批處理文件,它將讀取圖標文件名,然後將具體信息輸入到desktop.ini,最後創建具有相應權限或屬性的文件。

@echo off 

set NAME=%~dp0 
for %%* in (.) do set NAME=%%~n* 

set FOLDERICO=%NAME% 
set ICONSIZES=16 24 32 48 64 128 256 
set FOLDERINI=Desktop.ini 

attrib +s "%CD%" 

if exist %FOLDERINI% attrib -s -h %FOLDERINI% 

echo [.ShellClassInfo] > %FOLDERINI% 
echo IconResource=\[Video]\[HD Films]\%FOLDERICO%\Icon\%FOLDERICO%.ico,0 >> %FOLDERINI% 

if not "%2"=="" (
    echo FolderType=%2 >> %FOLDERINI% 
) 
attrib -a +s +h %FOLDERINI% 

我認爲代碼可以改進某種方式從根目錄運行它,而不是特定的文件夾。

編輯:更新了我的文件,所以現在看起來是這樣的:

@ECHO OFF 

attrib +s "%CD%" 
set ICODIR=%CD%\Icon\ 

for %%F in ("%ICODIR%"*.ico) do set ICO=%%~nxF 
echo %ICO% 

set ICOINI=Desktop.ini 
if exist %ICOINI% attrib -s -h %ICOINI% 

echo [.ShellClassInfo] > %ICOINI% 
echo IconResource=%ICODIR:~2%%ICO%,0 >> %ICOINI% 

if not "%2"=="" (
    echo FolderType=%2 >> %ICOINI% 
) 

attrib -a +s +h %ICOINI% 

Pause 

,我需要到根的每個子目錄放入for循環掃描。

+5

將'for'命令放在批處理文件中時,必須使用雙%''%''符號而不是單個百分號'%'。另外,'/ d'只用於目錄。 (*。*)中的%% F做echo echo %%〜nxF'請參閱[For /?](http://technet.microsoft.com/en-us/library/bb490909.aspx) –

+0

謝謝,我認爲這是我需要的答案。我儘可能地參考文本和手冊,但他們比我們經常幫助的更困惑我。 –

+0

你有這個工作嗎? vbscript可以接受嗎? –

回答

1

下面是在電流驅動的根創建或更新的desktop.ini對於文件夾圖標和任選地也爲摺疊型爲任何一個指定的文件夾或所有文件夾一個完全註釋批次代碼(或當前目錄刪除/評論一條線)。

創建一個desktop.ini非常簡單,因爲它可以通過查看代碼來看到。如果僅使用命令行解釋器中定義的標準Windows命令,則更新現有的INI文件以替換行或在必要時將其添加到正確的部分會更困難。

@echo off 

rem CreateDesktopIni.bat [FolderName | FolderType] [FolderType] 

rem This batch file can be started without any parameter to create or 
rem update desktop.ini for all subfolders in root of current drive or 
rem current working directory with removing or commenting one line in 
rem code below, see comment below label AllFolders. 

rem But the batch file can be also started with a folder name 
rem to create or update file desktop.ini of this folder only. 

rem Optionally it is possible to specify as only parameter a folder type 
rem or append as second parameter after folder name the folder type. 

rem The folder type can be one of the following strings (not verified): 

rem CommonDocuments, Contacts, Documents, Music, MusicAlbum, MusicArtist, 
rem MusicIcons, MyDocuments, MyMusic, MyPictures, MyVideos, PhotoAlbum, 
rem Pictures, UseLegacyHTT, VideoAlbum, Videos 

setlocal EnableDelayedExpansion 
set "FolderType=%~2" 

rem Define the subfolder containing the icon for the folder. 
set "IconFolder=Icon" 

rem Is the batch file called with at least one parameter? 
if "%~1"=="" goto AllFolders 

rem Yes! It could be a folder name or the folder type. 
if not exist "%~1" set "FolderType=%~1" & goto AllFolders 

rem First parameter specifies a folder. 
set "Folder=%~1" 
rem Remove trailing backslash if there is one. 
if "%Folder:~-1%"=="\" set "Folder=%Folder:~0,-1%" 

rem Call subroutine to create or update the desktop file for this folder. 
call :DesktopINI "%Folder%" 
goto EndBatch 

:AllFolders 
rem Change working directory to root of current drive. Remove or comment 
rem the next line to process instead all subfolders in current directory. 
cd \ 
rem Call subroutine to create/update the desktop file for each subfolder. 
for /F "delims=" %%F in ('dir /AD /B') do call :DesktopINI "%%F" 

:EndBatch 
endlocal 
goto :EOF 


rem Subroutine to create or update the desktop file for a folder. 

rem This subroutine first searches for the icon file and does nothing 
rem if no icon file could be found in the defined subfolder because 
rem the subfolder does not exist at all or there is no *.ico file. 

rem After determining the icon file (first found *.ico file) with full path 
rem including drive letter (remove character d for relative path without 
rem drive letter in line with %%~dpnxI), this subroutine checks next for 
rem existence of file desktop.ini (case-insensitive) in current folder. 

rem desktop.ini with the 2 or 3 lines is simply created if this file does 
rem not already exist and the user of the batch file has permissions to 
rem create this file in the current folder. 

rem For an already existing desktop.ini the necessary process to update it 
rem is much more complex. All lines outside the section [.ShellClassInfo] 
rem must be kept and are therefore just copied to a temporary file. Also 
rem all lines within section [.ShellClassInfo] not starting with the string 
rem IconFile= or optionally FolderType= (both case-insensitive) must be 
rem also simply kept by copying them to the temporary file. 

rem An existing line starting with IconFile= in section [.ShellClassInfo] 
rem is not copied to temporary file, but instead this line is written to 
rem the temporary file with determined icon file name with path. 

rem An existing line starting with FolderType= in section [.ShellClassInfo] 
rem is also not copied to temporary file, but instead this line is written 
rem to the temporary file with folder type as specified on starting batch. 

rem If section [.ShellClassInfo] was found and beginning of a new section is 
rem detected because of a line starting with an opening square bracket and 
rem the line with IconFile= and/or the line with FolderType= was not found 
rem in this section during processing the existing desktop.ini, the lines 
rem are written next to temporary file to insert them before continuing 
rem with the next section. 

rem Finally it could happen that section [.ShellClassInfo] is missing in 
rem existing desktop.ini and must be therefore added to the file. And it 
rem could be that this section exists at end of desktop.ini, but either 
rem the line with IconFile= or with FolderType= or both are missing and 
rem those lines must be therefore appended to the file. 

rem The temporary file is next copied over the existing desktop.ini and 
rem then deleted as not further needed. Finally the system and hidden 
rem attributes are set on file desktop.ini and the system attribute is 
rem set on the current folder as otherwise desktop.ini would be ignored. 

:DesktopINI 
set "Folder=%~1" 

for %%I in ("%Folder%\%IconFolder%\*.ico") do (
    set "IconFile=%%~dpnxI" 
    goto IconFound 
) 
goto :EOF 

:IconFound 
set "DesktopFile=%Folder%\desktop.ini" 

if not exist "%DesktopFile%" (

    echo [.ShellClassInfo]>"%DesktopFile%" 
    if not exist "%DesktopFile%" goto :EOF 
    echo Iconfile=%IconFile%>>"%DesktopFile%" 
    if not "%FolderType%"=="" echo FolderType=%FolderType%>>"%DesktopFile%" 

) else (

    set "IconLine=0" 
    set "ShellClassInfo=0" 
    set "TempFile=%TEMP%\Desktop.tmp" 
    if "%FolderType%"=="" (set "TypeLine=1") else (set "TypeLine=0") 
    if exist "!TempFile!" del /F "!TempFile!" 
    %SystemRoot%\System32\attrib.exe -h -s "%DesktopFile%" 

    for /F "usebackq delims=" %%L in ("%DesktopFile%") do (

     set "Line=%%L" 
     if "!ShellClassInfo!"=="1" (

      if /I "!Line:~0,9!"=="IconFile=" (
       echo Iconfile=%IconFile%>>"!TempFile!" 
       set "IconLine=1" 
       set "Line=" 
      ) else if /I "!Line:~0,11!"=="FolderType=" (
       if not "%FolderType%"=="" (
        echo FolderType=%FolderType%>>"!TempFile!" 
        set "TypeLine=1" 
        set "Line=" 
       ) 
      ) else if "!Line:~0,1!"=="[" (
       if "!IconLine!"=="0" echo Iconfile=%IconFile%>>"!TempFile!" 
       if "!TypeLine!"=="0" echo FolderType=%FolderType%>>"!TempFile!" 
       set "ShellClassInfo=2" 
      ) 

     ) else if /I "!Line!"=="[.ShellClassInfo]" (
      echo [.ShellClassInfo]>>"!TempFile!" 
      set "ShellClassInfo=1" 
      set "Line=" 
     ) 
     if not "!Line!"=="" echo !Line!>>"!TempFile!" 
    ) 

    if "!ShellClassInfo!"=="0" (
     echo [.ShellClassInfo]>>"!TempFile!" 
     set "ShellClassInfo=1" 
    ) 

    if "!ShellClassInfo!"=="1" (
     if "!IconLine!"=="0" echo Iconfile=%IconFile%>>"!TempFile!" 
     if "!TypeLine!"=="0" echo FolderType=%FolderType%>>"!TempFile!" 
    ) 

    copy /Y "!TempFile!" "%DesktopFile%">nul 
    del "!TempFile!" 
) 

%SystemRoot%\System32\attrib.exe +h +s "%DesktopFile%" 
%SystemRoot%\System32\attrib.exe +s "%Folder%" 
goto :EOF 
相關問題