मैंने एक छोटी बैच स्क्रिप्ट लिखना समाप्त कर दिया है जो डाउनलोड फ़ोल्डर में किसी भी ज़िप की गई फ़ाइलों को स्वचालित रूप से अनज़िप और हटा देगा।

मैं पूरी तरह से काम करता हूं सिवाय जब उनके नाम पर एक स्थान वाली ज़िप फ़ाइलों के साथ प्रस्तुत किया जाता है।

मैं निश्चित रूप से नहीं कह सकता कि समस्या कहाँ है इसलिए मैं पूरी स्क्रिप्ट यहाँ रखूँगा क्योंकि यह काफी छोटी है।

@echo off
setlocal
cd C:\Users\%username%\Downloads\
del /q search_result.txt


for /r %%i in (*.zip) do (
echo %%~nxi >> search_result.txt
)
for /f %%i in ("search_result.txt") do set asdf=%%~zi
if %asdf% gtr 0 (
goto unzipAgain
)
end
:unzipAgain
set /p zippedFile=< search_result.txt

Call :UnZipFile "C:\Users\%username%\Downloads\%zippedFile:~0,-4%" "C:\Users\%username%\Downloads\%zippedFile%"
exit /b

:UnZipFile <ExtractTo> <newzipfile>
cd /d %~dp0
set vbs="%temp%\_.vbs"
if exist %vbs% del /f /q %vbs%
>%vbs%  echo Set fso = CreateObject("Scripting.FileSystemObject")
>>%vbs% echo If NOT fso.FolderExists(%1) Then
>>%vbs% echo fso.CreateFolder(%1)
>>%vbs% echo End If
>>%vbs% echo set objShell = CreateObject("Shell.Application")
>>%vbs% echo set FilesInZip=objShell.NameSpace(%2).items
>>%vbs% echo objShell.NameSpace(%1).CopyHere(FilesInZip)
>>%vbs% echo Set fso = Nothing
>>%vbs% echo Set objShell = Nothing
cscript //nologo %vbs%
if exist %vbs% del /f /q %vbs%

del C:\Users\%username%\Downloads\%zippedFile%
cd C:\Users\%username%\Downloads\
findstr /V %zippedFile% search_result.txt > newfile.txt
xcopy newfile.txt search_result.txt /y >nul
del newfile.txt /f /q >nul

for /f %%i in ("search_result.txt") do set asdf=%%~zi
if %asdf% gtr 0 (
goto unzipAgain
)

del search_result.txt 

टीआईए, एविनो

n.b VBScript मेरा नहीं है और मुझे नहीं पता कि यह कैसे काम करता है, मैंने बस इसे अपने कोड के साथ संयोजन में इस्तेमाल किया

0
Edje Monkeys 26 अक्टूबर 2018, 04:07

1 उत्तर

सबसे बढ़िया उत्तर

आपके साथ ईमानदार होने के लिए, मैं अपने बेतहाशा सपनों में नहीं कह सकता कि मैंने जो किया वह कोड करने की कोशिश करूंगा। आपने सचमुच मोल पहाड़ी से पहाड़ बनाया है। आप संभवतः इसे अपने आप पर अधिक कठिन नहीं बना सकते थे। मुझे लगता है कि एक बार जब आप इन तीन कोड उदाहरणों को देखेंगे तो आपको एहसास होगा कि आपको K.I.S.S का पालन क्यों करना चाहिए। सिद्धांत।

आपके पास Vbscript कोड रिक्त स्थान के साथ बिल्कुल ठीक काम करता है। यह शायद आपके बैच फ़ाइल कोड में कुछ ऐसा था जो कुछ खराब कर रहा था। आप एक एकल FOR कमांड का उपयोग करके अपने कोड को बहुत सरल बना सकते हैं और केवल एक बार Vbscript बना सकते हैं। मैंने कमांड लाइन तर्क स्वीकार करने के लिए वीबीस्क्रिप्ट को बदल दिया।

@echo off
set "source=C:\Batch\unzip"
CD /D "%source%"
call :createVBS "unzip.vbs"

FOR %%G IN (*.zip) DO (
    cscript //nologo "%vbs%" "%source%\%%~nG" "%source%\%%~G"
    del "%%~G"
)
del "%vbs%" 2>nul
exit /b

:CreateVBS
set "vbs=%~1"
del "%vbs%" 2>nul
>%vbs%  echo Set fso = CreateObject("Scripting.FileSystemObject")
>>%vbs% echo Set objArgs = WScript.Arguments
>>%vbs% echo If NOT fso.FolderExists(objArgs(0)) Then
>>%vbs% echo fso.CreateFolder(objArgs(0))
>>%vbs% echo End If
>>%vbs% echo set objShell = CreateObject("Shell.Application")
>>%vbs% echo set FilesInZip=objShell.NameSpace(objArgs(1)).items
>>%vbs% echo objShell.NameSpace(objArgs(0)).CopyHere(FilesInZip)
>>%vbs% echo Set fso = Nothing
>>%vbs% echo Set objShell = Nothing

Powershell लगभग 10 साल या उससे भी ज्यादा समय से बाहर है। तब से Powershell के भीतर फ़ाइलों को अनज़िप करने के कुछ तरीके हैं। यह पहला संस्करण काम करेगा यदि आप संस्करण 5 से पहले पॉवर्सशेल के एक संस्करण पर हैं।

@echo off
set "source=C:\Batch\unzip"
CD /D "%source%"

for %%G in (*.zip) do (
    powershell -command "Add-Type -AssemblyName System.IO.Compression.FileSystem;[System.IO.Compression.ZipFile]::ExtractToDirectory('%%~G', '.\%%~nG')"
    del "%%~G"
)

पॉवर्सशेल के संस्करण 5 में एक नए cmdlet के साथ कोड को बहुत सरल बनाया गया था।

@echo off
set "source=C:\Batch\unzip"
CD /D "%source%"

for %%G in (*.zip) do (
    powershell Expand-Archive '%%~G' -DestinationPath '.\%%~nG'
    del "%%~G"
)

तो आप देख सकते हैं कि Powershell को कॉल करने से आपकी बैच फ़ाइल में आपके लिए आवश्यक कोड की मात्रा बहुत कम हो गई है।

1
Squashman 26 अक्टूबर 2018, 07:28