Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file For loop-注意文件列表中的目录更改_Batch File - Fatal编程技术网

Batch file For loop-注意文件列表中的目录更改

Batch file For loop-注意文件列表中的目录更改,batch-file,Batch File,我有一个mytextfile.txt文件,其中包含我要处理的文件列表 列表如下所示: 我的代码: 这将输出到缓冲器: 鉴于这是期望的输出: 请注意目录是如何只输出一次的。以下技术只是将父目录名称保存为变量,然后对照上一个值进行检查,以确定是否响应它: @SetLocal DisableDelayedExpansion @对于%%G In(PDir PPDir)Do@Set“%%G=” @对于/F“Delims=“%%G In(”“”“%%\uuuuu AppDir\uuuuu%Sort.exe”

我有一个
mytextfile.txt
文件,其中包含我要处理的文件列表

列表如下所示: 我的代码: 这将输出到缓冲器: 鉴于这是期望的输出:
请注意目录是如何只输出一次的。

以下技术只是将父目录名称保存为变量,然后对照上一个值进行检查,以确定是否响应它:

@SetLocal DisableDelayedExpansion
@对于%%G In(PDir PPDir)Do@Set“%%G=”
@对于/F“Delims=“%%G In(”“”“%%\uuuuu AppDir\uuuuu%Sort.exe”“mytextfile.txt”2>NUL”
)Do@(设置“PDir=%%~dpG”
SetLocal EnableDelayedExpansion
如果/I不是“!PPDir!”==”!PDir!”回显目录-“!PDir:~,-1!”
端部
回显文件名-“%%~nG”
设置“PPDir=%%~dpG”)
@停顿
@端部
这是未经测试的,但我希望其输出如下所示:

目录-“Z:\文件夹1”
文件名-“文件名01”
文件名-“文件名02”
目录-“Z:\Folder 2”
文件名-“文件名01”
文件名-“文件名02”
文件名-“文件名03”
目录-“Z:\文件夹3”
文件名-“文件名01”
您会注意到,我使用了
sort
来首先确保文本文件中任何位置的路径重复都一起返回

如果您不想使用
排序
,那么这就足够了:

@Echo关闭
标题从文件列表输出目录及其文件
彩色5F
SetLocal DisableDelayedExpansion
设置“ITF=%Temp%\music checker list.txt”
对于/F“令牌=*”%%G In('ChCp')Do For%%H In(%%G)Do设置“CCp=%%~nH”
如果不是%CCp%Equ 65001 ChCp 65001>NUL
对于%%G In(PDir PPDir)Do@Set“%%G=”
对于/F“UseBackDelims=“%%G In(“%ITF%”)”Do(设置“PDir=%%~dpG”
设置“NFile=%%~G”
SetLocal EnableDelayedExpansion
如果/I不是“!PPDir!”==”!PDir!”回显目录-“!PDir:~,-1!”
调用:处理_文件“!NFile!”
端部
设置“PPDir=%%~dpG”)
暂停
后藤:EOF
:处理文件
回显完整文件名-%1
退出/B

上面的答案已经过调整,以便您自己提供的答案中修改后的姓名列表及其后续编辑部分代码能够正确处理符号和百分比字符。

根据@Compo的答案,我决定:

@echo off&title示例浏览文件和echo的列表,然后是目录文件…&颜色5F&chcp 65001>NUL
setlocal EnableDelayedExpansion
设置“文件列表=%temp%\file list.txt”
对于(!fileList!)中的/f“usebackq令牌=*”%%D,请执行以下操作(
设置“dirBase=%%~dpD”
setlocal EnableDelayedExpansion
如果/i不是“!dirNext!”==”!dirBase!”回显目录-“!dirBase:~,-1!”
端部
回显文件名-“%%~nD”
设置“dirNext=%%~dpD”
)

编辑 为了调用另一个函数。。。 任何
%
符号都需要加倍才能发生这种情况

以这个
文件列表.txt
文件为例:

“Z:\Folder 100%\filename 01.doc”
“Z:\Folder 100%\filename 02.doc”
“Z:\Folder 100%\filename 01.doc”
“Z:\Folder 100%\filename 02.doc”
“Z:\Folder 100%\filename 03.doc”
“Z:\Folder 100%\filename 01.doc”
“Z:\Folder&100%\filename 01.doc”
“Z:\Folder&100%\filename 02.doc”
“Z:\Folder&100%\filename 01.doc”
“Z:\Folder&100%\filename 02.doc”
“Z:\Folder&100%\filename 03.doc”
“Z:\Folder&100%\filename 01.doc”
“Z:\Folder&90%\filename 01.doc”
顶部代码将失败,因为将跳过
%

下面的代码通过将任何字符加倍来修复该问题

@echo off&title示例浏览文件和echo的列表,然后是目录文件…&颜色5F&chcp 65001>NUL
setlocal EnableDelayedExpansion
::其他代码在这里
rem集合“fname=%%~D”
rem这一行将处理文本文件中具有
rem通过将符号加倍以使其消失,从而使符号进入。
:通过\u文本文件的\u行\u循环\u
设置“文件列表=%Temp%\music checker list.txt”
对于(!fileList!)中的/f“usebackq令牌=*”%%D,请执行以下操作(
设置“dirBase=%%~dpD”
setlocal EnableDelayedExpansion
如果/i不是“!dirNext!”==”!dirBase!”回显目录-“!dirBase:~,-1!”
端部
设置“fname=%%~D”&&setlocal enabledelayedexpansion&&set“nname=!fname:%%=%%!”
调用:处理_文件“!nname!”
设置“dirNext=%%~dpD”
)
后藤:EOF
:处理文件
回显完整文件名-“%~f1”
后藤:EOF

我已经修改了示例。谢谢你让我知道。我现在来测试一下。谢谢,谢谢。就这样。我需要
setlocalenabledelayedexpansion
然后检查目录,然后再次
EndLocal
。再次感谢。我将添加我已确定的答案,作为没有排序位的答案。这如何处理调用函数在包含
%
的文件上运行的问题?如果我将
call:PROCESS\u FILES“%%~D”
替换为
Echo Filename-“%%~nG”
,则会失败。使用
PROCESS_文件
只需将
echo“%~1”和&goto:EOF
视为其他人可能会遇到此问题。我已经在下面的答案版本中添加了修复程序。您编辑的答案中的示例与上面的问题不同,它只显示带有符号和百分比字符的目录,而不是文件名。我已经删除了我以前的评论,因此不再相关。我还修改了上面答案中的最后一个示例代码,以处理符号和百分比字符。您删除了确保使用的变量不是预定义的代码。此外,您在一开始就设置了延迟扩展,我没有这样做是为了保护文件名内容中的任何潜在感叹号。我已经更新了我的初始答案,包括不明智的(基于提供的信息)非
排序方法。好的,谢谢。只是我在一个修改过的列表上尝试了这个方法,它使用了旧的变量,我的变量每次运行时都会读取文件的内容。
"Z:\Folder 1\filename 01.doc"
"Z:\Folder 1\filename 02.doc"
"Z:\Folder 2\filename 01.doc"
"Z:\Folder 2\filename 02.doc"
"Z:\Folder 2\filename 03.doc"
"Z:\Folder 3\filename 01.doc"
for /f "usebackq tokens=*" %%D in (mytextfile.txt) do (
 :: I only want to echo the directory every time it comes across a different one.
 echo Directory - "%%~dpD"
 :: Here is fine, I want to process the files now in the code below.
 echo Filename  - "%%~nD"
 )
Directory - "Z:\Folder 1\"
Filename  - "filename 01"
Directory - "Z:\Folder 1\"
Filename  - "filename 02"
Directory - "Z:\Folder 2\"
Filename  - "filename 01"
Directory - "Z:\Folder 2\"
Filename  - "filename 02"
Directory - "Z:\Folder 2\"
Filename  - "filename 03"
Directory - "Z:\Folder 3\"
Filename  - "filename 01"
Directory - "Z:\Folder 1\"
Filename  - "filename 01"
Filename  - "filename 02"
Directory - "Z:\Folder 2\"
Filename  - "filename 01"
Filename  - "filename 02"
Filename  - "filename 03"
Directory - "Z:\Folder 3\"
Filename  - "filename 01"