Я пытаюсь написать этот аккуратный кусочек кода и у меня возникают серьезные проблемы с последним кусочком. Таким образом, предполагалось написать код, который вошел бы во все ZIP-файлы в папке, находил папку в каждом по имени, заходил внутрь, находил файл, заканчивающийся на «_nl.inp», и копировал его вне архива.
Пока я искал идеи для VBA, я мог только найти, как разархивировать весь архив, а не просто определить файл и вытащить меня. Но мне удалось найти, как это сделать на языке powershell. Поэтому я написал сценарий powershell, который прекрасно работает. Этот скрипт ниже.
$zZipFileName = "C:\Users\ccapsun2\Desktop\New loads formatting\load decks"
$shap = new-object -com shell.application
$folderitems = get-childitem $zZipFileName
foreach($archive in $folderitems){
$archive.name.substring(0,$archive.name.length -4)
$zipFile = $shap.Namespace($archive.fullname)
$i = $zipFile.items()
foreach($si in $i){
if($si.getfolder -ne $null){
if($si.name -eq "LR_Front_Upper_Control_Arm"){
$fileSearch = $si.getfolder.Items()
foreach($sii in $fileSearch){
if ($sii.name.substring(($sii.name.length - 7),7) -eq "_nl.inp"){
$shap.namespace($zZipFileName).copyhere($sii)
rename-item ($zZipFileName + "\" + $sii.name) -newname ($archive.name.substring(0,$archive.name.length -4) + ".inp")
}
}
}
}
}
}
Теперь этот скрипт работает нормально, но мне нужно передать ему переменную, которая присваивается $ zZipFileName, и строку «LR_Front_Upper_Control_Arm» из моего кода VBA, и я также хочу встроить этот скрипт powershell в мой код VBA, чтобы он все автономно с одним листом Excel. Это будет использоваться другими в моей команде, которые не имеют никакого понятия о программировании, и ни я, ни они не хотят тратить время на обучение их тому, что у них есть несколько файлов сценариев и тому подобное.
Я продолжу исследования самостоятельно, но надеялся получить здесь небольшую помощь. То, что я пробовал до сих пор с моим кодом VBA, это ниже
ShellVar = Shell("$zZipFileName = """ & folderPath & """" & vbNewLine & _
"$shap = new-object -com shell.application" & vbNewLine & _
"$folderitems = get-childitem $zZipFileName" & vbNewLine & _
"foreach($archive in $folderitems){" & vbNewLine & _
"$archive.name.substring(0,$archive.name.length -4)" & vbNewLine & _
"$zipFile = $shap.Namespace($archive.fullname)" & vbNewLine & _
"$i = $zipFile.items()" & vbNewLine & _
"foreach($si in $i){" & vbNewLine & _
"if($si.getfolder -ne $null){" & vbNewLine & _
"if($si.name -eq """ & targetFolderName & """){" & vbNewLine & _
"$fileSearch = $si.getfolder.Items()" & vbNewLine & _
"foreach($sii in $fileSearch){" & vbNewLine & _
"if ($sii.name.substring(($sii.name.length - 7),7) -eq ""_nl.inp""){" & vbNewLine & _
"$shap.namespace($zZipFileName).copyhere($sii)" & vbNewLine & _
"rename-item ($zZipFileName + ""\"" + $sii.name) -newname ($archive.name.substring(0,$archive.name.length -4) + "".inp"")" & vbNewLine & _
"}" & vbNewLine & _
"}" & vbNewLine & _
"}" & vbNewLine & _
"}" & vbNewLine & _
"}" & vbNewLine & _
"}", vbHide)
Чтобы попытаться понять, как это работает, нужно немного меньше напугать и получить подсказку, что сначала нужно перевести окно cmd в режим powershell. Я попробовал эту маленькую команду:
Shell "powershell && new-item 'C:\Users\ccapsun2\Desktop\New loads formatting\load decks\LR_Front_Upper_Control_Arm' -itemtype directory", vbNormalFocus
старый добрый интернет, предполагающий, что использование && заставит окно cmd последовательно запускать команды, но опять же, это не сработало.
Я также попробовал предложение по ссылке ниже , но также безуспешно.
Я делаю медленный прогресс за счет разочарования уже около 3 дней. Любая помощь приветствуется. У меня, вероятно, будет психическое расстройство и я скоро заплачу, ха-ха.